Linux/OSX | Windows |
---|---|
This is a gate file to Hunter package manager.
The gate project will download the latest packages archive release, unless HUNTER_URL
and HUNTER_SHA1
are configured.
The gate project will issue hunter_add_package
to all packages specified in HUNTER_PACKAGES
list. For every package it will create a hunter_config
in which VERSION
and CMAKE_ARGS
variables will be set.
For manual configuration of the hunter_config
file you can set the HUNTER_LOCAL_CONFIG
, HUNTER_GLOBAL_CONFIG
, or HUNTER_FILEPATH_CONFIG
variables.
The gate project will set CMAKE_BUILD_TYPE
as HUNTER_CONFIGURATION_TYPES
, so that if you're building Release
you won't be getting a Debug
build of the packages.
The gate project will create a HunterToolchain.cmake
file which will set up the CMAKE_PREFIX_PATH
and CMAKE_FIND_ROOT_PATH
variables with the installed path of the Hunter packages.
If a CMAKE_TOOLCHAIN_FILE
was used during compilation, it will be included in the HunterToolchain.cmake
file.
Setting up Hunter, and adding a package list is as easy as:
# FetchContent_MakeAvailable is available since CMake version 3.14
cmake_minimum_required(VERSION 3.14)
# Setting up dlib as an external package
set(HUNTER_PACKAGES dlib)
include(FetchContent)
FetchContent_Declare(SetupHunter GIT_REPOSITORY https://github.com/cpp-pm/gate)
FetchContent_MakeAvailable(SetupHunter)
# Using the dlib package
find_package(dlib REQUIRED)
target_link_libraries(myapp PRIVATE dlib::dlib)
set(HUNTER_pcre2_CMAKE_ARGS
PCRE2_BUILD_PCRE2_8=OFF
PCRE2_BUILD_PCRE2_16=ON
PCRE2_BUILD_PCRE2_32=OFF
PCRE2_SUPPORT_JIT=ON)
set(HUNTER_PACKAGES pcre2)
set(HUNTER_Boost_COMPONENTS Filesystem Python)
set(HUNTER_PACKAGES Boost)
set(HUNTER_fmt_VERSION 5.3.0)
set(HUNTER_PACKAGES fmt)
set(HUNTER_URL "https://github.com/cpp-pm/hunter/archive/v0.23.224.tar.gz")
set(HUNTER_SHA1 "18e57a43efc435f2e1dae1291e82e42afbf940be")
set(HUNTER_PACKAGES fmt ZLIB)
include(FetchContent)
FetchContent_Declare(SetupHunter GIT_REPOSITORY https://github.com/cpp-pm/gate)
FetchContent_MakeAvailable(SetupHunter)
With CMake 3.15 it is possible to inject CMake code before or after the project
function call,
this way we can have a SetupHunter.cmake
which will configure the 3rd party packages for the
project.
Give the following CMake code:
cmake_minimum_required(VERSION 3.15)
project(ZLIBTest)
find_package(ZLIB REQUIRED)
add_executable(main main.c)
target_link_libraries(main PRIVATE ZLIB::ZLIB)
Notice that we do not have the CONFIG
or NO_MODULE
argument to find_package
.
We can have a SetupHunter.cmake
file like this:
set(CMAKE_FIND_PACKAGE_PREFER_CONFIG TRUE)
set(HUNTER_PACKAGES ZLIB)
include(FetchContent)
FetchContent_Declare(SetupHunter GIT_REPOSITORY https://github.com/cpp-pm/gate)
FetchContent_MakeAvailable(SetupHunter)
And then configuring the ZLIBTest
project like:
cmake -GNinja -DCMAKE_PROJECT_INCLUDE_BEFORE=[%cd%|$PWD]/SetupHunter.cmake -S . -B build
By using CMake 3.15's CMAKE_FIND_PACKAGE_PREFER_CONFIG, and CMAKE_PROJECT_INCLUDE_BEFORE we can make sure that the Hunter 3rd party packages are built, and used in a non-intrusive manner.
This allows building the 3rd party packages separate than the user projects, and simply use CMake's
find_package
with no usage of Hunter at all.
cmake_minimum_required(VERSION 3.14)
set(HUNTER_PACKAGES freetype ZLIB PNG double-conversion pcre2)
set(HUNTER_pcre2_CMAKE_ARGS
PCRE2_BUILD_PCRE2_8=OFF
PCRE2_BUILD_PCRE2_16=ON
PCRE2_BUILD_PCRE2_32=OFF
PCRE2_SUPPORT_JIT=ON)
include(FetchContent)
FetchContent_Declare(SetupHunter GIT_REPOSITORY https://github.com/cpp-pm/gate)
FetchContent_MakeAvailable(SetupHunter)
project(3rdparty)
Then compile your project with:
cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/your/3rdparty/build/HunterToolchain.cmake
file(WRITE ${CMAKE_BUILD_DIR}/HunterConfig.cmake [=[
hunter_config(zlib VERSION 1.2.8)
hunter_config(pcre2
VERSION ${HUNTER_pcre2_VERSION}
CMAKE_ARGS
PCRE2_BUILD_PCRE2_8=OFF
PCRE2_BUILD_PCRE2_16=ON
PCRE2_BUILD_PCRE2_32=OFF
PCRE2_SUPPORT_JIT=ON
)
]=])
set(HUNTER_URL "https://github.com/cpp-pm/hunter/archive/v0.23.224.tar.gz")
set(HUNTER_SHA1 "18e57a43efc435f2e1dae1291e82e42afbf940be")
set(HUNTER_FILEPATH_CONFIG ${CMAKE_BUILD_DIR}/HunterConfig.cmake)
include(FetchContent)
FetchContent_Declare(SetupHunter GIT_REPOSITORY https://github.com/cpp-pm/gate)
FetchContent_MakeAvailable(SetupHunter)
hunter_add_package(ZLIB)
hunter_add_package(pcre2)
find_package(ZLIB CONFIG REQUIRED)
find_package(pcre2 CONFIG REQUIRED)
add_executable(boo main.c)
target_link_libraries(boo PRIVATE ZLIB::zlib PCRE2::PCRE2)
- Copy
cmake/HunterGate.cmake
to your project - Put any valid Hunter archive with
SHA1
hash:
include("cmake/HunterGate.cmake")
HunterGate(
URL "https://github.com/cpp-pm/hunter/archive/v0.23.224.tar.gz"
SHA1 "18e57a43efc435f2e1dae1291e82e42afbf940be"
)
Optionally custom config.cmake file can be specified. File may has different locations:
GLOBAL
. The one from Hunter archive:
include("cmake/HunterGate.cmake")
HunterGate(
URL "https://github.com/cpp-pm/hunter/archive/v0.23.224.tar.gz"
SHA1 "18e57a43efc435f2e1dae1291e82e42afbf940be"
GLOBAL myconfig
# load `${HUNTER_SELF}/cmake/configs/myconfig.cmake` instead of
# default `${HUNTER_SELF}/cmake/configs/default.cmake`
)
LOCAL
. Default local config.
include("cmake/HunterGate.cmake")
HunterGate(
URL "https://github.com/cpp-pm/hunter/archive/v0.23.224.tar.gz"
SHA1 "18e57a43efc435f2e1dae1291e82e42afbf940be"
LOCAL # load `${CMAKE_CURRENT_LIST_DIR}/cmake/Hunter/config.cmake`
)
FILEPATH
. Any location.
include("cmake/HunterGate.cmake")
HunterGate(
URL "https://github.com/cpp-pm/hunter/archive/v0.23.224.tar.gz"
SHA1 "18e57a43efc435f2e1dae1291e82e42afbf940be"
FILEPATH "/any/path/to/config.cmake"
)
Example custom config.cmake
:
hunter_config(zlib VERSION 1.2.8)
hunter_config(pcre2
VERSION 10.13-p0
CMAKE_ARGS
PCRE2_BUILD_PCRE2_8=OFF
PCRE2_BUILD_PCRE2_16=ON
PCRE2_BUILD_PCRE2_32=OFF
PCRE2_SUPPORT_JIT=ON
)
See the hunter_config documentation for details.
- If you're in process of patching Hunter and have a
HUNTER_ROOT
pointed to a local copy of Hunter thenHunterGate
will not useURL
andSHA1
values. It means when you updateSHA1
of Hunter archive new commits/fixes will not be applied at all. In this case you have to update your git repo manually (i.e. dogit pull
). This can also be useful for debugging Hunter. - You don't need to specify hunter_config command for all projects. Set version of the package you're interested in - others will be used from default
config.cmake
. - If you want to get full control of what Hunter-SHA1 root directories you want to auto-install you can set HUNTER_DISABLE_AUTOINSTALL environment variable and use HUNTER_RUN_INSTALL=YES CMake variable to allow installations explicitly.
- Try to detect
Hunter
: - test CMake variable
HUNTER_ROOT
(control, shared downloads and builds) - test environment variable
HUNTER_ROOT
(recommended: control, shared downloads and builds) - test directory
${HOME}/.hunter
(shared downloads and builds) - test directory
${SYSTEMDRIVE}/.hunter
(shared downloads and builds, windows only) - test directory
${USERPROFILE}/.hunter
(shared downloads and builds, windows only) - Set
HUNTER_GATE_*
variables - Try to include local Hunter master file
include("${HUNTER_ROOT}/cmake/Hunter")
(mainly for debugging) - Download Hunter from the specified
URL
andSHA1
- Include Hunter master file
include("${HUNTER_SELF}/cmake/Hunter")