mirror of
https://github.com/cpm-cmake/CPM.cmake.git
synced 2025-11-21 19:57:24 -05:00
Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4fad2eac0a | ||
|
|
ee08119642 | ||
|
|
259f1be8e2 | ||
|
|
32b063eba5 | ||
|
|
d64d816585 | ||
|
|
8e8dcc9a8d | ||
|
|
8afc2af4f9 |
50
README.md
50
README.md
@@ -27,9 +27,9 @@ For everything else, the targets can be created manually after the dependency ha
|
||||
|
||||
## Usage
|
||||
|
||||
After `CPM.cmake` has been [added](#adding-cpm) to your project, the function `CPMAddPackage` or `CPMFindPackage` can be used to fetch and configure a dependency.
|
||||
After `CPM.cmake` has been [added](#adding-cpm) to your project, the function `CPMAddPackage` can be used to fetch and configure a dependency.
|
||||
Afterwards, any targets defined in the dependency can be used directly.
|
||||
`CPMFindPackage` and `CPMAddPackage` take the following named parameters.
|
||||
`CPMAddPackage` takes the following named parameters.
|
||||
|
||||
```cmake
|
||||
CPMAddPackage(
|
||||
@@ -45,7 +45,6 @@ The origin may be specified by a `GIT_REPOSITORY`, but other sources, such as di
|
||||
If `GIT_TAG` hasn't been explicitly specified it defaults to `v(VERSION)`, a common convention for git projects.
|
||||
On the other hand, if `VERSION` hasn't been explicitly specified, CPM can automatically identify the version from the git tag in some common cases.
|
||||
`GIT_TAG` can also be set to a specific commit or a branch name such as `master` to always download the most recent version.
|
||||
The optional argument `FIND_PACKAGE_ARGUMENTS` can be specified to a string of parameters that will be passed to `find_package` if enabled (see below).
|
||||
|
||||
If an additional optional parameter `EXCLUDE_FROM_ALL` is set to a truthy value, then any targets defined inside the dependency won't be built by default. See the [CMake docs](https://cmake.org/cmake/help/latest/prop_tgt/EXCLUDE_FROM_ALL.html) for details.
|
||||
|
||||
@@ -73,14 +72,15 @@ CPMAddPackage("https://example.com/my-package-1.2.3.zip#MD5=68e20f674a48be38d60e
|
||||
CPMAddPackage("https://example.com/my-package.zip@1.2.3")
|
||||
```
|
||||
|
||||
After calling `CPMAddPackage` or `CPMFindPackage`, the following variables are defined in the local scope, where `<dependency>` is the name of the dependency.
|
||||
After calling `CPMAddPackage`, the following variables are defined in the local scope, where `<dependency>` is the name of the dependency.
|
||||
|
||||
- `<dependency>_SOURCE_DIR` is the path to the source of the dependency.
|
||||
- `<dependency>_BINARY_DIR` is the path to the build directory of the dependency.
|
||||
- `<dependency>_ADDED` is set to `YES` if the dependency has not been added before, otherwise it is set to `NO`.
|
||||
|
||||
The difference between `CPMFindPackage` and `CPMAddPackage` is that `CPMFindPackage` will try to find a local dependency via CMake's `find_package` and fallback to `CPMAddPackage` if the dependency is not found.
|
||||
This behaviour can be also modified globally via [CPM options](#options).
|
||||
For using CPM.cmake projects with external package managers, such as conan or vcpkg, setting the variable [`CPM_USE_LOCAL_PACKAGES`](#options) will make CPM.cmake try to add a package through `find_package` first, and add it from source if it doesn't succeed.
|
||||
|
||||
In rare cases, this behaviour may be desirable by default. The function `CPMFindPackage` will try to find a local dependency via CMake's `find_package` and fallback to `CPMAddPackage`, if the dependency is not found.
|
||||
|
||||
## Full CMakeLists Example
|
||||
|
||||
@@ -157,7 +157,6 @@ The most notable features are:
|
||||
|
||||
- A simpler to use API
|
||||
- Version checking: CPM.cmake will check the version number of any added dependency and omit a warning if another dependency requires a more recent version.
|
||||
- Options: any Options passed to a dependency are stored and compared on later use, so if another dependency tries to add an existing dependency with incompatible options a warning will be emitted to the user.
|
||||
- Offline builds: CPM.cmake will override CMake's download and update commands, which allows new builds to be configured while offline if all dependencies [are available locally](#cpm_source_cache).
|
||||
- Automatic shallow clone: if a version tag (e.g. `v2.2.0`) is provided and `CPM_SOURCE_CACHE` is used, CPM.cmake will perform a shallow clone of the dependency, which should be significantly faster while using less storage than a full clone.
|
||||
- Overridable: all `CPMAddPackage` can be configured to use `find_package` by setting a [CMake flag](#cpm_use_local_packages), making it easy to integrate into projects that may require local versioning through the system's package manager.
|
||||
@@ -195,6 +194,8 @@ CPM can be configured to use `find_package` to search for locally installed depe
|
||||
If the option `CPM_LOCAL_PACKAGES_ONLY` is set, CPM will emit an error if the dependency is not found locally.
|
||||
These options can also be set as environmental variables.
|
||||
|
||||
In the case that `find_package` requires additional arguments, the parameter `FIND_PACKAGE_ARGUMENTS` may be specified in the `CPMAddPackage` call. The value of this parameter will be forwarded to `find_package`.
|
||||
|
||||
## Local package override
|
||||
|
||||
Library developers are often in the situation where they work on a locally checked out dependency at the same time as on a consumer project.
|
||||
@@ -266,43 +267,29 @@ See the [wiki](https://github.com/cpm-cmake/CPM.cmake/wiki/More-Snippets) for mo
|
||||
### [Catch2](https://github.com/catchorg/Catch2)
|
||||
|
||||
```cmake
|
||||
CPMAddPackage(gh:catchorg/Catch2@2.5.0)
|
||||
CPMAddPackage("gh:catchorg/Catch2@2.5.0")
|
||||
```
|
||||
|
||||
### [Boost (via boost-cmake)](https://github.com/Orphis/boost-cmake)
|
||||
|
||||
```CMake
|
||||
CPMAddPackage(gh:Orphis/boost-cmake@1.67.0)
|
||||
CPMAddPackage("gh:Orphis/boost-cmake@1.67.0")
|
||||
```
|
||||
|
||||
### [cxxopts](https://github.com/jarro2783/cxxopts)
|
||||
|
||||
```cmake
|
||||
CPMAddPackage(
|
||||
NAME cxxopts
|
||||
GITHUB_REPOSITORY jarro2783/cxxopts
|
||||
VERSION 2.2.0
|
||||
OPTIONS
|
||||
"CXXOPTS_BUILD_EXAMPLES Off"
|
||||
"CXXOPTS_BUILD_TESTS Off"
|
||||
VERSION 2.2.1
|
||||
OPTIONS "CXXOPTS_BUILD_EXAMPLES NO" "CXXOPTS_BUILD_TESTS NO" "CXXOPTS_ENABLE_INSTALL YES"
|
||||
)
|
||||
```
|
||||
|
||||
### [Yaml-cpp](https://github.com/jbeder/yaml-cpp)
|
||||
|
||||
```CMake
|
||||
CPMAddPackage(
|
||||
NAME yaml-cpp
|
||||
GITHUB_REPOSITORY jbeder/yaml-cpp
|
||||
# 0.6.2 uses deprecated CMake syntax
|
||||
VERSION 0.6.3
|
||||
# 0.6.3 is not released yet, so use a recent commit
|
||||
GIT_TAG 012269756149ae99745b6dafefd415843d7420bb
|
||||
OPTIONS
|
||||
"YAML_CPP_BUILD_TESTS Off"
|
||||
"YAML_CPP_BUILD_CONTRIB Off"
|
||||
"YAML_CPP_BUILD_TOOLS Off"
|
||||
)
|
||||
CPMAddPackage("gh:jbeder/yaml-cpp#yaml-cpp-0.6.3@0.6.3")
|
||||
```
|
||||
|
||||
### [google/benchmark](https://github.com/google/benchmark)
|
||||
@@ -311,14 +298,13 @@ CPMAddPackage(
|
||||
CPMAddPackage(
|
||||
NAME benchmark
|
||||
GITHUB_REPOSITORY google/benchmark
|
||||
VERSION 1.4.1
|
||||
OPTIONS
|
||||
"BENCHMARK_ENABLE_TESTING Off"
|
||||
VERSION 1.5.2
|
||||
OPTIONS "BENCHMARK_ENABLE_TESTING Off"
|
||||
)
|
||||
|
||||
if (benchmark_ADDED)
|
||||
# compile with C++17
|
||||
set_target_properties(benchmark PROPERTIES CXX_STANDARD 17)
|
||||
if(benchmark_ADDED)
|
||||
# enable c++11 to avoid compilation errors
|
||||
set_target_properties(benchmark PROPERTIES CXX_STANDARD 11)
|
||||
endif()
|
||||
```
|
||||
|
||||
|
||||
108
cmake/CPM.cmake
108
cmake/CPM.cmake
@@ -132,7 +132,6 @@ if(NOT CPM_DONT_CREATE_PACKAGE_LOCK)
|
||||
endif()
|
||||
|
||||
include(FetchContent)
|
||||
include(CMakeParseArguments)
|
||||
|
||||
# Try to infer package name from git repository uri (path or url)
|
||||
function(cpm_package_name_from_git_uri URI RESULT)
|
||||
@@ -247,7 +246,7 @@ function(CPMFindPackage)
|
||||
return()
|
||||
endif()
|
||||
|
||||
cpm_check_if_package_already_added(${CPM_ARGS_NAME} "${CPM_ARGS_VERSION}" "${CPM_ARGS_OPTIONS}")
|
||||
cpm_check_if_package_already_added(${CPM_ARGS_NAME} "${CPM_ARGS_VERSION}")
|
||||
if(CPM_PACKAGE_ALREADY_ADDED)
|
||||
cpm_export_variables(${CPM_ARGS_NAME})
|
||||
return()
|
||||
@@ -263,7 +262,7 @@ function(CPMFindPackage)
|
||||
endfunction()
|
||||
|
||||
# checks if a package has been added before
|
||||
function(cpm_check_if_package_already_added CPM_ARGS_NAME CPM_ARGS_VERSION CPM_ARGS_OPTIONS)
|
||||
function(cpm_check_if_package_already_added CPM_ARGS_NAME CPM_ARGS_VERSION)
|
||||
if("${CPM_ARGS_NAME}" IN_LIST CPM_PACKAGES)
|
||||
CPMGetPackageVersion(${CPM_ARGS_NAME} CPM_PACKAGE_VERSION)
|
||||
if("${CPM_PACKAGE_VERSION}" VERSION_LESS "${CPM_ARGS_VERSION}")
|
||||
@@ -272,17 +271,6 @@ function(cpm_check_if_package_already_added CPM_ARGS_NAME CPM_ARGS_VERSION CPM_A
|
||||
"${CPM_INDENT} requires a newer version of ${CPM_ARGS_NAME} (${CPM_ARGS_VERSION}) than currently included (${CPM_PACKAGE_VERSION})."
|
||||
)
|
||||
endif()
|
||||
if(CPM_ARGS_OPTIONS)
|
||||
foreach(OPTION ${CPM_ARGS_OPTIONS})
|
||||
cpm_parse_option(${OPTION})
|
||||
if(NOT "${${OPTION_KEY}}" STREQUAL "${OPTION_VALUE}")
|
||||
message(
|
||||
WARNING
|
||||
"${CPM_INDENT} ignoring package option for ${CPM_ARGS_NAME}: ${OPTION_KEY} = ${OPTION_VALUE} (${${OPTION_KEY}})"
|
||||
)
|
||||
endif()
|
||||
endforeach()
|
||||
endif()
|
||||
cpm_get_fetch_properties(${CPM_ARGS_NAME})
|
||||
set(${CPM_ARGS_NAME}_ADDED NO)
|
||||
set(CPM_PACKAGE_ALREADY_ADDED
|
||||
@@ -388,6 +376,7 @@ function(CPMAddPackage)
|
||||
NO_CACHE
|
||||
GIT_SHALLOW
|
||||
EXCLUDE_FROM_ALL
|
||||
SOURCE_SUBDIR
|
||||
)
|
||||
|
||||
set(multiValueArgs URL OPTIONS)
|
||||
@@ -466,7 +455,7 @@ function(CPMAddPackage)
|
||||
endif()
|
||||
|
||||
# Check if package has been added before
|
||||
cpm_check_if_package_already_added(${CPM_ARGS_NAME} "${CPM_ARGS_VERSION}" "${CPM_ARGS_OPTIONS}")
|
||||
cpm_check_if_package_already_added(${CPM_ARGS_NAME} "${CPM_ARGS_VERSION}")
|
||||
if(CPM_PACKAGE_ALREADY_ADDED)
|
||||
cpm_export_variables(${CPM_ARGS_NAME})
|
||||
return()
|
||||
@@ -493,7 +482,7 @@ function(CPMAddPackage)
|
||||
CPMAddPackage(${declaration})
|
||||
cpm_export_variables(${CPM_ARGS_NAME})
|
||||
# checking again to ensure version and option compatibility
|
||||
cpm_check_if_package_already_added(${CPM_ARGS_NAME} "${CPM_ARGS_VERSION}" "${CPM_ARGS_OPTIONS}")
|
||||
cpm_check_if_package_already_added(${CPM_ARGS_NAME} "${CPM_ARGS_VERSION}")
|
||||
return()
|
||||
endif()
|
||||
|
||||
@@ -515,16 +504,6 @@ function(CPMAddPackage)
|
||||
|
||||
CPMRegisterPackage("${CPM_ARGS_NAME}" "${CPM_ARGS_VERSION}")
|
||||
|
||||
if(CPM_ARGS_OPTIONS)
|
||||
foreach(OPTION ${CPM_ARGS_OPTIONS})
|
||||
cpm_parse_option(${OPTION})
|
||||
set(${OPTION_KEY}
|
||||
${OPTION_VALUE}
|
||||
CACHE INTERNAL ""
|
||||
)
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
if(DEFINED CPM_ARGS_GIT_TAG)
|
||||
set(PACKAGE_INFO "${CPM_ARGS_GIT_TAG}")
|
||||
elseif(DEFINED CPM_ARGS_SOURCE_DIR)
|
||||
@@ -549,11 +528,11 @@ function(CPMAddPackage)
|
||||
set(${CPM_ARGS_NAME}_BINARY_DIR ${CMAKE_BINARY_DIR}/_deps/${lower_case_name}-build)
|
||||
set(${CPM_ARGS_NAME}_ADDED YES)
|
||||
set(${CPM_ARGS_NAME}_SOURCE_DIR ${download_directory})
|
||||
if(NOT CPM_ARGS_DOWNLOAD_ONLY AND EXISTS ${download_directory}/CMakeLists.txt)
|
||||
cpm_add_subdirectory(
|
||||
${download_directory} ${${CPM_ARGS_NAME}_BINARY_DIR} "${CPM_ARGS_EXCLUDE_FROM_ALL}"
|
||||
)
|
||||
endif()
|
||||
cpm_add_subdirectory(
|
||||
"${CPM_ARGS_NAME}" "${DOWNLOAD_ONLY}"
|
||||
"${${CPM_ARGS_NAME}_SOURCE_DIR}/${CPM_ARGS_SOURCE_SUBDIR}" "${${CPM_ARGS_NAME}_BINARY_DIR}"
|
||||
"${CPM_ARGS_EXCLUDE_FROM_ALL}" "${CPM_ARGS_OPTIONS}"
|
||||
)
|
||||
set(CPM_SKIP_FETCH TRUE)
|
||||
set(PACKAGE_INFO "${PACKAGE_INFO} at ${download_directory}")
|
||||
else()
|
||||
@@ -592,7 +571,12 @@ function(CPMAddPackage)
|
||||
cpm_declare_fetch(
|
||||
"${CPM_ARGS_NAME}" "${CPM_ARGS_VERSION}" "${PACKAGE_INFO}" "${CPM_ARGS_UNPARSED_ARGUMENTS}"
|
||||
)
|
||||
cpm_fetch_package("${CPM_ARGS_NAME}" "${DOWNLOAD_ONLY}" "${CPM_ARGS_EXCLUDE_FROM_ALL}")
|
||||
cpm_fetch_package("${CPM_ARGS_NAME}")
|
||||
cpm_add_subdirectory(
|
||||
"${CPM_ARGS_NAME}" "${DOWNLOAD_ONLY}"
|
||||
"${${CPM_ARGS_NAME}_SOURCE_DIR}/${CPM_ARGS_SOURCE_SUBDIR}" "${${CPM_ARGS_NAME}_BINARY_DIR}"
|
||||
"${CPM_ARGS_EXCLUDE_FROM_ALL}" "${CPM_ARGS_OPTIONS}"
|
||||
)
|
||||
cpm_get_fetch_properties("${CPM_ARGS_NAME}")
|
||||
endif()
|
||||
|
||||
@@ -715,36 +699,62 @@ function(cpm_get_fetch_properties PACKAGE)
|
||||
)
|
||||
endfunction()
|
||||
|
||||
function(cpm_add_subdirectory SOURCE_DIR BINARY_DIR EXCLUDE)
|
||||
if(EXCLUDE)
|
||||
set(addSubdirectoryExtraArgs EXCLUDE_FROM_ALL)
|
||||
else()
|
||||
set(addSubdirectoryExtraArgs "")
|
||||
# adds a package as a subdirectory if viable, according to provided options
|
||||
function(
|
||||
cpm_add_subdirectory
|
||||
PACKAGE
|
||||
DOWNLOAD_ONLY
|
||||
SOURCE_DIR
|
||||
BINARY_DIR
|
||||
EXCLUDE
|
||||
OPTIONS
|
||||
)
|
||||
if(NOT DOWNLOAD_ONLY AND EXISTS ${SOURCE_DIR}/CMakeLists.txt)
|
||||
if(EXCLUDE)
|
||||
set(addSubdirectoryExtraArgs EXCLUDE_FROM_ALL)
|
||||
else()
|
||||
set(addSubdirectoryExtraArgs "")
|
||||
endif()
|
||||
if(OPTIONS)
|
||||
# the policy allows us to change options without caching
|
||||
cmake_policy(SET CMP0077 NEW)
|
||||
set(CMAKE_POLICY_DEFAULT_CMP0077 NEW)
|
||||
|
||||
foreach(OPTION ${OPTIONS})
|
||||
cpm_parse_option(${OPTION})
|
||||
set(${OPTION_KEY} ${OPTION_VALUE})
|
||||
endforeach()
|
||||
endif()
|
||||
set(CPM_OLD_INDENT "${CPM_INDENT}")
|
||||
set(CPM_INDENT "${CPM_INDENT} ${PACKAGE}:")
|
||||
add_subdirectory(${SOURCE_DIR} ${BINARY_DIR} ${addSubdirectoryExtraArgs})
|
||||
set(CPM_INDENT "${CPM_OLD_INDENT}")
|
||||
endif()
|
||||
add_subdirectory(${SOURCE_DIR} ${BINARY_DIR} ${addSubdirectoryExtraArgs})
|
||||
endfunction()
|
||||
|
||||
# downloads a previously declared package via FetchContent
|
||||
function(cpm_fetch_package PACKAGE DOWNLOAD_ONLY EXCLUDE)
|
||||
# downloads a previously declared package via FetchContent and exports the variables
|
||||
# `${PACKAGE}_SOURCE_DIR` and `${PACKAGE}_BINARY_DIR` to the parent scope
|
||||
function(cpm_fetch_package PACKAGE)
|
||||
if(${CPM_DRY_RUN})
|
||||
message(STATUS "${CPM_INDENT} package ${PACKAGE} not fetched (dry run)")
|
||||
return()
|
||||
endif()
|
||||
|
||||
FetchContent_GetProperties(${PACKAGE})
|
||||
string(TOLOWER "${PACKAGE}" lower_case_name)
|
||||
|
||||
if(NOT ${lower_case_name}_POPULATED)
|
||||
FetchContent_Populate(${PACKAGE})
|
||||
if(NOT DOWNLOAD_ONLY AND EXISTS ${${lower_case_name}_SOURCE_DIR}/CMakeLists.txt)
|
||||
set(CPM_OLD_INDENT "${CPM_INDENT}")
|
||||
set(CPM_INDENT "${CPM_INDENT} ${PACKAGE}:")
|
||||
cpm_add_subdirectory(
|
||||
${${lower_case_name}_SOURCE_DIR} ${${lower_case_name}_BINARY_DIR} "${EXCLUDE}"
|
||||
)
|
||||
set(CPM_INDENT "${CPM_OLD_INDENT}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
string(TOLOWER "${PACKAGE}" lower_case_name)
|
||||
set(${PACKAGE}_SOURCE_DIR
|
||||
${${lower_case_name}_SOURCE_DIR}
|
||||
PARENT_SCOPE
|
||||
)
|
||||
set(${PACKAGE}_BINARY_DIR
|
||||
${${lower_case_name}_BINARY_DIR}
|
||||
PARENT_SCOPE
|
||||
)
|
||||
endfunction()
|
||||
|
||||
# splits a package option
|
||||
|
||||
@@ -38,7 +38,7 @@ endfunction()
|
||||
|
||||
function(ASSERT_NOT_DEFINED KEY)
|
||||
if(DEFINED ${KEY})
|
||||
message(FATAL_ERROR "assertion failed: '${KEY}' is defiend")
|
||||
message(FATAL_ERROR "assertion failed: '${KEY}' is defiend (${${KEY}})")
|
||||
else()
|
||||
message(STATUS "test passed: '${KEY}' is not defined")
|
||||
endif()
|
||||
@@ -48,7 +48,15 @@ function(ASSERT_TRUTHY KEY)
|
||||
if(${${KEY}})
|
||||
message(STATUS "test passed: '${KEY}' is set truthy")
|
||||
else()
|
||||
message(FATAL_ERROR "assertion failed: value of '${KEY}' is not true (${${KEY}})")
|
||||
message(FATAL_ERROR "assertion failed: value of '${KEY}' is not truthy (${${KEY}})")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(ASSERT_FALSY KEY)
|
||||
if(${${KEY}})
|
||||
message(FATAL_ERROR "assertion failed: value of '${KEY}' is not falsy (${${KEY}})")
|
||||
else()
|
||||
message(STATUS "test passed: '${KEY}' is set falsy")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
|
||||
@@ -8,12 +8,7 @@ include(../../cmake/CPM.cmake)
|
||||
|
||||
find_package(Threads REQUIRED)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME asio
|
||||
VERSION 1.18.1
|
||||
GITHUB_REPOSITORY chriskohlhoff/asio
|
||||
GIT_TAG asio-1-18-1 # asio uses non-standard version tag, we must specify GIT_TAG
|
||||
)
|
||||
CPMAddPackage("gh:chriskohlhoff/asio#asio-1-18-1@1.18.1")
|
||||
|
||||
# ASIO doesn't use CMake, we have to configure it manually. Extra notes for using on Windows:
|
||||
#
|
||||
|
||||
@@ -6,7 +6,7 @@ project(CPMExampleBenchmark)
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage("gh:TheLartians/Fibonacci@2.0")
|
||||
CPMAddPackage("gh:cpm-cmake/testpack-fibonacci@2.0")
|
||||
|
||||
CPMAddPackage(
|
||||
NAME benchmark
|
||||
@@ -16,7 +16,7 @@ CPMAddPackage(
|
||||
)
|
||||
|
||||
if(benchmark_ADDED)
|
||||
# Don't use C++14 because it doesn't work in some configurations.
|
||||
# enable c++11 to avoid compilation errors
|
||||
set_target_properties(benchmark PROPERTIES CXX_STANDARD 11)
|
||||
endif()
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@ CPMFindPackage(
|
||||
NAME Boost
|
||||
GITHUB_REPOSITORY Orphis/boost-cmake
|
||||
VERSION 1.67.0
|
||||
# setting FIND_PACKAGE_ARGUMENTS allow usage with `CPM_USE_LOCAL_PACKAGES`
|
||||
FIND_PACKAGE_ARGUMENTS "COMPONENTS system"
|
||||
)
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ project(CPMExampleCatch2)
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage("gh:TheLartians/Fibonacci@2.0")
|
||||
CPMAddPackage("gh:cpm-cmake/testpack-fibonacci@2.0")
|
||||
CPMAddPackage("gh:catchorg/Catch2@2.13.4")
|
||||
|
||||
# ---- Create binary ----
|
||||
|
||||
@@ -6,12 +6,7 @@ project(CPMExampleCXXOpts)
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME cxxopts
|
||||
GITHUB_REPOSITORY jarro2783/cxxopts
|
||||
VERSION 2.2.0
|
||||
OPTIONS "CXXOPTS_BUILD_EXAMPLES Off" "CXXOPTS_BUILD_TESTS Off"
|
||||
)
|
||||
CPMAddPackage("gh:jarro2783/cxxopts@2.2.0")
|
||||
|
||||
# ---- Create binary ----
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ project(CPMExampleDoctest)
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage("gh:TheLartians/Fibonacci@2.0")
|
||||
CPMAddPackage("gh:cpm-cmake/testpack-fibonacci@2.0")
|
||||
CPMAddPackage("gh:onqtam/doctest#2.4.5")
|
||||
|
||||
# ---- Create binary ----
|
||||
|
||||
@@ -6,7 +6,7 @@ project(CPMExampleGtest)
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage("gh:TheLartians/Fibonacci@2.0")
|
||||
CPMAddPackage("gh:cpm-cmake/testpack-fibonacci@2.0")
|
||||
|
||||
CPMAddPackage(
|
||||
NAME googletest
|
||||
|
||||
@@ -6,13 +6,7 @@ project(CPMYamlExample)
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME yaml-cpp
|
||||
GIT_REPOSITORY https://github.com/jbeder/yaml-cpp.git
|
||||
VERSION 0.6.3
|
||||
GIT_TAG yaml-cpp-0.6.3
|
||||
OPTIONS "YAML_CPP_BUILD_TESTS Off" "YAML_CPP_BUILD_CONTRIB Off" "YAML_CPP_BUILD_TOOLS Off"
|
||||
)
|
||||
CPMAddPackage("gh:jbeder/yaml-cpp#yaml-cpp-0.6.3@0.6.3")
|
||||
|
||||
# ---- Executable ----
|
||||
|
||||
|
||||
33
test/unit/local_dependency/OptionsCMakeLists.txt.in
Normal file
33
test/unit/local_dependency/OptionsCMakeLists.txt.in
Normal file
@@ -0,0 +1,33 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMTest)
|
||||
|
||||
# ---- Options ----
|
||||
|
||||
option(ENABLE_TEST_COVERAGE "Enable test coverage" OFF)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(@CPM_PATH@/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME Dependency
|
||||
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/dependency
|
||||
OPTIONS "DEFINE_ALTERNATIVE_FUNCTION YES"
|
||||
EXCLUDE_FROM_ALL YES
|
||||
)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
alternative_dependency_function()
|
||||
|
||||
# ---- Check parameters ----
|
||||
|
||||
include(@CPM_PATH@/testing.cmake)
|
||||
|
||||
message("DEFINE_ALTERNATIVE_FUNCTION: ${DEFINE_ALTERNATIVE_FUNCTION}")
|
||||
|
||||
# this option is overridden by CPM.cmake
|
||||
ASSERT_NOT_DEFINED(DEFINE_ALTERNATIVE_FUNCTION)
|
||||
# this option is leaked by the dependency
|
||||
ASSERT_EQUAL(${LEAKED_OPTION} "OFF")
|
||||
17
test/unit/local_dependency/SubdirCMakeLists.txt.in
Normal file
17
test/unit/local_dependency/SubdirCMakeLists.txt.in
Normal file
@@ -0,0 +1,17 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMTest)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(@CPM_PATH@/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME Dependency
|
||||
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/dependency
|
||||
SOURCE_SUBDIR inner
|
||||
)
|
||||
|
||||
# ---- Call inner dependency method to validate correct addition of subdirectory ----
|
||||
|
||||
inner_dependency_function()
|
||||
@@ -1,3 +1,14 @@
|
||||
function(dependency_function)
|
||||
message("called external method")
|
||||
endfunction()
|
||||
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
|
||||
|
||||
option(DEFINE_ALTERNATIVE_FUNCTION "define the alternative function" OFF)
|
||||
option(LEAKED_OPTION "this option will be leaked to the outer scope" OFF)
|
||||
|
||||
if(NOT DEFINE_ALTERNATIVE_FUNCTION)
|
||||
function(dependency_function)
|
||||
message("called external method")
|
||||
endfunction()
|
||||
else()
|
||||
function(alternative_dependency_function)
|
||||
message("called alternative external method")
|
||||
endfunction()
|
||||
endif()
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
function(inner_dependency_function)
|
||||
message("called inner method")
|
||||
endfunction()
|
||||
19
test/unit/options.cmake
Normal file
19
test/unit/options.cmake
Normal file
@@ -0,0 +1,19 @@
|
||||
include(CMakePackageConfigHelpers)
|
||||
include(${CPM_PATH}/testing.cmake)
|
||||
|
||||
set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/source_dir)
|
||||
|
||||
set(TEST_DEPENDENCY_NAME Dependency)
|
||||
|
||||
configure_package_config_file(
|
||||
"${CMAKE_CURRENT_LIST_DIR}/local_dependency/OptionsCMakeLists.txt.in"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/local_dependency/CMakeLists.txt"
|
||||
INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/junk
|
||||
)
|
||||
|
||||
execute_process(
|
||||
COMMAND ${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/local_dependency" "-B${TEST_BUILD_DIR}"
|
||||
RESULT_VARIABLE ret
|
||||
)
|
||||
|
||||
assert_equal(${ret} "0")
|
||||
@@ -12,7 +12,7 @@ include(@CPM_PATH@/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME fibonacci
|
||||
GIT_REPOSITORY https://github.com/TheLartians/Fibonacci.git
|
||||
GIT_REPOSITORY https://github.com/cpm-cmake/testpack-fibonacci.git
|
||||
VERSION @FIBONACCI_VERSION@
|
||||
@FIBONACCI_PACKAGE_ARGS@
|
||||
)
|
||||
|
||||
17
test/unit/subdir.cmake
Normal file
17
test/unit/subdir.cmake
Normal file
@@ -0,0 +1,17 @@
|
||||
include(CMakePackageConfigHelpers)
|
||||
include(${CPM_PATH}/testing.cmake)
|
||||
|
||||
set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/source_dir)
|
||||
|
||||
configure_package_config_file(
|
||||
"${CMAKE_CURRENT_LIST_DIR}/local_dependency/SubdirCMakeLists.txt.in"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/local_dependency/CMakeLists.txt"
|
||||
INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/junk
|
||||
)
|
||||
|
||||
execute_process(
|
||||
COMMAND ${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/local_dependency" "-B${TEST_BUILD_DIR}"
|
||||
RESULT_VARIABLE ret
|
||||
)
|
||||
|
||||
assert_equal(${ret} "0")
|
||||
Reference in New Issue
Block a user