Injecting current Git repositoryΒΆ
It is possible to pack current Git repository and use created archive as a package. Such scenario is common for the projects with usage example code.
For instance we have project fruits:
> git clone https://github.com/cgold-examples/fruits
> cd fruits
[fruits]>
There is top level CMakeLists.txt:
[fruits]> grep '^project' CMakeLists.txt
project(fruits VERSION 1.0.0)
And subdirectory example that can be used as a stand-alone project:
[fruits]> grep 'add_subdirectory(example)' CMakeLists.txt
add_subdirectory(example)
[fruits]> grep '^project' example/CMakeLists.txt
project(fruits-example)
If you start building from top you can build fruits and fruits-example
as a one big monolithic project:
[fruits]> cmake -H. -B_builds -DHUNTER_STATUS_DEBUG=ON
[fruits]> cmake --build _builds
Scanning dependencies of target fruits_rosaceae
...
Scanning dependencies of target fruits_quick_meal
[ 95%] Building CXX object example/fruits/quick_meal/CMakeFiles/fruits_quick_meal.dir/main.cpp.o
[100%] Linking CXX executable fruits_quick_meal
[100%] Built target fruits_quick_meal
However you can build fruits-example as a stand-alone project. In this
case fruits will be packed on the fly and installed as a Hunter package:
[fruits]> rm -rf _builds
[fruits]> cd example
[fruits/example]> cmake -H. -B_builds -DHUNTER_STATUS_DEBUG=ON
...
-- [hunter *** DEBUG *** ...] Creating archive '/.../fruits/example/_builds/_3rdParty/Hunter/git-archives/fruits.tar'
...
-- [hunter] Building fruits
...
Install the project...
/.../bin/cmake -P cmake_install.cmake
-- Install configuration: "Release"
-- Installing: /.../.hunter/_Base/19e4a2f/489ecc6/e734c3e/Build/fruits/Install/include/fruits/fruits.hpp
-- Installing: /.../.hunter/_Base/19e4a2f/489ecc6/e734c3e/Build/fruits/Install/include/fruits/rosaceae/Plum.hpp
-- Installing: /.../.hunter/_Base/19e4a2f/489ecc6/e734c3e/Build/fruits/Install/lib/cmake/fruits/fruitsConfig.cmake
-- Installing: /.../.hunter/_Base/19e4a2f/489ecc6/e734c3e/Build/fruits/Install/lib/libfruits_rosaceae.a
...
There is no fruits libraries while building project:
[fruits/example]> cmake --build _builds
Scanning dependencies of target fruits_vegan_party
[ 25%] Building CXX object fruits/vegan_party/CMakeFiles/fruits_vegan_party.dir/main.cpp.o
[ 50%] Linking CXX executable fruits_vegan_party
[ 50%] Built target fruits_vegan_party
Scanning dependencies of target fruits_quick_meal
[ 75%] Building CXX object fruits/quick_meal/CMakeFiles/fruits_quick_meal.dir/main.cpp.o
[100%] Linking CXX executable fruits_quick_meal
[100%] Built target fruits_quick_meal
Local config.cmake file:
[fruits/example]> cat cmake/Hunter/config.cmake
hunter_config(fruits GIT_SELF)
Hint
It can be useful for testing find_package(fruits ...) functionality and
that generated fruitsConfig.cmake file is correct.
Note
Under the hood git archive command is used to pack the project, hence
if you want to test modifications you have to commit them. This is similar
to GIT_SUBMODULE feature. But unlike GIT_SUBMODULE feature not all
the dirty files will be checked. While using GIT_SELF the dirty files
inside fruits/example directory will be ignored (check log messages).
Also if you want to ignore any untracked file, you can use the
HUNTER_GIT_SELF_IGNORE_UNTRACKED
option.