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.