mirror of
https://github.com/cpm-cmake/CPM.cmake.git
synced 2025-11-22 04:07:49 -05:00
Compare commits
19 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4fad2eac0a | ||
|
|
ee08119642 | ||
|
|
259f1be8e2 | ||
|
|
32b063eba5 | ||
|
|
d64d816585 | ||
|
|
8e8dcc9a8d | ||
|
|
8afc2af4f9 | ||
|
|
a3d1048ad6 | ||
|
|
492e762591 | ||
|
|
3f6cbe7383 | ||
|
|
4aadac1972 | ||
|
|
4cbf443363 | ||
|
|
2744b87f07 | ||
|
|
fd539b8ff3 | ||
|
|
02d57a1601 | ||
|
|
5f614e5eb6 | ||
|
|
1f5cb903e5 | ||
|
|
7000572bbe | ||
|
|
fe8d15ba82 |
@@ -33,6 +33,7 @@ parse:
|
|||||||
DOWNLOAD_NO_EXTRACT: 1
|
DOWNLOAD_NO_EXTRACT: 1
|
||||||
HTTP_USERNAME: 1
|
HTTP_USERNAME: 1
|
||||||
HTTP_PASSWORD: 1
|
HTTP_PASSWORD: 1
|
||||||
|
EXCLUDE_FROM_ALL: 1
|
||||||
OPTIONS: +
|
OPTIONS: +
|
||||||
cpmfindpackage:
|
cpmfindpackage:
|
||||||
pargs:
|
pargs:
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,3 +1,4 @@
|
|||||||
|
build/
|
||||||
/build*
|
/build*
|
||||||
/.vscode
|
/.vscode
|
||||||
*.DS_Store
|
*.DS_Store
|
||||||
119
README.md
119
README.md
@@ -1,7 +1,7 @@
|
|||||||
[](https://travis-ci.com/TheLartians/CPM.cmake)
|
[](https://travis-ci.com/cpm-cmake/CPM.cmake)
|
||||||
[](https://github.com/TheLartians/CPM.cmake/actions)
|
[](https://github.com/cpm-cmake/CPM.cmake/actions)
|
||||||
[](https://github.com/TheLartians/CPM.cmake/actions)
|
[](https://github.com/cpm-cmake/CPM.cmake/actions)
|
||||||
[](https://github.com/TheLartians/CPM.cmake/actions) [](https://gitter.im/TheLartians/CPM.cmake?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
[](https://github.com/cpm-cmake/CPM.cmake/actions)
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
<p align="center">
|
<p align="center">
|
||||||
@@ -27,9 +27,9 @@ For everything else, the targets can be created manually after the dependency ha
|
|||||||
|
|
||||||
## Usage
|
## 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.
|
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
|
```cmake
|
||||||
CPMAddPackage(
|
CPMAddPackage(
|
||||||
@@ -45,16 +45,42 @@ 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.
|
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.
|
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.
|
`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).
|
|
||||||
|
|
||||||
After calling `CPMAddPackage` or `CPMFindPackage`, the following variables are defined in the local scope, where `<dependency>` is the name of the dependency.
|
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.
|
||||||
|
|
||||||
|
A single-argument compact syntax is also supported:
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
# A git package from a given uri with a version
|
||||||
|
CPMAddPackage("uri@version")
|
||||||
|
# A git package from a given uri with a git tag or commit hash, or branch name
|
||||||
|
CPMAddPackage("uri#tag")
|
||||||
|
# A git package with both version and tag provided
|
||||||
|
CPMAddPackage("uri@version#tag")
|
||||||
|
```
|
||||||
|
|
||||||
|
In the shorthand syntax if the URI is of the form `gh:user/name`, it is interpreted as GitHub URI and converted to `https://github.com/user/name.git`. If the URI is of the form `gl:user/name`, it is interpreted as a [GitLab](https://gitlab.com/explore/) URI and coverted to `https://gitlab.com/user/name.git`. Otherwise the URI used verbatim as a git URL. All packages added using the shorthand syntax will be added using the [EXCLUDE_FROM_ALL](https://cmake.org/cmake/help/latest/prop_tgt/EXCLUDE_FROM_ALL.html) flag.
|
||||||
|
|
||||||
|
The single-argument syntax also works for URLs:
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
# An archive package from a given url. The version is inferred
|
||||||
|
CPMAddPackage("https://example.com/my-package-1.2.3.zip")
|
||||||
|
# An archive package from a given url with an MD5 hash provided
|
||||||
|
CPMAddPackage("https://example.com/my-package-1.2.3.zip#MD5=68e20f674a48be38d60e129f600faf7d")
|
||||||
|
# An archive package from a given url. The version is explicitly given
|
||||||
|
CPMAddPackage("https://example.com/my-package.zip@1.2.3")
|
||||||
|
```
|
||||||
|
|
||||||
|
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>_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>_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`.
|
- `<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.
|
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.
|
||||||
This behaviour can be also modified globally via [CPM options](#options).
|
|
||||||
|
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
|
## Full CMakeLists Example
|
||||||
|
|
||||||
@@ -69,30 +95,25 @@ add_executable(tests tests.cpp)
|
|||||||
|
|
||||||
# add dependencies
|
# add dependencies
|
||||||
include(cmake/CPM.cmake)
|
include(cmake/CPM.cmake)
|
||||||
|
CPMAddPackage("gh:catchorg/Catch2@2.5.0")
|
||||||
CPMAddPackage(
|
|
||||||
NAME Catch2
|
|
||||||
GITHUB_REPOSITORY catchorg/Catch2
|
|
||||||
VERSION 2.5.0
|
|
||||||
)
|
|
||||||
|
|
||||||
# link dependencies
|
# link dependencies
|
||||||
target_link_libraries(tests Catch2)
|
target_link_libraries(tests Catch2)
|
||||||
```
|
```
|
||||||
|
|
||||||
See the [examples directory](https://github.com/TheLartians/CPM.cmake/tree/master/examples) for complete examples with source code and check [below](#snippets) or in the [wiki](https://github.com/TheLartians/CPM.cmake/wiki/More-Snippets) for example snippets.
|
See the [examples directory](https://github.com/cpm-cmake/CPM.cmake/tree/master/examples) for complete examples with source code and check [below](#snippets) or in the [wiki](https://github.com/cpm-cmake/CPM.cmake/wiki/More-Snippets) for example snippets.
|
||||||
|
|
||||||
## Adding CPM
|
## Adding CPM
|
||||||
|
|
||||||
To add CPM to your current project, simply add the [latest release](https://github.com/TheLartians/CPM.cmake/releases/latest) of `CPM.cmake` or `get_cpm.cmake` to your project's `cmake` directory.
|
To add CPM to your current project, simply add the [latest release](https://github.com/cpm-cmake/CPM.cmake/releases/latest) of `CPM.cmake` or `get_cpm.cmake` to your project's `cmake` directory.
|
||||||
The command below will perform this automatically.
|
The command below will perform this automatically.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
mkdir -p cmake
|
mkdir -p cmake
|
||||||
wget -O cmake/CPM.cmake https://github.com/TheLartians/CPM.cmake/releases/latest/download/get_cpm.cmake
|
wget -O cmake/CPM.cmake https://github.com/cpm-cmake/CPM.cmake/releases/latest/download/get_cpm.cmake
|
||||||
```
|
```
|
||||||
|
|
||||||
You can also download CPM.cmake directly from your project's `CMakeLists.txt`. See the [wiki](https://github.com/TheLartians/CPM.cmake/wiki/Downloading-CPM.cmake-in-CMake) for more details.
|
You can also download CPM.cmake directly from your project's `CMakeLists.txt`. See the [wiki](https://github.com/cpm-cmake/CPM.cmake/wiki/Downloading-CPM.cmake-in-CMake) for more details.
|
||||||
|
|
||||||
## Updating CPM
|
## Updating CPM
|
||||||
|
|
||||||
@@ -112,7 +133,7 @@ Dependencies using CPM will automatically use the updated script of the outermos
|
|||||||
## Limitations
|
## Limitations
|
||||||
|
|
||||||
- **No pre-built binaries** For every new build directory, all dependencies are initially downloaded and built from scratch. To avoid extra downloads it is recommend to set the [`CPM_SOURCE_CACHE`](#CPM_SOURCE_CACHE) environmental variable. Using a caching compiler such as [ccache](https://github.com/TheLartians/Ccache.cmake) can drastically reduce build time.
|
- **No pre-built binaries** For every new build directory, all dependencies are initially downloaded and built from scratch. To avoid extra downloads it is recommend to set the [`CPM_SOURCE_CACHE`](#CPM_SOURCE_CACHE) environmental variable. Using a caching compiler such as [ccache](https://github.com/TheLartians/Ccache.cmake) can drastically reduce build time.
|
||||||
- **Dependent on good CMakeLists** Many libraries do not have CMakeLists that work well for subprojects. Luckily this is slowly changing, however, until then, some manual configuration may be required (see the snippets [below](#snippets) for examples). For best practices on preparing projects for CPM, see the [wiki](https://github.com/TheLartians/CPM.cmake/wiki/Preparing-projects-for-CPM.cmake).
|
- **Dependent on good CMakeLists** Many libraries do not have CMakeLists that work well for subprojects. Luckily this is slowly changing, however, until then, some manual configuration may be required (see the snippets [below](#snippets) for examples). For best practices on preparing projects for CPM, see the [wiki](https://github.com/cpm-cmake/CPM.cmake/wiki/Preparing-projects-for-CPM.cmake).
|
||||||
- **First version used** In diamond-shaped dependency graphs (e.g. `A` depends on `C`@1.1 and `B`, which itself depends on `C`@1.2 the first added dependency will be used (in this case `C`@1.1). In this case, B requires a newer version of `C` than `A`, so CPM will emit a warning. This can be easily resolved by adding a new version of the dependency in the outermost project, or by introducing a [package lock file](#package-lock).
|
- **First version used** In diamond-shaped dependency graphs (e.g. `A` depends on `C`@1.1 and `B`, which itself depends on `C`@1.2 the first added dependency will be used (in this case `C`@1.1). In this case, B requires a newer version of `C` than `A`, so CPM will emit a warning. This can be easily resolved by adding a new version of the dependency in the outermost project, or by introducing a [package lock file](#package-lock).
|
||||||
|
|
||||||
For projects with more complex needs and where an extra setup step doesn't matter, it may be worth to check out an external C++ package manager such as [vcpkg](https://github.com/microsoft/vcpkg), [conan](https://conan.io) or [hunter](https://github.com/ruslo/hunter).
|
For projects with more complex needs and where an extra setup step doesn't matter, it may be worth to check out an external C++ package manager such as [vcpkg](https://github.com/microsoft/vcpkg), [conan](https://conan.io) or [hunter](https://github.com/ruslo/hunter).
|
||||||
@@ -127,7 +148,7 @@ Additionally, it is difficult to cross-compile projects (e.g. for mobile), as th
|
|||||||
|
|
||||||
CPM.cmake allows dependencies to be unambiguously defined and builds them from source.
|
CPM.cmake allows dependencies to be unambiguously defined and builds them from source.
|
||||||
Note that the behaviour differs from `find_package`, as variables exported to the parent scope (such as `<PackageName>_LIBRARIES`) will not be visible after adding a package using CPM.cmake.
|
Note that the behaviour differs from `find_package`, as variables exported to the parent scope (such as `<PackageName>_LIBRARIES`) will not be visible after adding a package using CPM.cmake.
|
||||||
The behaviour can be [achieved manually](https://github.com/TheLartians/CPM.cmake/issues/132#issuecomment-644955140), if required.
|
The behaviour can be [achieved manually](https://github.com/cpm-cmake/CPM.cmake/issues/132#issuecomment-644955140), if required.
|
||||||
|
|
||||||
## Comparison to pure FetchContent / ExternalProject
|
## Comparison to pure FetchContent / ExternalProject
|
||||||
|
|
||||||
@@ -136,7 +157,6 @@ The most notable features are:
|
|||||||
|
|
||||||
- A simpler to use API
|
- 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.
|
- 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).
|
- 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.
|
- 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.
|
- 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.
|
||||||
@@ -160,7 +180,7 @@ export CPM_SOURCE_CACHE=$HOME/.cache/CPM
|
|||||||
|
|
||||||
Note that passing the variable as a configure option to CMake will always override the value set by the environmental variable.
|
Note that passing the variable as a configure option to CMake will always override the value set by the environmental variable.
|
||||||
|
|
||||||
You can use `CPM_SOURCE_CACHE` on GitHub Actions workflows [cache](https://github.com/actions/cache) and combine it with ccache, to make your CI faster. See the [wiki](https://github.com/TheLartians/CPM.cmake/wiki/Caching-with-CPM.cmake-and-ccache-on-GitHub-Actions) for more info.
|
You can use `CPM_SOURCE_CACHE` on GitHub Actions workflows [cache](https://github.com/actions/cache) and combine it with ccache, to make your CI faster. See the [wiki](https://github.com/cpm-cmake/CPM.cmake/wiki/Caching-with-CPM.cmake-and-ccache-on-GitHub-Actions) for more info.
|
||||||
|
|
||||||
### CPM_DOWNLOAD_ALL
|
### CPM_DOWNLOAD_ALL
|
||||||
|
|
||||||
@@ -174,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.
|
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.
|
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
|
## 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.
|
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.
|
||||||
@@ -201,7 +223,7 @@ cmake -Bbuild
|
|||||||
cmake --build build --target cpm-update-package-lock
|
cmake --build build --target cpm-update-package-lock
|
||||||
```
|
```
|
||||||
|
|
||||||
See the [wiki](https://github.com/TheLartians/CPM.cmake/wiki/Package-lock) for more info.
|
See the [wiki](https://github.com/cpm-cmake/CPM.cmake/wiki/Package-lock) for more info.
|
||||||
|
|
||||||
## Built with CPM.cmake
|
## Built with CPM.cmake
|
||||||
|
|
||||||
@@ -240,56 +262,34 @@ If you know others, feel free to add them here through a PR.
|
|||||||
## Snippets
|
## Snippets
|
||||||
|
|
||||||
These examples demonstrate how to include some well-known projects with CPM.
|
These examples demonstrate how to include some well-known projects with CPM.
|
||||||
See the [wiki](https://github.com/TheLartians/CPM.cmake/wiki/More-Snippets) for more snippets.
|
See the [wiki](https://github.com/cpm-cmake/CPM.cmake/wiki/More-Snippets) for more snippets.
|
||||||
|
|
||||||
### [Catch2](https://github.com/catchorg/Catch2)
|
### [Catch2](https://github.com/catchorg/Catch2)
|
||||||
|
|
||||||
```cmake
|
```cmake
|
||||||
CPMAddPackage(
|
CPMAddPackage("gh:catchorg/Catch2@2.5.0")
|
||||||
NAME Catch2
|
|
||||||
GITHUB_REPOSITORY catchorg/Catch2
|
|
||||||
VERSION 2.5.0
|
|
||||||
)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### [Boost (via boost-cmake)](https://github.com/Orphis/boost-cmake)
|
### [Boost (via boost-cmake)](https://github.com/Orphis/boost-cmake)
|
||||||
|
|
||||||
```CMake
|
```CMake
|
||||||
CPMAddPackage(
|
CPMAddPackage("gh:Orphis/boost-cmake@1.67.0")
|
||||||
NAME boost-cmake
|
|
||||||
GITHUB_REPOSITORY Orphis/boost-cmake
|
|
||||||
VERSION 1.67.0
|
|
||||||
)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### [cxxopts](https://github.com/jarro2783/cxxopts)
|
### [cxxopts](https://github.com/jarro2783/cxxopts)
|
||||||
|
|
||||||
```cmake
|
```cmake
|
||||||
CPMAddPackage(
|
CPMAddPackage(
|
||||||
NAME cxxopts
|
|
||||||
GITHUB_REPOSITORY jarro2783/cxxopts
|
GITHUB_REPOSITORY jarro2783/cxxopts
|
||||||
VERSION 2.2.0
|
VERSION 2.2.1
|
||||||
OPTIONS
|
OPTIONS "CXXOPTS_BUILD_EXAMPLES NO" "CXXOPTS_BUILD_TESTS NO" "CXXOPTS_ENABLE_INSTALL YES"
|
||||||
"CXXOPTS_BUILD_EXAMPLES Off"
|
|
||||||
"CXXOPTS_BUILD_TESTS Off"
|
|
||||||
)
|
)
|
||||||
```
|
```
|
||||||
|
|
||||||
### [Yaml-cpp](https://github.com/jbeder/yaml-cpp)
|
### [Yaml-cpp](https://github.com/jbeder/yaml-cpp)
|
||||||
|
|
||||||
```CMake
|
```CMake
|
||||||
CPMAddPackage(
|
CPMAddPackage("gh:jbeder/yaml-cpp#yaml-cpp-0.6.3@0.6.3")
|
||||||
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"
|
|
||||||
)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### [google/benchmark](https://github.com/google/benchmark)
|
### [google/benchmark](https://github.com/google/benchmark)
|
||||||
@@ -298,14 +298,13 @@ CPMAddPackage(
|
|||||||
CPMAddPackage(
|
CPMAddPackage(
|
||||||
NAME benchmark
|
NAME benchmark
|
||||||
GITHUB_REPOSITORY google/benchmark
|
GITHUB_REPOSITORY google/benchmark
|
||||||
VERSION 1.4.1
|
VERSION 1.5.2
|
||||||
OPTIONS
|
OPTIONS "BENCHMARK_ENABLE_TESTING Off"
|
||||||
"BENCHMARK_ENABLE_TESTING Off"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
if (benchmark_ADDED)
|
if(benchmark_ADDED)
|
||||||
# compile with C++17
|
# enable c++11 to avoid compilation errors
|
||||||
set_target_properties(benchmark PROPERTIES CXX_STANDARD 17)
|
set_target_properties(benchmark PROPERTIES CXX_STANDARD 11)
|
||||||
endif()
|
endif()
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -371,4 +370,4 @@ For a full example on using CPM to download and configure lua with sol2 see [her
|
|||||||
|
|
||||||
### Full Examples
|
### Full Examples
|
||||||
|
|
||||||
See the [examples directory](https://github.com/TheLartians/CPM.cmake/tree/master/examples) for full examples with source code and check out the [wiki](https://github.com/TheLartians/CPM.cmake/wiki/More-Snippets) for many more example snippets.
|
See the [examples directory](https://github.com/cpm-cmake/CPM.cmake/tree/master/examples) for full examples with source code and check out the [wiki](https://github.com/cpm-cmake/CPM.cmake/wiki/More-Snippets) for many more example snippets.
|
||||||
|
|||||||
356
cmake/CPM.cmake
356
cmake/CPM.cmake
@@ -1,6 +1,6 @@
|
|||||||
# CPM.cmake - CMake's missing package manager
|
# CPM.cmake - CMake's missing package manager
|
||||||
# ===========================================
|
# ===========================================
|
||||||
# See https://github.com/TheLartians/CPM.cmake for usage and update instructions.
|
# See https://github.com/cpm-cmake/CPM.cmake for usage and update instructions.
|
||||||
#
|
#
|
||||||
# MIT License
|
# MIT License
|
||||||
# -----------
|
# -----------
|
||||||
@@ -38,9 +38,12 @@ if(CPM_DIRECTORY)
|
|||||||
"${CPM_INDENT} \
|
"${CPM_INDENT} \
|
||||||
A dependency is using a more recent CPM version (${CURRENT_CPM_VERSION}) than the current project (${CPM_VERSION}). \
|
A dependency is using a more recent CPM version (${CURRENT_CPM_VERSION}) than the current project (${CPM_VERSION}). \
|
||||||
It is recommended to upgrade CPM to the most recent version. \
|
It is recommended to upgrade CPM to the most recent version. \
|
||||||
See https://github.com/TheLartians/CPM.cmake for more information."
|
See https://github.com/cpm-cmake/CPM.cmake for more information."
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
if(${CMAKE_VERSION} VERSION_LESS "3.17.0")
|
||||||
|
include(FetchContent)
|
||||||
|
endif()
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -129,11 +132,71 @@ if(NOT CPM_DONT_CREATE_PACKAGE_LOCK)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
include(FetchContent)
|
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)
|
||||||
|
if("${URI}" MATCHES "([^/:]+)/?.git/?$")
|
||||||
|
set(${RESULT}
|
||||||
|
${CMAKE_MATCH_1}
|
||||||
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
unset(${RESULT} PARENT_SCOPE)
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# Try to infer package name and version from a url
|
||||||
|
function(cpm_package_name_and_ver_from_url url outName outVer)
|
||||||
|
if(url MATCHES "[/\\?]([a-zA-Z0-9_\\.-]+)\\.(tar|tar\\.gz|tar\\.bz2|zip|ZIP)(\\?|/|$)")
|
||||||
|
# We matched an archive
|
||||||
|
set(filename "${CMAKE_MATCH_1}")
|
||||||
|
|
||||||
|
if(filename MATCHES "([a-zA-Z0-9_\\.-]+)[_-]v?(([0-9]+\\.)*[0-9]+[a-zA-Z0-9]*)")
|
||||||
|
# We matched <name>-<version> (ie foo-1.2.3)
|
||||||
|
set(${outName}
|
||||||
|
"${CMAKE_MATCH_1}"
|
||||||
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
|
set(${outVer}
|
||||||
|
"${CMAKE_MATCH_2}"
|
||||||
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
|
elseif(filename MATCHES "(([0-9]+\\.)+[0-9]+[a-zA-Z0-9]*)")
|
||||||
|
# We couldn't find a name, but we found a version
|
||||||
|
#
|
||||||
|
# In many cases (which we don't handle here) the url would look something like
|
||||||
|
# `irrelevant/ACTUAL_PACKAGE_NAME/irrelevant/1.2.3.zip`. In such a case we can't possibly
|
||||||
|
# distinguish the package name from the irrelevant bits. Moreover if we try to match the
|
||||||
|
# package name from the filename, we'd get bogus at best.
|
||||||
|
unset(${outName} PARENT_SCOPE)
|
||||||
|
set(${outVer}
|
||||||
|
"${CMAKE_MATCH_1}"
|
||||||
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
# Boldly assume that the file name is the package name.
|
||||||
|
#
|
||||||
|
# Yes, something like `irrelevant/ACTUAL_NAME/irrelevant/download.zip` will ruin our day, but
|
||||||
|
# such cases should be quite rare. No popular service does this... we think.
|
||||||
|
set(${outName}
|
||||||
|
"${filename}"
|
||||||
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
|
unset(${outVer} PARENT_SCOPE)
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
# No ideas yet what to do with non-archives
|
||||||
|
unset(${outName} PARENT_SCOPE)
|
||||||
|
unset(${outVer} PARENT_SCOPE)
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
# Initialize logging prefix
|
# Initialize logging prefix
|
||||||
if(NOT CPM_INDENT)
|
if(NOT CPM_INDENT)
|
||||||
set(CPM_INDENT "CPM:")
|
set(CPM_INDENT
|
||||||
|
"CPM:"
|
||||||
|
CACHE INTERNAL ""
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
function(cpm_find_package NAME VERSION)
|
function(cpm_find_package NAME VERSION)
|
||||||
@@ -183,7 +246,7 @@ function(CPMFindPackage)
|
|||||||
return()
|
return()
|
||||||
endif()
|
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)
|
if(CPM_PACKAGE_ALREADY_ADDED)
|
||||||
cpm_export_variables(${CPM_ARGS_NAME})
|
cpm_export_variables(${CPM_ARGS_NAME})
|
||||||
return()
|
return()
|
||||||
@@ -199,7 +262,7 @@ function(CPMFindPackage)
|
|||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# checks if a package has been added before
|
# 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)
|
if("${CPM_ARGS_NAME}" IN_LIST CPM_PACKAGES)
|
||||||
CPMGetPackageVersion(${CPM_ARGS_NAME} CPM_PACKAGE_VERSION)
|
CPMGetPackageVersion(${CPM_ARGS_NAME} CPM_PACKAGE_VERSION)
|
||||||
if("${CPM_PACKAGE_VERSION}" VERSION_LESS "${CPM_ARGS_VERSION}")
|
if("${CPM_PACKAGE_VERSION}" VERSION_LESS "${CPM_ARGS_VERSION}")
|
||||||
@@ -208,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})."
|
"${CPM_INDENT} requires a newer version of ${CPM_ARGS_NAME} (${CPM_ARGS_VERSION}) than currently included (${CPM_PACKAGE_VERSION})."
|
||||||
)
|
)
|
||||||
endif()
|
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})
|
cpm_get_fetch_properties(${CPM_ARGS_NAME})
|
||||||
set(${CPM_ARGS_NAME}_ADDED NO)
|
set(${CPM_ARGS_NAME}_ADDED NO)
|
||||||
set(CPM_PACKAGE_ALREADY_ADDED
|
set(CPM_PACKAGE_ALREADY_ADDED
|
||||||
@@ -234,8 +286,80 @@ function(cpm_check_if_package_already_added CPM_ARGS_NAME CPM_ARGS_VERSION CPM_A
|
|||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
# Parse the argument of CPMAddPackage in case a single one was provided and convert it to a list of
|
||||||
|
# arguments which can then be parsed idiomatically. For example gh:foo/bar@1.2.3 will be converted
|
||||||
|
# to: GITHUB_REPOSITORY;foo/bar;VERSION;1.2.3
|
||||||
|
function(cpm_parse_add_package_single_arg arg outArgs)
|
||||||
|
# Look for a scheme
|
||||||
|
if("${arg}" MATCHES "^([a-zA-Z]+):(.+)$")
|
||||||
|
string(TOLOWER "${CMAKE_MATCH_1}" scheme)
|
||||||
|
set(uri "${CMAKE_MATCH_2}")
|
||||||
|
|
||||||
|
# Check for CPM-specific schemes
|
||||||
|
if(scheme STREQUAL "gh")
|
||||||
|
set(out "GITHUB_REPOSITORY;${uri}")
|
||||||
|
set(packageType "git")
|
||||||
|
elseif(scheme STREQUAL "gl")
|
||||||
|
set(out "GITLAB_REPOSITORY;${uri}")
|
||||||
|
set(packageType "git")
|
||||||
|
# A CPM-specific scheme was not found. Looks like this is a generic URL so try to determine
|
||||||
|
# type
|
||||||
|
elseif(arg MATCHES ".git/?(@|#|$)")
|
||||||
|
set(out "GIT_REPOSITORY;${arg}")
|
||||||
|
set(packageType "git")
|
||||||
|
else()
|
||||||
|
# Fall back to a URL
|
||||||
|
set(out "URL;${arg}")
|
||||||
|
set(packageType "archive")
|
||||||
|
|
||||||
|
# We could also check for SVN since FetchContent supports it, but SVN is so rare these days.
|
||||||
|
# We just won't bother with the additional complexity it will induce in this function. SVN is
|
||||||
|
# done by multi-arg
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
if(arg MATCHES ".git/?(@|#|$)")
|
||||||
|
set(out "GIT_REPOSITORY;${arg}")
|
||||||
|
set(packageType "git")
|
||||||
|
else()
|
||||||
|
# Give up
|
||||||
|
message(FATAL_ERROR "CPM: Can't determine package type of '${arg}'")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# For all packages we interpret @... as version. Only replace the last occurence. Thus URIs
|
||||||
|
# containing '@' can be used
|
||||||
|
string(REGEX REPLACE "@([^@]+)$" ";VERSION;\\1" out "${out}")
|
||||||
|
|
||||||
|
# Parse the rest according to package type
|
||||||
|
if(packageType STREQUAL "git")
|
||||||
|
# For git repos we interpret #... as a tag or branch or commit hash
|
||||||
|
string(REGEX REPLACE "#([^#]+)$" ";GIT_TAG;\\1" out "${out}")
|
||||||
|
elseif(packageType STREQUAL "archive")
|
||||||
|
# For archives we interpret #... as a URL hash.
|
||||||
|
string(REGEX REPLACE "#([^#]+)$" ";URL_HASH;\\1" out "${out}")
|
||||||
|
# We don't try to parse the version if it's not provided explicitly. cpm_get_version_from_url
|
||||||
|
# should do this at a later point
|
||||||
|
else()
|
||||||
|
# We should never get here. This is an assertion and hitting it means there's a bug in the code
|
||||||
|
# above. A packageType was set, but not handled by this if-else.
|
||||||
|
message(FATAL_ERROR "CPM: Unsupported package type '${packageType}' of '${arg}'")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(${outArgs}
|
||||||
|
${out}
|
||||||
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
# Download and add a package from source
|
# Download and add a package from source
|
||||||
function(CPMAddPackage)
|
function(CPMAddPackage)
|
||||||
|
list(LENGTH ARGN argnLength)
|
||||||
|
if(argnLength EQUAL 1)
|
||||||
|
cpm_parse_add_package_single_arg("${ARGN}" ARGN)
|
||||||
|
|
||||||
|
# The shorthand syntax implies EXCLUDE_FROM_ALL
|
||||||
|
set(ARGN "${ARGN};EXCLUDE_FROM_ALL;YES")
|
||||||
|
endif()
|
||||||
|
|
||||||
set(oneValueArgs
|
set(oneValueArgs
|
||||||
NAME
|
NAME
|
||||||
@@ -251,9 +375,11 @@ function(CPMAddPackage)
|
|||||||
FIND_PACKAGE_ARGUMENTS
|
FIND_PACKAGE_ARGUMENTS
|
||||||
NO_CACHE
|
NO_CACHE
|
||||||
GIT_SHALLOW
|
GIT_SHALLOW
|
||||||
|
EXCLUDE_FROM_ALL
|
||||||
|
SOURCE_SUBDIR
|
||||||
)
|
)
|
||||||
|
|
||||||
set(multiValueArgs OPTIONS)
|
set(multiValueArgs URL OPTIONS)
|
||||||
|
|
||||||
cmake_parse_arguments(CPM_ARGS "" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}")
|
cmake_parse_arguments(CPM_ARGS "" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}")
|
||||||
|
|
||||||
@@ -284,6 +410,11 @@ function(CPMAddPackage)
|
|||||||
if(NOT DEFINED CPM_ARGS_GIT_TAG)
|
if(NOT DEFINED CPM_ARGS_GIT_TAG)
|
||||||
set(CPM_ARGS_GIT_TAG v${CPM_ARGS_VERSION})
|
set(CPM_ARGS_GIT_TAG v${CPM_ARGS_VERSION})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# If a name wasn't provided, try to infer it from the git repo
|
||||||
|
if(NOT DEFINED CPM_ARGS_NAME)
|
||||||
|
cpm_package_name_from_git_uri(${CPM_ARGS_GIT_REPOSITORY} CPM_ARGS_NAME)
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(CPM_SKIP_FETCH FALSE)
|
set(CPM_SKIP_FETCH FALSE)
|
||||||
@@ -296,8 +427,35 @@ function(CPMAddPackage)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(DEFINED CPM_ARGS_URL)
|
||||||
|
# If a name or version aren't provided, try to infer them from the URL
|
||||||
|
list(GET CPM_ARGS_URL 0 firstUrl)
|
||||||
|
cpm_package_name_and_ver_from_url(${firstUrl} nameFromUrl verFromUrl)
|
||||||
|
# If we fail to obtain name and version from the first URL, we could try other URLs if any.
|
||||||
|
# However multiple URLs are expected to be quite rare, so for now we won't bother.
|
||||||
|
|
||||||
|
# If the caller provided their own name and version, they trump the inferred ones.
|
||||||
|
if(NOT DEFINED CPM_ARGS_NAME)
|
||||||
|
set(CPM_ARGS_NAME ${nameFromUrl})
|
||||||
|
endif()
|
||||||
|
if(NOT DEFINED CPM_ARGS_VERSION)
|
||||||
|
set(CPM_ARGS_VERSION ${verFromUrl})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS URL "${CPM_ARGS_URL}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Check for required arguments
|
||||||
|
|
||||||
|
if(NOT DEFINED CPM_ARGS_NAME)
|
||||||
|
message(
|
||||||
|
FATAL_ERROR
|
||||||
|
"CPM: 'NAME' was not provided and couldn't be automatically inferred for package added with arguments: '${ARGN}'"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
# Check if package has been added before
|
# 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)
|
if(CPM_PACKAGE_ALREADY_ADDED)
|
||||||
cpm_export_variables(${CPM_ARGS_NAME})
|
cpm_export_variables(${CPM_ARGS_NAME})
|
||||||
return()
|
return()
|
||||||
@@ -324,7 +482,7 @@ function(CPMAddPackage)
|
|||||||
CPMAddPackage(${declaration})
|
CPMAddPackage(${declaration})
|
||||||
cpm_export_variables(${CPM_ARGS_NAME})
|
cpm_export_variables(${CPM_ARGS_NAME})
|
||||||
# checking again to ensure version and option compatibility
|
# 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()
|
return()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -346,16 +504,6 @@ function(CPMAddPackage)
|
|||||||
|
|
||||||
CPMRegisterPackage("${CPM_ARGS_NAME}" "${CPM_ARGS_VERSION}")
|
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)
|
if(DEFINED CPM_ARGS_GIT_TAG)
|
||||||
set(PACKAGE_INFO "${CPM_ARGS_GIT_TAG}")
|
set(PACKAGE_INFO "${CPM_ARGS_GIT_TAG}")
|
||||||
elseif(DEFINED CPM_ARGS_SOURCE_DIR)
|
elseif(DEFINED CPM_ARGS_SOURCE_DIR)
|
||||||
@@ -380,9 +528,11 @@ function(CPMAddPackage)
|
|||||||
set(${CPM_ARGS_NAME}_BINARY_DIR ${CMAKE_BINARY_DIR}/_deps/${lower_case_name}-build)
|
set(${CPM_ARGS_NAME}_BINARY_DIR ${CMAKE_BINARY_DIR}/_deps/${lower_case_name}-build)
|
||||||
set(${CPM_ARGS_NAME}_ADDED YES)
|
set(${CPM_ARGS_NAME}_ADDED YES)
|
||||||
set(${CPM_ARGS_NAME}_SOURCE_DIR ${download_directory})
|
set(${CPM_ARGS_NAME}_SOURCE_DIR ${download_directory})
|
||||||
if(NOT CPM_ARGS_DOWNLOAD_ONLY AND EXISTS ${download_directory}/CMakeLists.txt)
|
cpm_add_subdirectory(
|
||||||
add_subdirectory(${download_directory} ${${CPM_ARGS_NAME}_BINARY_DIR})
|
"${CPM_ARGS_NAME}" "${DOWNLOAD_ONLY}"
|
||||||
endif()
|
"${${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(CPM_SKIP_FETCH TRUE)
|
||||||
set(PACKAGE_INFO "${PACKAGE_INFO} at ${download_directory}")
|
set(PACKAGE_INFO "${PACKAGE_INFO} at ${download_directory}")
|
||||||
else()
|
else()
|
||||||
@@ -421,7 +571,12 @@ function(CPMAddPackage)
|
|||||||
cpm_declare_fetch(
|
cpm_declare_fetch(
|
||||||
"${CPM_ARGS_NAME}" "${CPM_ARGS_VERSION}" "${PACKAGE_INFO}" "${CPM_ARGS_UNPARSED_ARGUMENTS}"
|
"${CPM_ARGS_NAME}" "${CPM_ARGS_VERSION}" "${PACKAGE_INFO}" "${CPM_ARGS_UNPARSED_ARGUMENTS}"
|
||||||
)
|
)
|
||||||
cpm_fetch_package("${CPM_ARGS_NAME}" "${DOWNLOAD_ONLY}")
|
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}")
|
cpm_get_fetch_properties("${CPM_ARGS_NAME}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -464,14 +619,16 @@ endmacro()
|
|||||||
|
|
||||||
function(cpm_add_to_package_lock Name)
|
function(cpm_add_to_package_lock Name)
|
||||||
if(NOT CPM_DONT_CREATE_PACKAGE_LOCK)
|
if(NOT CPM_DONT_CREATE_PACKAGE_LOCK)
|
||||||
file(APPEND ${CPM_PACKAGE_LOCK_FILE} "# ${Name}\nCPMDeclarePackage(${Name} \"${ARGN}\")\n")
|
cpm_prettify_package_arguments(PRETTY_ARGN false ${ARGN})
|
||||||
|
file(APPEND ${CPM_PACKAGE_LOCK_FILE} "# ${Name}\nCPMDeclarePackage(${Name}\n${PRETTY_ARGN})\n")
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
function(cpm_add_comment_to_package_lock Name)
|
function(cpm_add_comment_to_package_lock Name)
|
||||||
if(NOT CPM_DONT_CREATE_PACKAGE_LOCK)
|
if(NOT CPM_DONT_CREATE_PACKAGE_LOCK)
|
||||||
|
cpm_prettify_package_arguments(PRETTY_ARGN true ${ARGN})
|
||||||
file(APPEND ${CPM_PACKAGE_LOCK_FILE}
|
file(APPEND ${CPM_PACKAGE_LOCK_FILE}
|
||||||
"# ${Name} (unversioned)\n# CPMDeclarePackage(${Name} \"${ARGN}\")\n"
|
"# ${Name} (unversioned)\n# CPMDeclarePackage(${Name}\n${PRETTY_ARGN}#)\n"
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
@@ -542,24 +699,62 @@ function(cpm_get_fetch_properties PACKAGE)
|
|||||||
)
|
)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# downloads a previously declared package via FetchContent
|
# adds a package as a subdirectory if viable, according to provided options
|
||||||
function(cpm_fetch_package PACKAGE DOWNLOAD_ONLY)
|
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()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# 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})
|
if(${CPM_DRY_RUN})
|
||||||
message(STATUS "${CPM_INDENT} package ${PACKAGE} not fetched (dry run)")
|
message(STATUS "${CPM_INDENT} package ${PACKAGE} not fetched (dry run)")
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(DOWNLOAD_ONLY)
|
FetchContent_GetProperties(${PACKAGE})
|
||||||
FetchContent_GetProperties(${PACKAGE})
|
|
||||||
if(NOT ${PACKAGE}_POPULATED)
|
if(NOT ${lower_case_name}_POPULATED)
|
||||||
FetchContent_Populate(${PACKAGE})
|
FetchContent_Populate(${PACKAGE})
|
||||||
endif()
|
|
||||||
else()
|
|
||||||
set(CPM_OLD_INDENT "${CPM_INDENT}")
|
|
||||||
set(CPM_INDENT "${CPM_INDENT} ${PACKAGE}:")
|
|
||||||
FetchContent_MakeAvailable(${PACKAGE})
|
|
||||||
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()
|
endfunction()
|
||||||
|
|
||||||
# splits a package option
|
# splits a package option
|
||||||
@@ -625,3 +820,68 @@ function(cpm_is_git_tag_commit_hash GIT_TAG RESULT)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
function(cpm_prettify_package_arguments OUT_VAR IS_IN_COMMENT)
|
||||||
|
set(oneValueArgs
|
||||||
|
NAME
|
||||||
|
FORCE
|
||||||
|
VERSION
|
||||||
|
GIT_TAG
|
||||||
|
DOWNLOAD_ONLY
|
||||||
|
GITHUB_REPOSITORY
|
||||||
|
GITLAB_REPOSITORY
|
||||||
|
GIT_REPOSITORY
|
||||||
|
SOURCE_DIR
|
||||||
|
DOWNLOAD_COMMAND
|
||||||
|
FIND_PACKAGE_ARGUMENTS
|
||||||
|
NO_CACHE
|
||||||
|
GIT_SHALLOW
|
||||||
|
)
|
||||||
|
set(multiValueArgs OPTIONS)
|
||||||
|
cmake_parse_arguments(CPM_ARGS "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
|
||||||
|
|
||||||
|
foreach(oneArgName ${oneValueArgs})
|
||||||
|
if(DEFINED CPM_ARGS_${oneArgName})
|
||||||
|
if(${IS_IN_COMMENT})
|
||||||
|
string(APPEND PRETTY_OUT_VAR "#")
|
||||||
|
endif()
|
||||||
|
if(${oneArgName} STREQUAL "SOURCE_DIR")
|
||||||
|
string(REPLACE ${CMAKE_SOURCE_DIR} "\${CMAKE_SOURCE_DIR}" CPM_ARGS_${oneArgName}
|
||||||
|
${CPM_ARGS_${oneArgName}}
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
string(APPEND PRETTY_OUT_VAR " ${oneArgName} ${CPM_ARGS_${oneArgName}}\n")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
foreach(multiArgName ${multiValueArgs})
|
||||||
|
if(DEFINED CPM_ARGS_${multiArgName})
|
||||||
|
if(${IS_IN_COMMENT})
|
||||||
|
string(APPEND PRETTY_OUT_VAR "#")
|
||||||
|
endif()
|
||||||
|
string(APPEND PRETTY_OUT_VAR " ${multiArgName}\n")
|
||||||
|
foreach(singleOption ${CPM_ARGS_${multiArgName}})
|
||||||
|
if(${IS_IN_COMMENT})
|
||||||
|
string(APPEND PRETTY_OUT_VAR "#")
|
||||||
|
endif()
|
||||||
|
string(APPEND PRETTY_OUT_VAR " \"${singleOption}\"\n")
|
||||||
|
endforeach()
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
if(NOT "${CPM_ARGS_UNPARSED_ARGUMENTS}" STREQUAL "")
|
||||||
|
if(${IS_IN_COMMENT})
|
||||||
|
string(APPEND PRETTY_OUT_VAR "#")
|
||||||
|
endif()
|
||||||
|
string(APPEND PRETTY_OUT_VAR " ")
|
||||||
|
foreach(CPM_ARGS_UNPARSED_ARGUMENT ${CPM_ARGS_UNPARSED_ARGUMENTS})
|
||||||
|
string(APPEND PRETTY_OUT_VAR " ${CPM_ARGS_UNPARSED_ARGUMENT}")
|
||||||
|
endforeach()
|
||||||
|
string(APPEND PRETTY_OUT_VAR "\n")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(${OUT_VAR}
|
||||||
|
${PRETTY_OUT_VAR}
|
||||||
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
|
|
||||||
|
endfunction()
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
set(CPM_DOWNLOAD_VERSION 1.0.0-development-version)
|
set(CPM_DOWNLOAD_VERSION 1.0.0-development-version)
|
||||||
|
|
||||||
if(CPM_SOURCE_CACHE)
|
if(CPM_SOURCE_CACHE)
|
||||||
|
# Expand relative path. This is important if the provided path contains a tilde (~)
|
||||||
|
get_filename_component(CPM_SOURCE_CACHE ${CPM_SOURCE_CACHE} ABSOLUTE)
|
||||||
set(CPM_DOWNLOAD_LOCATION "${CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
|
set(CPM_DOWNLOAD_LOCATION "${CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
|
||||||
elseif(DEFINED ENV{CPM_SOURCE_CACHE})
|
elseif(DEFINED ENV{CPM_SOURCE_CACHE})
|
||||||
set(CPM_DOWNLOAD_LOCATION "$ENV{CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
|
set(CPM_DOWNLOAD_LOCATION "$ENV{CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
|
||||||
@@ -11,7 +13,7 @@ endif()
|
|||||||
if(NOT (EXISTS ${CPM_DOWNLOAD_LOCATION}))
|
if(NOT (EXISTS ${CPM_DOWNLOAD_LOCATION}))
|
||||||
message(STATUS "Downloading CPM.cmake to ${CPM_DOWNLOAD_LOCATION}")
|
message(STATUS "Downloading CPM.cmake to ${CPM_DOWNLOAD_LOCATION}")
|
||||||
file(DOWNLOAD
|
file(DOWNLOAD
|
||||||
https://github.com/TheLartians/CPM.cmake/releases/download/v${CPM_DOWNLOAD_VERSION}/CPM.cmake
|
https://github.com/cpm-cmake/CPM.cmake/releases/download/v${CPM_DOWNLOAD_VERSION}/CPM.cmake
|
||||||
${CPM_DOWNLOAD_LOCATION}
|
${CPM_DOWNLOAD_LOCATION}
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -3,13 +3,25 @@ function(ASSERT_EQUAL)
|
|||||||
message(FATAL_ERROR "assertion failed: invalid argument count: ${ARGC}")
|
message(FATAL_ERROR "assertion failed: invalid argument count: ${ARGC}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT ${ARGV0} STREQUAL ${ARGV1})
|
if(NOT "${ARGV0}" STREQUAL "${ARGV1}")
|
||||||
message(FATAL_ERROR "assertion failed: '${ARGV0}' != '${ARGV1}'")
|
message(FATAL_ERROR "assertion failed: '${ARGV0}' != '${ARGV1}'")
|
||||||
else()
|
else()
|
||||||
message(STATUS "test passed: '${ARGV0}' == '${ARGV1}'")
|
message(STATUS "test passed: '${ARGV0}' == '${ARGV1}'")
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
function(ASSERT_NOT_EQUAL)
|
||||||
|
if(NOT ARGC EQUAL 2)
|
||||||
|
message(FATAL_ERROR "assertion failed: invalid argument count: ${ARGC}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if("${ARGV0}" STREQUAL "${ARGV1}")
|
||||||
|
message(FATAL_ERROR "assertion failed: '${ARGV0}' == '${ARGV1}'")
|
||||||
|
else()
|
||||||
|
message(STATUS "test passed: '${ARGV0}' != '${ARGV1}'")
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
function(ASSERT_EMPTY)
|
function(ASSERT_EMPTY)
|
||||||
if(NOT ARGC EQUAL 0)
|
if(NOT ARGC EQUAL 0)
|
||||||
message(FATAL_ERROR "assertion failed: input ${ARGC} not empty: '${ARGV}'")
|
message(FATAL_ERROR "assertion failed: input ${ARGC} not empty: '${ARGV}'")
|
||||||
@@ -24,11 +36,27 @@ function(ASSERT_DEFINED KEY)
|
|||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
function(ASSERT_NOT_DEFINED KEY)
|
||||||
|
if(DEFINED ${KEY})
|
||||||
|
message(FATAL_ERROR "assertion failed: '${KEY}' is defiend (${${KEY}})")
|
||||||
|
else()
|
||||||
|
message(STATUS "test passed: '${KEY}' is not defined")
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
function(ASSERT_TRUTHY KEY)
|
function(ASSERT_TRUTHY KEY)
|
||||||
if(${${KEY}})
|
if(${${KEY}})
|
||||||
message(STATUS "test passed: '${KEY}' is set truthy")
|
message(STATUS "test passed: '${KEY}' is set truthy")
|
||||||
else()
|
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()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
|||||||
@@ -8,12 +8,7 @@ include(../../cmake/CPM.cmake)
|
|||||||
|
|
||||||
find_package(Threads REQUIRED)
|
find_package(Threads REQUIRED)
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage("gh:chriskohlhoff/asio#asio-1-18-1@1.18.1")
|
||||||
NAME asio
|
|
||||||
VERSION 1.16.1
|
|
||||||
GITHUB_REPOSITORY chriskohlhoff/asio
|
|
||||||
GIT_TAG asio-1-16-1 # asio uses non-standard version tag, we must specify GIT_TAG
|
|
||||||
)
|
|
||||||
|
|
||||||
# ASIO doesn't use CMake, we have to configure it manually. Extra notes for using on Windows:
|
# ASIO doesn't use CMake, we have to configure it manually. Extra notes for using on Windows:
|
||||||
#
|
#
|
||||||
@@ -24,7 +19,7 @@ CPMAddPackage(
|
|||||||
if(asio_ADDED)
|
if(asio_ADDED)
|
||||||
add_library(asio INTERFACE)
|
add_library(asio INTERFACE)
|
||||||
|
|
||||||
target_include_directories(asio INTERFACE ${asio_SOURCE_DIR}/asio/include)
|
target_include_directories(asio SYSTEM INTERFACE ${asio_SOURCE_DIR}/asio/include)
|
||||||
|
|
||||||
target_compile_definitions(asio INTERFACE ASIO_STANDALONE ASIO_NO_DEPRECATED)
|
target_compile_definitions(asio INTERFACE ASIO_STANDALONE ASIO_NO_DEPRECATED)
|
||||||
|
|
||||||
@@ -65,3 +60,4 @@ endif()
|
|||||||
|
|
||||||
add_executable(CPMExampleASIOStandalone main.cpp)
|
add_executable(CPMExampleASIOStandalone main.cpp)
|
||||||
target_link_libraries(CPMExampleASIOStandalone asio)
|
target_link_libraries(CPMExampleASIOStandalone asio)
|
||||||
|
target_compile_features(CPMExampleASIOStandalone PRIVATE cxx_std_11)
|
||||||
|
|||||||
@@ -6,26 +6,22 @@ project(CPMExampleBenchmark)
|
|||||||
|
|
||||||
include(../../cmake/CPM.cmake)
|
include(../../cmake/CPM.cmake)
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage("gh:cpm-cmake/testpack-fibonacci@2.0")
|
||||||
NAME fibonacci
|
|
||||||
GITLAB_REPOSITORY TheLartians/Fibonacci
|
|
||||||
VERSION 2.0
|
|
||||||
)
|
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage(
|
||||||
NAME benchmark
|
NAME benchmark
|
||||||
GITHUB_REPOSITORY google/benchmark
|
GITHUB_REPOSITORY google/benchmark
|
||||||
VERSION 1.5.0
|
VERSION 1.5.2
|
||||||
OPTIONS "BENCHMARK_ENABLE_TESTING Off"
|
OPTIONS "BENCHMARK_ENABLE_TESTING Off"
|
||||||
)
|
)
|
||||||
|
|
||||||
if(benchmark_ADDED)
|
if(benchmark_ADDED)
|
||||||
# patch google benchmark target
|
# enable c++11 to avoid compilation errors
|
||||||
set_target_properties(benchmark PROPERTIES CXX_STANDARD 17)
|
set_target_properties(benchmark PROPERTIES CXX_STANDARD 11)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# ---- Executable ----
|
# ---- Executable ----
|
||||||
|
|
||||||
add_executable(CPMExampleBenchmark "main.cpp")
|
add_executable(CPMExampleBenchmark "main.cpp")
|
||||||
set_target_properties(CPMExampleBenchmark PROPERTIES CXX_STANDARD 17)
|
|
||||||
target_link_libraries(CPMExampleBenchmark fibonacci benchmark)
|
target_link_libraries(CPMExampleBenchmark fibonacci benchmark)
|
||||||
|
target_compile_features(CPMExampleBenchmark PRIVATE cxx_std_17)
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ project(CPMExampleBoost)
|
|||||||
# ---- Create binary ----
|
# ---- Create binary ----
|
||||||
|
|
||||||
add_executable(CPMExampleBoost main.cpp)
|
add_executable(CPMExampleBoost main.cpp)
|
||||||
set_target_properties(CPMExampleBoost PROPERTIES CXX_STANDARD 17)
|
target_compile_features(CPMExampleBoost PRIVATE cxx_std_17)
|
||||||
|
|
||||||
# ---- Dependencies ----
|
# ---- Dependencies ----
|
||||||
|
|
||||||
@@ -15,7 +15,10 @@ CPMFindPackage(
|
|||||||
NAME Boost
|
NAME Boost
|
||||||
GITHUB_REPOSITORY Orphis/boost-cmake
|
GITHUB_REPOSITORY Orphis/boost-cmake
|
||||||
VERSION 1.67.0
|
VERSION 1.67.0
|
||||||
|
# setting FIND_PACKAGE_ARGUMENTS allow usage with `CPM_USE_LOCAL_PACKAGES`
|
||||||
FIND_PACKAGE_ARGUMENTS "COMPONENTS system"
|
FIND_PACKAGE_ARGUMENTS "COMPONENTS system"
|
||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(CPMExampleBoost PRIVATE Boost::system pthread)
|
find_package(Threads REQUIRED)
|
||||||
|
|
||||||
|
target_link_libraries(CPMExampleBoost PRIVATE Boost::system Threads::Threads)
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from subprocess import PIPE, run
|
from subprocess import PIPE, run
|
||||||
|
|
||||||
@@ -9,14 +11,16 @@ examples = [
|
|||||||
|
|
||||||
assert(len(examples) > 0)
|
assert(len(examples) > 0)
|
||||||
|
|
||||||
|
|
||||||
def runCommand(command):
|
def runCommand(command):
|
||||||
print('- %s' % command)
|
print('- %s' % command)
|
||||||
result = run(command, stdout=PIPE, stderr=PIPE, universal_newlines=True, shell=True)
|
result = run(command, stdout=PIPE, stderr=PIPE, universal_newlines=True, shell=True)
|
||||||
if result.returncode != 0:
|
if result.returncode != 0:
|
||||||
print("error while running '%s':\n" % command, ' ' + str(result.stderr).replace('\n','\n '))
|
print("error while running '%s':\n" % command, ' ' + str(result.stderr).replace('\n', '\n '))
|
||||||
exit(result.returncode)
|
exit(result.returncode)
|
||||||
return result.stdout
|
return result.stdout
|
||||||
|
|
||||||
|
|
||||||
print('')
|
print('')
|
||||||
for example in examples:
|
for example in examples:
|
||||||
print("running example %s" % example.name)
|
print("running example %s" % example.name)
|
||||||
@@ -24,6 +28,6 @@ for example in examples:
|
|||||||
project = Path(".") / 'build' / example.name
|
project = Path(".") / 'build' / example.name
|
||||||
configure = runCommand('cmake -H%s -B%s' % (example, project))
|
configure = runCommand('cmake -H%s -B%s' % (example, project))
|
||||||
print(' ' + '\n '.join([line for line in configure.split('\n') if 'CPM:' in line]))
|
print(' ' + '\n '.join([line for line in configure.split('\n') if 'CPM:' in line]))
|
||||||
build = runCommand('cmake --build %s -j4' % (project))
|
build = runCommand('cmake --build %s -- -j%i' % (project, os.cpu_count() / 2))
|
||||||
print(' ' + '\n '.join([line for line in build.split('\n') if 'Built target' in line]))
|
print(' ' + '\n '.join([line for line in build.split('\n') if 'Built target' in line]))
|
||||||
print('')
|
print('')
|
||||||
|
|||||||
@@ -6,23 +6,14 @@ project(CPMExampleCatch2)
|
|||||||
|
|
||||||
include(../../cmake/CPM.cmake)
|
include(../../cmake/CPM.cmake)
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage("gh:cpm-cmake/testpack-fibonacci@2.0")
|
||||||
NAME fibonacci
|
CPMAddPackage("gh:catchorg/Catch2@2.13.4")
|
||||||
GITHUB_REPOSITORY TheLartians/Fibonacci
|
|
||||||
VERSION 2.0
|
|
||||||
)
|
|
||||||
|
|
||||||
CPMAddPackage(
|
|
||||||
NAME Catch2
|
|
||||||
GITHUB_REPOSITORY catchorg/Catch2
|
|
||||||
VERSION 2.5.0
|
|
||||||
)
|
|
||||||
|
|
||||||
# ---- Create binary ----
|
# ---- Create binary ----
|
||||||
|
|
||||||
add_executable(CPMExampleCatch2 main.cpp)
|
add_executable(CPMExampleCatch2 main.cpp)
|
||||||
target_link_libraries(CPMExampleCatch2 fibonacci Catch2)
|
target_link_libraries(CPMExampleCatch2 fibonacci Catch2)
|
||||||
set_target_properties(CPMExampleCatch2 PROPERTIES CXX_STANDARD 17)
|
target_compile_features(CPMExampleCatch2 PRIVATE cxx_std_17)
|
||||||
|
|
||||||
# ---- Enable testing ----
|
# ---- Enable testing ----
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ include(../../cmake/CPM.cmake)
|
|||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage(
|
||||||
NAME cereal
|
NAME cereal
|
||||||
VERSION 1.2.2
|
VERSION 1.3.0
|
||||||
GITHUB_REPOSITORY USCiLab/cereal
|
GITHUB_REPOSITORY USCiLab/cereal
|
||||||
OPTIONS "SKIP_PORTABILITY_TEST ON" "JUST_INSTALL_CEREAL ON"
|
OPTIONS "SKIP_PORTABILITY_TEST ON" "JUST_INSTALL_CEREAL ON"
|
||||||
)
|
)
|
||||||
@@ -17,4 +17,4 @@ CPMAddPackage(
|
|||||||
|
|
||||||
add_executable(CPMExampleCereal main.cpp)
|
add_executable(CPMExampleCereal main.cpp)
|
||||||
target_link_libraries(CPMExampleCereal cereal)
|
target_link_libraries(CPMExampleCereal cereal)
|
||||||
set_target_properties(CPMExampleCereal PROPERTIES CXX_STANDARD 17)
|
target_compile_features(CPMExampleCereal PRIVATE cxx_std_17)
|
||||||
|
|||||||
@@ -6,15 +6,10 @@ project(CPMExampleCXXOpts)
|
|||||||
|
|
||||||
include(../../cmake/CPM.cmake)
|
include(../../cmake/CPM.cmake)
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage("gh:jarro2783/cxxopts@2.2.0")
|
||||||
NAME cxxopts
|
|
||||||
GITHUB_REPOSITORY jarro2783/cxxopts
|
|
||||||
VERSION 2.2.0
|
|
||||||
OPTIONS "CXXOPTS_BUILD_EXAMPLES Off" "CXXOPTS_BUILD_TESTS Off"
|
|
||||||
)
|
|
||||||
|
|
||||||
# ---- Create binary ----
|
# ---- Create binary ----
|
||||||
|
|
||||||
add_executable(CPMExampleCXXOpts main.cpp)
|
add_executable(CPMExampleCXXOpts main.cpp)
|
||||||
target_link_libraries(CPMExampleCXXOpts cxxopts)
|
target_link_libraries(CPMExampleCXXOpts cxxopts)
|
||||||
set_target_properties(CPMExampleCXXOpts PROPERTIES CXX_STANDARD 17)
|
target_compile_features(CPMExampleCXXOpts PRIVATE cxx_std_17)
|
||||||
|
|||||||
@@ -6,23 +6,14 @@ project(CPMExampleDoctest)
|
|||||||
|
|
||||||
include(../../cmake/CPM.cmake)
|
include(../../cmake/CPM.cmake)
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage("gh:cpm-cmake/testpack-fibonacci@2.0")
|
||||||
NAME fibonacci
|
CPMAddPackage("gh:onqtam/doctest#2.4.5")
|
||||||
GITLAB_REPOSITORY TheLartians/Fibonacci
|
|
||||||
VERSION 2.0
|
|
||||||
)
|
|
||||||
|
|
||||||
CPMAddPackage(
|
|
||||||
NAME doctest
|
|
||||||
GITHUB_REPOSITORY onqtam/doctest
|
|
||||||
GIT_TAG 2.3.2
|
|
||||||
)
|
|
||||||
|
|
||||||
# ---- Create binary ----
|
# ---- Create binary ----
|
||||||
|
|
||||||
add_executable(CPMExampleDoctest main.cpp)
|
add_executable(CPMExampleDoctest main.cpp)
|
||||||
target_link_libraries(CPMExampleDoctest fibonacci doctest)
|
target_link_libraries(CPMExampleDoctest fibonacci doctest)
|
||||||
set_target_properties(CPMExampleDoctest PROPERTIES CXX_STANDARD 17)
|
target_compile_features(CPMExampleDoctest PRIVATE cxx_std_17)
|
||||||
|
|
||||||
# ---- Enable testing ----
|
# ---- Enable testing ----
|
||||||
|
|
||||||
|
|||||||
@@ -16,11 +16,11 @@ CPMAddPackage(
|
|||||||
|
|
||||||
if(EnTT_ADDED)
|
if(EnTT_ADDED)
|
||||||
add_library(EnTT INTERFACE)
|
add_library(EnTT INTERFACE)
|
||||||
target_include_directories(EnTT INTERFACE ${EnTT_SOURCE_DIR}/src)
|
target_include_directories(EnTT SYSTEM INTERFACE ${EnTT_SOURCE_DIR}/src)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# ---- Executable ----
|
# ---- Executable ----
|
||||||
|
|
||||||
add_executable(CPMEnTTExample "main.cpp")
|
add_executable(CPMEnTTExample main.cpp)
|
||||||
set_target_properties(CPMEnTTExample PROPERTIES CXX_STANDARD 17)
|
target_compile_features(CPMEnTTExample PRIVATE cxx_std_17)
|
||||||
target_link_libraries(CPMEnTTExample EnTT)
|
target_link_libraries(CPMEnTTExample EnTT)
|
||||||
|
|||||||
@@ -6,14 +6,10 @@ project(CPMJSONExample)
|
|||||||
|
|
||||||
include(../../cmake/CPM.cmake)
|
include(../../cmake/CPM.cmake)
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage("gh:fmtlib/fmt#7.1.3")
|
||||||
NAME fmt
|
|
||||||
GIT_TAG 6.1.2
|
|
||||||
GITHUB_REPOSITORY fmtlib/fmt
|
|
||||||
)
|
|
||||||
|
|
||||||
# ---- Executable ----
|
# ---- Executable ----
|
||||||
|
|
||||||
add_executable(CPMFmtExample "main.cpp")
|
add_executable(CPMFmtExample main.cpp)
|
||||||
set_target_properties(CPMFmtExample PROPERTIES CXX_STANDARD 17)
|
target_compile_features(CPMFmtExample PRIVATE cxx_std_17)
|
||||||
target_link_libraries(CPMFmtExample fmt)
|
target_link_libraries(CPMFmtExample fmt)
|
||||||
|
|||||||
@@ -6,17 +6,13 @@ project(CPMExampleGtest)
|
|||||||
|
|
||||||
include(../../cmake/CPM.cmake)
|
include(../../cmake/CPM.cmake)
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage("gh:cpm-cmake/testpack-fibonacci@2.0")
|
||||||
NAME fibonacci
|
|
||||||
GITLAB_REPOSITORY TheLartians/Fibonacci
|
|
||||||
VERSION 2.0
|
|
||||||
)
|
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage(
|
||||||
NAME googletest
|
NAME googletest
|
||||||
GITHUB_REPOSITORY google/googletest
|
GITHUB_REPOSITORY google/googletest
|
||||||
GIT_TAG release-1.8.1
|
GIT_TAG release-1.10.0
|
||||||
VERSION 1.8.1
|
VERSION 1.10.0
|
||||||
OPTIONS "INSTALL_GTEST OFF" "gtest_force_shared_crt"
|
OPTIONS "INSTALL_GTEST OFF" "gtest_force_shared_crt"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -24,7 +20,7 @@ CPMAddPackage(
|
|||||||
|
|
||||||
add_executable(CPMExampleGtest main.cpp)
|
add_executable(CPMExampleGtest main.cpp)
|
||||||
target_link_libraries(CPMExampleGtest fibonacci gtest gtest_main gmock)
|
target_link_libraries(CPMExampleGtest fibonacci gtest gtest_main gmock)
|
||||||
set_target_properties(CPMExampleGtest PROPERTIES CXX_STANDARD 17)
|
target_compile_features(CPMExampleGtest PRIVATE cxx_std_17)
|
||||||
|
|
||||||
# ---- Enable testing ----
|
# ---- Enable testing ----
|
||||||
|
|
||||||
|
|||||||
@@ -8,19 +8,19 @@ include(../../cmake/CPM.cmake)
|
|||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage(
|
||||||
NAME nlohmann_json
|
NAME nlohmann_json
|
||||||
VERSION 3.6.1
|
VERSION 3.9.1
|
||||||
# not using the repo as it takes forever to clone
|
# not using the repo as it takes forever to clone
|
||||||
URL https://github.com/nlohmann/json/releases/download/v3.6.1/include.zip
|
URL https://github.com/nlohmann/json/releases/download/v3.9.1/include.zip
|
||||||
URL_HASH SHA256=69cc88207ce91347ea530b227ff0776db82dcb8de6704e1a3d74f4841bc651cf
|
URL_HASH SHA256=6bea5877b1541d353bd77bdfbdb2696333ae5ed8f9e8cc22df657192218cad91
|
||||||
)
|
)
|
||||||
|
|
||||||
if(nlohmann_json_ADDED)
|
if(nlohmann_json_ADDED)
|
||||||
add_library(nlohmann_json INTERFACE)
|
add_library(nlohmann_json INTERFACE)
|
||||||
target_include_directories(nlohmann_json INTERFACE ${nlohmann_json_SOURCE_DIR})
|
target_include_directories(nlohmann_json SYSTEM INTERFACE ${nlohmann_json_SOURCE_DIR}/include)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# ---- Executable ----
|
# ---- Executable ----
|
||||||
|
|
||||||
add_executable(CPMJSONExample "main.cpp")
|
add_executable(CPMJSONExample main.cpp)
|
||||||
set_target_properties(CPMJSONExample PROPERTIES CXX_STANDARD 17)
|
target_compile_features(CPMJSONExample PRIVATE cxx_std_17)
|
||||||
target_link_libraries(CPMJSONExample nlohmann_json)
|
target_link_libraries(CPMJSONExample nlohmann_json)
|
||||||
|
|||||||
@@ -6,19 +6,15 @@ project(CPMlinenoiseExample)
|
|||||||
|
|
||||||
include(../../cmake/CPM.cmake)
|
include(../../cmake/CPM.cmake)
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage("gh:antirez/linenoise#1.0")
|
||||||
NAME linenoise
|
|
||||||
GIT_TAG 1.0
|
|
||||||
GITHUB_REPOSITORY antirez/linenoise
|
|
||||||
)
|
|
||||||
|
|
||||||
if(linenoise_ADDED)
|
if(linenoise_ADDED)
|
||||||
add_library(linenoise ${linenoise_SOURCE_DIR}/linenoise.c)
|
add_library(linenoise ${linenoise_SOURCE_DIR}/linenoise.c)
|
||||||
target_include_directories(linenoise PUBLIC ${linenoise_SOURCE_DIR})
|
target_include_directories(linenoise SYSTEM PUBLIC ${linenoise_SOURCE_DIR})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# ---- Executable ----
|
# ---- Executable ----
|
||||||
|
|
||||||
add_executable(CPMlinenoiseExample "main.cpp")
|
add_executable(CPMlinenoiseExample main.cpp)
|
||||||
set_target_properties(CPMlinenoiseExample PROPERTIES CXX_STANDARD 17)
|
target_compile_features(CPMlinenoiseExample PRIVATE cxx_std_17)
|
||||||
target_link_libraries(CPMlinenoiseExample linenoise)
|
target_link_libraries(CPMlinenoiseExample linenoise)
|
||||||
|
|||||||
@@ -8,19 +8,19 @@ include(../../cmake/CPM.cmake)
|
|||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage(
|
||||||
NAME range-v3
|
NAME range-v3
|
||||||
URL https://github.com/ericniebler/range-v3/archive/0.5.0.zip
|
URL https://github.com/ericniebler/range-v3/archive/0.11.0.zip
|
||||||
VERSION 0.5.0
|
VERSION 0.11.0
|
||||||
# the range-v3 CMakeLists screws with configuration options
|
# the range-v3 CMakeLists screws with configuration options
|
||||||
DOWNLOAD_ONLY True
|
DOWNLOAD_ONLY True
|
||||||
)
|
)
|
||||||
|
|
||||||
if(range-v3_ADDED)
|
if(range-v3_ADDED)
|
||||||
add_library(range-v3 INTERFACE IMPORTED)
|
add_library(range-v3 INTERFACE IMPORTED)
|
||||||
target_include_directories(range-v3 INTERFACE "${range-v3_SOURCE_DIR}/include")
|
target_include_directories(range-v3 SYSTEM INTERFACE "${range-v3_SOURCE_DIR}/include")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# ---- Executable ----
|
# ---- Executable ----
|
||||||
|
|
||||||
add_executable(CPMRangev3Example "main.cpp")
|
add_executable(CPMRangev3Example main.cpp)
|
||||||
set_target_properties(CPMRangev3Example PROPERTIES CXX_STANDARD 17)
|
target_compile_features(CPMRangev3Example PRIVATE cxx_std_17)
|
||||||
target_link_libraries(CPMRangev3Example range-v3)
|
target_link_libraries(CPMRangev3Example range-v3)
|
||||||
|
|||||||
@@ -15,11 +15,11 @@ CPMAddPackage(
|
|||||||
|
|
||||||
if(simple_match_ADDED)
|
if(simple_match_ADDED)
|
||||||
add_library(simple_match INTERFACE IMPORTED)
|
add_library(simple_match INTERFACE IMPORTED)
|
||||||
target_include_directories(simple_match INTERFACE "${simple_match_SOURCE_DIR}/include")
|
target_include_directories(simple_match SYSTEM INTERFACE "${simple_match_SOURCE_DIR}/include")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# ---- Executable ----
|
# ---- Executable ----
|
||||||
|
|
||||||
add_executable(CPMSimpleMatchExample "main.cpp")
|
add_executable(CPMSimpleMatchExample main.cpp)
|
||||||
set_target_properties(CPMSimpleMatchExample PROPERTIES CXX_STANDARD 17)
|
target_compile_features(CPMSimpleMatchExample PRIVATE cxx_std_17)
|
||||||
target_link_libraries(CPMSimpleMatchExample simple_match)
|
target_link_libraries(CPMSimpleMatchExample simple_match)
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ if(lua_ADDED)
|
|||||||
list(REMOVE_ITEM lua_sources "${lua_SOURCE_DIR}/lua.c" "${lua_SOURCE_DIR}/luac.c")
|
list(REMOVE_ITEM lua_sources "${lua_SOURCE_DIR}/lua.c" "${lua_SOURCE_DIR}/luac.c")
|
||||||
add_library(lua STATIC ${lua_sources})
|
add_library(lua STATIC ${lua_sources})
|
||||||
|
|
||||||
target_include_directories(lua PUBLIC $<BUILD_INTERFACE:${lua_SOURCE_DIR}>)
|
target_include_directories(lua SYSTEM PUBLIC $<BUILD_INTERFACE:${lua_SOURCE_DIR}>)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage(
|
||||||
@@ -32,12 +32,12 @@ CPMAddPackage(
|
|||||||
|
|
||||||
if(sol2_ADDED)
|
if(sol2_ADDED)
|
||||||
add_library(sol2 INTERFACE IMPORTED)
|
add_library(sol2 INTERFACE IMPORTED)
|
||||||
target_include_directories(sol2 INTERFACE ${sol2_SOURCE_DIR}/include)
|
target_include_directories(sol2 SYSTEM INTERFACE ${sol2_SOURCE_DIR}/include)
|
||||||
target_link_libraries(sol2 INTERFACE lua)
|
target_link_libraries(sol2 INTERFACE lua)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# ---- Executable ----
|
# ---- Executable ----
|
||||||
|
|
||||||
add_executable(CPMSol2Example "main.cpp")
|
add_executable(CPMSol2Example main.cpp)
|
||||||
set_target_properties(CPMSol2Example PROPERTIES CXX_STANDARD 17)
|
target_compile_features(CPMSol2Example PRIVATE cxx_std_17)
|
||||||
target_link_libraries(CPMSol2Example sol2)
|
target_link_libraries(CPMSol2Example sol2)
|
||||||
|
|||||||
@@ -6,14 +6,10 @@ project(CPMSpdlogExample)
|
|||||||
|
|
||||||
include(../../cmake/CPM.cmake)
|
include(../../cmake/CPM.cmake)
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage("gh:gabime/spdlog@1.8.2")
|
||||||
NAME spdlog
|
|
||||||
GITHUB_REPOSITORY gabime/spdlog
|
|
||||||
VERSION 1.7.0
|
|
||||||
)
|
|
||||||
|
|
||||||
# ---- Executable ----
|
# ---- Executable ----
|
||||||
|
|
||||||
add_executable(CPMSpdlogExample "main.cpp")
|
add_executable(CPMSpdlogExample main.cpp)
|
||||||
set_target_properties(CPMSpdlogExample PROPERTIES CXX_STANDARD 17)
|
target_compile_features(CPMSpdlogExample PRIVATE cxx_std_17)
|
||||||
target_link_libraries(CPMSpdlogExample spdlog)
|
target_link_libraries(CPMSpdlogExample spdlog)
|
||||||
|
|||||||
@@ -6,18 +6,10 @@ project(CPMYamlExample)
|
|||||||
|
|
||||||
include(../../cmake/CPM.cmake)
|
include(../../cmake/CPM.cmake)
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage("gh:jbeder/yaml-cpp#yaml-cpp-0.6.3@0.6.3")
|
||||||
NAME yaml-cpp
|
|
||||||
GIT_REPOSITORY https://github.com/jbeder/yaml-cpp.git
|
|
||||||
# 0.6.2 uses deprecated CMake syntax
|
|
||||||
VERSION 0.6.3
|
|
||||||
# 0.6.3 is not released yet, so use the most recent commit
|
|
||||||
GIT_TAG 012269756149ae99745b6dafefd415843d7420bb
|
|
||||||
OPTIONS "YAML_CPP_BUILD_TESTS Off" "YAML_CPP_BUILD_CONTRIB Off" "YAML_CPP_BUILD_TOOLS Off"
|
|
||||||
)
|
|
||||||
|
|
||||||
# ---- Executable ----
|
# ---- Executable ----
|
||||||
|
|
||||||
add_executable(CPMYamlExample "main.cpp")
|
add_executable(CPMYamlExample main.cpp)
|
||||||
set_target_properties(CPMYamlExample PROPERTIES CXX_STANDARD 17)
|
target_compile_features(CPMYamlExample PRIVATE cxx_std_17)
|
||||||
target_link_libraries(CPMYamlExample yaml-cpp)
|
target_link_libraries(CPMYamlExample yaml-cpp)
|
||||||
|
|||||||
2
test/unit/broken_dependency/.gitignore
vendored
Normal file
2
test/unit/broken_dependency/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/CMakeLists.txt
|
||||||
|
/package-lock.cmake
|
||||||
13
test/unit/broken_dependency/CMakeLists.txt.in
Normal file
13
test/unit/broken_dependency/CMakeLists.txt.in
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||||
|
|
||||||
|
project(CPMTest)
|
||||||
|
|
||||||
|
# ---- Dependencies ----
|
||||||
|
|
||||||
|
include(@CPM_PATH@/CPM.cmake)
|
||||||
|
|
||||||
|
CPMAddPackage(
|
||||||
|
NAME BrokenDependency
|
||||||
|
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/dependency
|
||||||
|
EXCLUDE_FROM_ALL @EXCLUDE_FROM_ALL@
|
||||||
|
)
|
||||||
3
test/unit/broken_dependency/dependency/CMakeLists.txt
Normal file
3
test/unit/broken_dependency/dependency/CMakeLists.txt
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
project(BrokenDependency)
|
||||||
|
|
||||||
|
add_custom_target(error ALL ${CMAKE_COMMAND} -E false)
|
||||||
35
test/unit/exclude_from_all.cmake
Normal file
35
test/unit/exclude_from_all.cmake
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
include(CMakePackageConfigHelpers)
|
||||||
|
include(${CPM_PATH}/testing.cmake)
|
||||||
|
|
||||||
|
set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/exclude_from_all)
|
||||||
|
|
||||||
|
function(init_project EXCLUDE_FROM_ALL)
|
||||||
|
configure_package_config_file(
|
||||||
|
"${CMAKE_CURRENT_LIST_DIR}/broken_dependency/CMakeLists.txt.in"
|
||||||
|
"${CMAKE_CURRENT_LIST_DIR}/broken_dependency/CMakeLists.txt"
|
||||||
|
INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/junk
|
||||||
|
)
|
||||||
|
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/broken_dependency" "-B${TEST_BUILD_DIR}"
|
||||||
|
RESULT_VARIABLE ret
|
||||||
|
)
|
||||||
|
|
||||||
|
assert_equal(${ret} "0")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(build_project expected_success)
|
||||||
|
execute_process(COMMAND ${CMAKE_COMMAND} "--build" "${TEST_BUILD_DIR}" RESULT_VARIABLE ret)
|
||||||
|
|
||||||
|
if(expected_success)
|
||||||
|
assert_equal(${ret} 0)
|
||||||
|
else()
|
||||||
|
assert_not_equal(${ret} 0)
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
init_project(FALSE)
|
||||||
|
build_project(FALSE)
|
||||||
|
|
||||||
|
init_project(TRUE)
|
||||||
|
build_project(TRUE)
|
||||||
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)
|
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
|
||||||
message("called external method")
|
|
||||||
endfunction()
|
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")
|
||||||
42
test/unit/package-lock_prettify.cmake
Normal file
42
test/unit/package-lock_prettify.cmake
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||||
|
|
||||||
|
include(${CPM_PATH}/CPM.cmake)
|
||||||
|
include(${CPM_PATH}/testing.cmake)
|
||||||
|
|
||||||
|
# cmake-format: off
|
||||||
|
cpm_prettify_package_arguments(PRETTY_ARGN false
|
||||||
|
NAME Dependency
|
||||||
|
SOURCE_DIR ${CMAKE_SOURCE_DIR}/local_dependency/dependency
|
||||||
|
UPDATE_DISCONNECTED ON
|
||||||
|
TESTCUSTOMDATA TRUE
|
||||||
|
)
|
||||||
|
# cmake-format: on
|
||||||
|
set(EXPECTED_UNCOMMENTED
|
||||||
|
" NAME Dependency
|
||||||
|
SOURCE_DIR \${CMAKE_SOURCE_DIR}/local_dependency/dependency
|
||||||
|
UPDATE_DISCONNECTED ON TESTCUSTOMDATA TRUE
|
||||||
|
"
|
||||||
|
)
|
||||||
|
assert_equal(${PRETTY_ARGN} ${EXPECTED_UNCOMMENTED})
|
||||||
|
|
||||||
|
# cmake-format: off
|
||||||
|
cpm_prettify_package_arguments(PRETTY_ARGN true
|
||||||
|
NAME Dependency
|
||||||
|
SOURCE_DIR ${CMAKE_SOURCE_DIR}/local_dependency/dependency
|
||||||
|
UPDATE_DISCONNECTED ON
|
||||||
|
TESTCUSTOMDATA TRUE
|
||||||
|
)
|
||||||
|
# cmake-format: on
|
||||||
|
set(EXPECTED_COMMENTED
|
||||||
|
"# NAME Dependency
|
||||||
|
# SOURCE_DIR \${CMAKE_SOURCE_DIR}/local_dependency/dependency
|
||||||
|
# UPDATE_DISCONNECTED ON TESTCUSTOMDATA TRUE
|
||||||
|
"
|
||||||
|
)
|
||||||
|
assert_equal(${PRETTY_ARGN} ${EXPECTED_COMMENTED})
|
||||||
|
|
||||||
|
cpm_prettify_package_arguments(PRETTY_ARGN true "local directory")
|
||||||
|
set(EXPECTED_COMMENTED_LOCALDIR "# local directory
|
||||||
|
"
|
||||||
|
)
|
||||||
|
assert_equal(${PRETTY_ARGN} ${EXPECTED_COMMENTED_LOCALDIR})
|
||||||
60
test/unit/package_name_and_ver_from_url.cmake
Normal file
60
test/unit/package_name_and_ver_from_url.cmake
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||||
|
|
||||||
|
include(${CPM_PATH}/CPM.cmake)
|
||||||
|
include(${CPM_PATH}/testing.cmake)
|
||||||
|
|
||||||
|
cpm_package_name_and_ver_from_url("https://example.com/coolpack-1.2.3.zip" name ver)
|
||||||
|
assert_equal("coolpack" ${name})
|
||||||
|
assert_equal("1.2.3" ${ver})
|
||||||
|
|
||||||
|
cpm_package_name_and_ver_from_url("https://example.com/cool-pack-v1.3.tar.gz" name ver)
|
||||||
|
assert_equal("cool-pack" ${name})
|
||||||
|
assert_equal("1.3" ${ver})
|
||||||
|
|
||||||
|
cpm_package_name_and_ver_from_url(
|
||||||
|
"https://subd.zip.com/download.php?Cool.Pack-v1.2.3rc0.tar" name ver
|
||||||
|
)
|
||||||
|
assert_equal("Cool.Pack" ${name})
|
||||||
|
assert_equal("1.2.3rc0" ${ver})
|
||||||
|
|
||||||
|
cpm_package_name_and_ver_from_url(
|
||||||
|
"http://evil-1.2.tar.gz.com/Plan9_1.2.3a.tar.bz2?download" name ver
|
||||||
|
)
|
||||||
|
assert_equal("Plan9" ${name})
|
||||||
|
assert_equal("1.2.3a" ${ver})
|
||||||
|
|
||||||
|
cpm_package_name_and_ver_from_url(
|
||||||
|
"http://evil-1.2.tar.gz.com/Plan_9-1.2.3a.tar.bz2?download" name ver
|
||||||
|
)
|
||||||
|
assert_equal("Plan_9" ${name})
|
||||||
|
assert_equal("1.2.3a" ${ver})
|
||||||
|
|
||||||
|
cpm_package_name_and_ver_from_url(
|
||||||
|
"http://evil-1.2.tar.gz.com/Plan-9_1.2.3a.tar.bz2?download" name ver
|
||||||
|
)
|
||||||
|
assert_equal("Plan-9" ${name})
|
||||||
|
assert_equal("1.2.3a" ${ver})
|
||||||
|
|
||||||
|
cpm_package_name_and_ver_from_url("https://sf.com/distrib/SFLib-0.999.4.tar.gz/download" name ver)
|
||||||
|
assert_equal("SFLib" ${name})
|
||||||
|
assert_equal("0.999.4" ${ver})
|
||||||
|
|
||||||
|
cpm_package_name_and_ver_from_url("https://example.com/coolpack/v5.6.5rc44.zip" name ver)
|
||||||
|
assert_not_defined(name)
|
||||||
|
assert_equal("5.6.5rc44" ${ver})
|
||||||
|
|
||||||
|
cpm_package_name_and_ver_from_url("evil-1.3.zip.com/coolpack/release999.000beta.ZIP" name ver)
|
||||||
|
assert_not_defined(name)
|
||||||
|
assert_equal("999.000beta" ${ver})
|
||||||
|
|
||||||
|
cpm_package_name_and_ver_from_url("https://example.com/Foo55.tar.gz" name ver)
|
||||||
|
assert_equal("Foo55" ${name})
|
||||||
|
assert_not_defined(ver)
|
||||||
|
|
||||||
|
cpm_package_name_and_ver_from_url("https://example.com/foo" name ver)
|
||||||
|
assert_not_defined(name)
|
||||||
|
assert_not_defined(ver)
|
||||||
|
|
||||||
|
cpm_package_name_and_ver_from_url("example.zip.com/foo" name ver)
|
||||||
|
assert_not_defined(name)
|
||||||
|
assert_not_defined(ver)
|
||||||
28
test/unit/package_name_from_git_uri.cmake
Normal file
28
test/unit/package_name_from_git_uri.cmake
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||||
|
|
||||||
|
include(${CPM_PATH}/CPM.cmake)
|
||||||
|
include(${CPM_PATH}/testing.cmake)
|
||||||
|
|
||||||
|
cpm_package_name_from_git_uri("https://github.com/cpm-cmake/CPM.cmake.git" name)
|
||||||
|
assert_equal("CPM.cmake" ${name})
|
||||||
|
|
||||||
|
cpm_package_name_from_git_uri("ssh://user@host.xz:123/path/to/pkg.git/" name)
|
||||||
|
assert_equal("pkg" ${name})
|
||||||
|
|
||||||
|
cpm_package_name_from_git_uri("git://host.xz/path/to/pkg.git" name)
|
||||||
|
assert_equal("pkg" ${name})
|
||||||
|
|
||||||
|
cpm_package_name_from_git_uri("git@host.xz:cool-pkg.git" name)
|
||||||
|
assert_equal("cool-pkg" ${name})
|
||||||
|
|
||||||
|
cpm_package_name_from_git_uri("file:///path/to/pkg33.git" name)
|
||||||
|
assert_equal("pkg33" ${name})
|
||||||
|
|
||||||
|
cpm_package_name_from_git_uri("../local-repo/.git" name)
|
||||||
|
assert_equal("local-repo" ${name})
|
||||||
|
|
||||||
|
cpm_package_name_from_git_uri("asdf" name)
|
||||||
|
assert_not_defined(name)
|
||||||
|
|
||||||
|
cpm_package_name_from_git_uri("/something.git/stuff" name)
|
||||||
|
assert_not_defined(name)
|
||||||
65
test/unit/parse_add_package_single_arg.cmake
Normal file
65
test/unit/parse_add_package_single_arg.cmake
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||||
|
|
||||||
|
include(${CPM_PATH}/CPM.cmake)
|
||||||
|
include(${CPM_PATH}/testing.cmake)
|
||||||
|
|
||||||
|
cpm_parse_add_package_single_arg("gh:cpm-cmake/CPM.cmake" args)
|
||||||
|
assert_equal("GITHUB_REPOSITORY;cpm-cmake/CPM.cmake" "${args}")
|
||||||
|
|
||||||
|
cpm_parse_add_package_single_arg("gh:cpm-cmake/CPM.cmake@1.2.3" args)
|
||||||
|
assert_equal("GITHUB_REPOSITORY;cpm-cmake/CPM.cmake;VERSION;1.2.3" "${args}")
|
||||||
|
|
||||||
|
cpm_parse_add_package_single_arg("gh:cpm-cmake/CPM.cmake#master" args)
|
||||||
|
assert_equal("GITHUB_REPOSITORY;cpm-cmake/CPM.cmake;GIT_TAG;master" "${args}")
|
||||||
|
|
||||||
|
cpm_parse_add_package_single_arg("gh:cpm-cmake/CPM.cmake@0.20.3#asdf" args)
|
||||||
|
assert_equal("GITHUB_REPOSITORY;cpm-cmake/CPM.cmake;VERSION;0.20.3;GIT_TAG;asdf" "${args}")
|
||||||
|
|
||||||
|
cpm_parse_add_package_single_arg("gh:a/b#c@d" args)
|
||||||
|
assert_equal("GITHUB_REPOSITORY;a/b;GIT_TAG;c;VERSION;d" "${args}")
|
||||||
|
|
||||||
|
cpm_parse_add_package_single_arg("gh:foo#c@d" args)
|
||||||
|
assert_equal("GITHUB_REPOSITORY;foo;GIT_TAG;c;VERSION;d" "${args}")
|
||||||
|
|
||||||
|
cpm_parse_add_package_single_arg("gh:Foo@5" args)
|
||||||
|
assert_equal("GITHUB_REPOSITORY;Foo;VERSION;5" "${args}")
|
||||||
|
|
||||||
|
cpm_parse_add_package_single_arg("gl:foo/bar" args)
|
||||||
|
assert_equal("GITLAB_REPOSITORY;foo/bar" "${args}")
|
||||||
|
|
||||||
|
cpm_parse_add_package_single_arg("gl:foo/Bar" args)
|
||||||
|
assert_equal("GITLAB_REPOSITORY;foo/Bar" "${args}")
|
||||||
|
|
||||||
|
cpm_parse_add_package_single_arg("https://github.com/cpm-cmake/CPM.cmake.git@0.30.5" args)
|
||||||
|
assert_equal("GIT_REPOSITORY;https://github.com/cpm-cmake/CPM.cmake.git;VERSION;0.30.5" "${args}")
|
||||||
|
|
||||||
|
cpm_parse_add_package_single_arg("git@host.xz:user/pkg.git@0.1.2" args)
|
||||||
|
assert_equal("GIT_REPOSITORY;git@host.xz:user/pkg.git;VERSION;0.1.2" "${args}")
|
||||||
|
|
||||||
|
cpm_parse_add_package_single_arg("git@host.xz:user/pkg.git@0.1.2#rc" args)
|
||||||
|
assert_equal("GIT_REPOSITORY;git@host.xz:user/pkg.git;VERSION;0.1.2;GIT_TAG;rc" "${args}")
|
||||||
|
|
||||||
|
cpm_parse_add_package_single_arg(
|
||||||
|
"ssh://user@host.xz:123/path/to/pkg.git#fragment@1.2.3#branch" args
|
||||||
|
)
|
||||||
|
assert_equal(
|
||||||
|
"GIT_REPOSITORY;ssh://user@host.xz:123/path/to/pkg.git#fragment;VERSION;1.2.3;GIT_TAG;branch"
|
||||||
|
"${args}"
|
||||||
|
)
|
||||||
|
|
||||||
|
cpm_parse_add_package_single_arg("https://example.org/foo.tar.gz" args)
|
||||||
|
assert_equal("URL;https://example.org/foo.tar.gz" "${args}")
|
||||||
|
|
||||||
|
cpm_parse_add_package_single_arg("https://example.org/foo.tar.gz#baadf00d@1.2.0" args)
|
||||||
|
assert_equal("URL;https://example.org/foo.tar.gz;URL_HASH;baadf00d;VERSION;1.2.0" "${args}")
|
||||||
|
|
||||||
|
cpm_parse_add_package_single_arg("https://example.org/foo.tar.gz#MD5=baadf00d" args)
|
||||||
|
assert_equal("URL;https://example.org/foo.tar.gz;URL_HASH;MD5=baadf00d" "${args}")
|
||||||
|
|
||||||
|
cpm_parse_add_package_single_arg("https://example.org/Foo.zip#SHA3_512=1337" args)
|
||||||
|
assert_equal("URL;https://example.org/Foo.zip;URL_HASH;SHA3_512=1337" "${args}")
|
||||||
|
|
||||||
|
cpm_parse_add_package_single_arg("ftp://user:pass@server/pathname.zip#fragment#0ddb411@0" args)
|
||||||
|
assert_equal(
|
||||||
|
"URL;ftp://user:pass@server/pathname.zip#fragment;URL_HASH;0ddb411;VERSION;0" "${args}"
|
||||||
|
)
|
||||||
@@ -12,7 +12,7 @@ include(@CPM_PATH@/CPM.cmake)
|
|||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage(
|
||||||
NAME fibonacci
|
NAME fibonacci
|
||||||
GIT_REPOSITORY https://github.com/TheLartians/Fibonacci.git
|
GIT_REPOSITORY https://github.com/cpm-cmake/testpack-fibonacci.git
|
||||||
VERSION @FIBONACCI_VERSION@
|
VERSION @FIBONACCI_VERSION@
|
||||||
@FIBONACCI_PACKAGE_ARGS@
|
@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