mirror of
https://github.com/cpm-cmake/CPM.cmake.git
synced 2025-11-20 13:17:53 -05:00
Compare commits
39 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
32b063eba5 | ||
|
|
d64d816585 | ||
|
|
8e8dcc9a8d | ||
|
|
8afc2af4f9 | ||
|
|
a3d1048ad6 | ||
|
|
492e762591 | ||
|
|
3f6cbe7383 | ||
|
|
4aadac1972 | ||
|
|
4cbf443363 | ||
|
|
2744b87f07 | ||
|
|
fd539b8ff3 | ||
|
|
02d57a1601 | ||
|
|
5f614e5eb6 | ||
|
|
1f5cb903e5 | ||
|
|
7000572bbe | ||
|
|
fe8d15ba82 | ||
|
|
ab6e8d6d8c | ||
|
|
aad0397beb | ||
|
|
1ebbac6332 | ||
|
|
cf3f62b6f2 | ||
|
|
3b404296b5 | ||
|
|
18e09b07ba | ||
|
|
aeef56ea85 | ||
|
|
4271d5981f | ||
|
|
d17500b0be | ||
|
|
5e0c3855c7 | ||
|
|
f96cff720e | ||
|
|
c3c7e2d9a3 | ||
|
|
30b98af416 | ||
|
|
5063c7d992 | ||
|
|
3cfb309f3c | ||
|
|
25603ac4ad | ||
|
|
ac872f6908 | ||
|
|
bd14ccbd5a | ||
|
|
f8afae6eb3 | ||
|
|
9ec279c75f | ||
|
|
392b2a864b | ||
|
|
139d3cacba | ||
|
|
b31063d2ae |
16
.clang-format
Normal file
16
.clang-format
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
BasedOnStyle: Google
|
||||||
|
AccessModifierOffset: '-2'
|
||||||
|
AlignTrailingComments: 'true'
|
||||||
|
AllowAllParametersOfDeclarationOnNextLine: 'false'
|
||||||
|
AlwaysBreakTemplateDeclarations: 'No'
|
||||||
|
BreakBeforeBraces: Attach
|
||||||
|
ColumnLimit: '100'
|
||||||
|
ConstructorInitializerAllOnOneLineOrOnePerLine: 'true'
|
||||||
|
IncludeBlocks: Regroup
|
||||||
|
IndentPPDirectives: AfterHash
|
||||||
|
IndentWidth: '2'
|
||||||
|
NamespaceIndentation: All
|
||||||
|
BreakBeforeBinaryOperators: All
|
||||||
|
BreakBeforeTernaryOperators: 'true'
|
||||||
|
...
|
||||||
72
.cmake-format
Normal file
72
.cmake-format
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
format:
|
||||||
|
tab_size: 2
|
||||||
|
line_width: 100
|
||||||
|
dangle_parens: true
|
||||||
|
|
||||||
|
parse:
|
||||||
|
additional_commands:
|
||||||
|
cpmaddpackage:
|
||||||
|
pargs:
|
||||||
|
nargs: '*'
|
||||||
|
flags: []
|
||||||
|
spelling: CPMAddPackage
|
||||||
|
kwargs: &cpmaddpackagekwargs
|
||||||
|
NAME: 1
|
||||||
|
FORCE: 1
|
||||||
|
VERSION: 1
|
||||||
|
GIT_TAG: 1
|
||||||
|
DOWNLOAD_ONLY: 1
|
||||||
|
GITHUB_REPOSITORY: 1
|
||||||
|
GITLAB_REPOSITORY: 1
|
||||||
|
GIT_REPOSITORY: 1
|
||||||
|
SVN_REPOSITORY: 1
|
||||||
|
SVN_REVISION: 1
|
||||||
|
SOURCE_DIR: 1
|
||||||
|
DOWNLOAD_COMMAND: 1
|
||||||
|
FIND_PACKAGE_ARGUMENTS: 1
|
||||||
|
NO_CACHE: 1
|
||||||
|
GIT_SHALLOW: 1
|
||||||
|
URL: 1
|
||||||
|
URL_HASH: 1
|
||||||
|
URL_MD5: 1
|
||||||
|
DOWNLOAD_NAME: 1
|
||||||
|
DOWNLOAD_NO_EXTRACT: 1
|
||||||
|
HTTP_USERNAME: 1
|
||||||
|
HTTP_PASSWORD: 1
|
||||||
|
EXCLUDE_FROM_ALL: 1
|
||||||
|
OPTIONS: +
|
||||||
|
cpmfindpackage:
|
||||||
|
pargs:
|
||||||
|
nargs: '*'
|
||||||
|
flags: []
|
||||||
|
spelling: CPMFindPackage
|
||||||
|
kwargs: *cpmaddpackagekwargs
|
||||||
|
cpmdeclarepackage:
|
||||||
|
pargs:
|
||||||
|
nargs: '*'
|
||||||
|
flags: []
|
||||||
|
spelling: CPMDeclarePackage
|
||||||
|
kwargs: *cpmaddpackagekwargs
|
||||||
|
packageproject:
|
||||||
|
pargs:
|
||||||
|
nargs: '*'
|
||||||
|
flags: []
|
||||||
|
spelling: packageProject
|
||||||
|
kwargs:
|
||||||
|
NAME: 1
|
||||||
|
VERSION: 1
|
||||||
|
INCLUDE_DIR: 1
|
||||||
|
INCLUDE_DESTINATION: 1
|
||||||
|
BINARY_DIR: 1
|
||||||
|
COMPATIBILITY: 1
|
||||||
|
VERSION_HEADER: 1
|
||||||
|
DEPENDENCIES: +
|
||||||
|
cpmusepackagelock:
|
||||||
|
pargs: 1
|
||||||
|
spelling: CPMUsePackageLock
|
||||||
|
cpmregisterpackage:
|
||||||
|
pargs: 1
|
||||||
|
spelling: CPMRegisterPackage
|
||||||
|
cpmgetpackageversion:
|
||||||
|
pargs: 2
|
||||||
|
spelling: CPMGetPackageVersion
|
||||||
11
.github/workflows/publish.yaml
vendored
11
.github/workflows/publish.yaml
vendored
@@ -11,11 +11,18 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1
|
- uses: actions/checkout@v1
|
||||||
|
|
||||||
|
- name: Set CPM version by tag
|
||||||
|
run: |
|
||||||
|
mkdir dist
|
||||||
|
sed "s/1.0.0-development-version/${GITHUB_REF/refs\/tags\/v}/g" cmake/CPM.cmake > dist/CPM.cmake
|
||||||
|
sed "s/1.0.0-development-version/${GITHUB_REF/refs\/tags\/v}/g" cmake/get_cpm.cmake > dist/get_cpm.cmake
|
||||||
|
|
||||||
- name: Upload CPM.cmake to release
|
- name: Upload CPM.cmake to release
|
||||||
uses: svenstaro/upload-release-action@v1-release
|
uses: svenstaro/upload-release-action@v1-release
|
||||||
with:
|
with:
|
||||||
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
file: cmake/CPM.cmake
|
|
||||||
asset_name: CPM.cmake
|
|
||||||
tag: ${{ github.ref }}
|
tag: ${{ github.ref }}
|
||||||
|
file: dist/*.cmake
|
||||||
|
file_glob: true
|
||||||
overwrite: true
|
overwrite: true
|
||||||
|
|||||||
28
.github/workflows/style.yml
vendored
Normal file
28
.github/workflows/style.yml
vendored
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
name: Style
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
style:
|
||||||
|
|
||||||
|
runs-on: macos-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
|
||||||
|
- name: Install format dependencies
|
||||||
|
run: |
|
||||||
|
brew install clang-format
|
||||||
|
pip3 install cmake_format==0.6.11 pyyaml
|
||||||
|
|
||||||
|
- name: configure
|
||||||
|
run: cmake -Htest/style -Bbuild/style
|
||||||
|
|
||||||
|
- name: check style
|
||||||
|
run: cmake --build build/style --target check-format
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,3 +1,4 @@
|
|||||||
|
build/
|
||||||
/build*
|
/build*
|
||||||
/.vscode
|
/.vscode
|
||||||
*.DS_Store
|
*.DS_Store
|
||||||
190
README.md
190
README.md
@@ -1,16 +1,18 @@
|
|||||||
[](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://github.com/cpm-cmake/CPM.cmake/actions)
|
||||||
|
|
||||||
|
<br />
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<img src="./logo/CPM.png" height="100" />
|
<img src="./logo/CPM.png" height="100" />
|
||||||
</p>
|
</p>
|
||||||
|
<br />
|
||||||
|
|
||||||
# Setup-free CMake dependency management
|
# Setup-free CMake dependency management
|
||||||
|
|
||||||
CPM.cmake is a CMake script that adds dependency management capabilities to CMake.
|
CPM.cmake is a CMake script that adds dependency management capabilities to CMake.
|
||||||
It's built as a thin wrapper around CMake's [FetchContent](https://cmake.org/cmake/help/latest/module/FetchContent.html) module that adds version control, caching and a simple API.
|
It's built as a thin wrapper around CMake's [FetchContent](https://cmake.org/cmake/help/latest/module/FetchContent.html) module that adds version control, caching, a simple API [and more](#comparison-to-pure-fetchcontent--externalproject).
|
||||||
|
|
||||||
## Manage everything
|
## Manage everything
|
||||||
|
|
||||||
@@ -18,11 +20,16 @@ Any downloadable project or resource can be added as a version-controlled depend
|
|||||||
Projects using modern CMake are automatically configured and their targets can be used immediately.
|
Projects using modern CMake are automatically configured and their targets can be used immediately.
|
||||||
For everything else, the targets can be created manually after the dependency has been downloaded (see the [snippets](#snippets) below for examples).
|
For everything else, the targets can be created manually after the dependency has been downloaded (see the [snippets](#snippets) below for examples).
|
||||||
|
|
||||||
|
## Further reading
|
||||||
|
|
||||||
|
- [CPM: An Awesome Dependency Manager for C++ with CMake](https://medium.com/swlh/cpm-an-awesome-dependency-manager-for-c-with-cmake-3c53f4376766)
|
||||||
|
- [CMake and the Future of C++ Package Management](https://ibob.github.io/blog/2020/01/13/cmake-package-management/)
|
||||||
|
|
||||||
## 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(
|
||||||
@@ -38,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
|
||||||
|
|
||||||
@@ -62,29 +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 or 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 `cmake/CPM.cmake` to your project's `cmake` directory. The command below will perform this automatically.
|
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.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
mkdir -p cmake
|
mkdir -p cmake
|
||||||
wget -O cmake/CPM.cmake https://github.com/TheLartians/CPM.cmake/releases/latest/download/CPM.cmake
|
wget -O cmake/CPM.cmake https://github.com/cpm-cmake/CPM.cmake/releases/latest/download/get_cpm.cmake
|
||||||
```
|
```
|
||||||
|
|
||||||
You can also use CMake to download CPM for you. 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
|
||||||
|
|
||||||
@@ -104,13 +133,40 @@ 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).
|
||||||
Dependencies added with `CPMFindPackage` should work with external package managers.
|
Dependencies added with `CPMFindPackage` should work with external package managers.
|
||||||
Additionally, the option [`CPM_USE_LOCAL_PACKAGES`](#cpmuselocalpackages) will enable `find_package` for all CPM dependencies.
|
Additionally, the option [`CPM_USE_LOCAL_PACKAGES`](#cpmuselocalpackages) will enable `find_package` for all CPM dependencies.
|
||||||
|
|
||||||
|
## Comparison to FindPackage
|
||||||
|
|
||||||
|
The usual way to add libraries in CMake projects is to call `find_package(<PackageName>)` and to link against libraries defined in a `<PackageName>_LIBRARIES` variable.
|
||||||
|
While simple, this may lead to unpredictable builds, as it requires the library to be installed on the system and it is unclear which version of the library has been added.
|
||||||
|
Additionally, it is difficult to cross-compile projects (e.g. for mobile), as the dependencies will need to be rebuilt manually for each targeted architecture.
|
||||||
|
|
||||||
|
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.
|
||||||
|
The behaviour can be [achieved manually](https://github.com/cpm-cmake/CPM.cmake/issues/132#issuecomment-644955140), if required.
|
||||||
|
|
||||||
|
## Comparison to pure FetchContent / ExternalProject
|
||||||
|
|
||||||
|
CPM.cmake is a wrapper for CMake's FetchContent module and adds a number of features that turn it into a useful dependency manager.
|
||||||
|
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.
|
||||||
|
- [Package lock files](#package-lock) for easier transitive dependency management.
|
||||||
|
- Dependencies can be overridden [per-build](#local-package-override) using CMake CLI parameters.
|
||||||
|
|
||||||
|
ExternalProject works similarly as FetchContent, however waits with adding dependencies until build time.
|
||||||
|
This has a quite a few disadvantages, especially as it makes using custom toolchains / cross-compiling very difficult and can lead to problems with nested dependencies.
|
||||||
|
|
||||||
## Options
|
## Options
|
||||||
|
|
||||||
### CPM_SOURCE_CACHE
|
### CPM_SOURCE_CACHE
|
||||||
@@ -125,6 +181,8 @@ 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/cpm-cmake/CPM.cmake/wiki/Caching-with-CPM.cmake-and-ccache-on-GitHub-Actions) for more info.
|
||||||
|
|
||||||
### CPM_DOWNLOAD_ALL
|
### CPM_DOWNLOAD_ALL
|
||||||
|
|
||||||
If set, CPM will forward all calls to `CPMFindPackage` as `CPMAddPackage`.
|
If set, CPM will forward all calls to `CPMFindPackage` as `CPMAddPackage`.
|
||||||
@@ -137,6 +195,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.
|
||||||
@@ -164,61 +224,69 @@ 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
|
||||||
|
|
||||||
|
Some amazing projects that are built using the CPM.cmake package manager.
|
||||||
|
If you know others, feel free to add them here through a PR.
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<a href="https://bitfieldaudio.com">
|
||||||
|
<p align="center">
|
||||||
|
<img src="https://avatars2.githubusercontent.com/u/40357059?s=200&v=4" alt="otto-project" height=100pt width=100pt />
|
||||||
|
</p>
|
||||||
|
<p align="center"><b>OTTO - The Open Source GrooveBox</b></p>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a href="https://maphi.app">
|
||||||
|
<p align="center">
|
||||||
|
<img src="https://user-images.githubusercontent.com/4437447/89892751-71af8000-dbd7-11ea-9d87-4fe107845069.png" alt="maphi" height=100pt width=100pt />
|
||||||
|
</p>
|
||||||
|
<p align="center"><b>Maphi - the Math App</b></p>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a href="https://github.com/TheLartians/ModernCppStarter">
|
||||||
|
<p align="center">
|
||||||
|
<img src="https://repository-images.githubusercontent.com/254842585/4dfa7580-7ffb-11ea-99d0-46b8fe2f4170" alt="modern-cpp-starter" height=100pt width=200pt />
|
||||||
|
</p>
|
||||||
|
<p align="center"><b>ModernCppStarter</b></p>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
## 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("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"
|
|
||||||
)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### [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)
|
||||||
@@ -227,14 +295,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()
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -286,6 +353,7 @@ if (lua_ADDED)
|
|||||||
# lua has no CMake support, so we create our own target
|
# lua has no CMake support, so we create our own target
|
||||||
|
|
||||||
FILE(GLOB lua_sources ${lua_SOURCE_DIR}/*.c)
|
FILE(GLOB lua_sources ${lua_SOURCE_DIR}/*.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
|
target_include_directories(lua
|
||||||
@@ -299,4 +367,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.
|
||||||
|
|||||||
695
cmake/CPM.cmake
695
cmake/CPM.cmake
@@ -1,11 +1,11 @@
|
|||||||
# 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
|
||||||
# -----------
|
# -----------
|
||||||
#[[
|
#[[
|
||||||
Copyright (c) 2019 Lars Melchior
|
Copyright (c) 2021 Lars Melchior and additional contributors
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -28,40 +28,75 @@
|
|||||||
|
|
||||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||||
|
|
||||||
set(CURRENT_CPM_VERSION 0.26.1)
|
set(CURRENT_CPM_VERSION 1.0.0-development-version)
|
||||||
|
|
||||||
if(CPM_DIRECTORY)
|
if(CPM_DIRECTORY)
|
||||||
if(NOT CPM_DIRECTORY STREQUAL CMAKE_CURRENT_LIST_DIR)
|
if(NOT CPM_DIRECTORY STREQUAL CMAKE_CURRENT_LIST_DIR)
|
||||||
if (CPM_VERSION VERSION_LESS CURRENT_CPM_VERSION)
|
if(CPM_VERSION VERSION_LESS CURRENT_CPM_VERSION)
|
||||||
message(AUTHOR_WARNING "${CPM_INDENT} \
|
message(
|
||||||
|
AUTHOR_WARNING
|
||||||
|
"${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()
|
||||||
|
|
||||||
get_property(CPM_INITIALIZED GLOBAL "" PROPERTY CPM_INITIALIZED SET)
|
get_property(
|
||||||
if (CPM_INITIALIZED)
|
CPM_INITIALIZED GLOBAL ""
|
||||||
|
PROPERTY CPM_INITIALIZED
|
||||||
|
SET
|
||||||
|
)
|
||||||
|
if(CPM_INITIALIZED)
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set_property(GLOBAL PROPERTY CPM_INITIALIZED true)
|
set_property(GLOBAL PROPERTY CPM_INITIALIZED true)
|
||||||
|
|
||||||
option(CPM_USE_LOCAL_PACKAGES "Always try to use `find_package` to get dependencies" $ENV{CPM_USE_LOCAL_PACKAGES})
|
option(CPM_USE_LOCAL_PACKAGES "Always try to use `find_package` to get dependencies"
|
||||||
option(CPM_LOCAL_PACKAGES_ONLY "Only use `find_package` to get dependencies" $ENV{CPM_LOCAL_PACKAGES_ONLY})
|
$ENV{CPM_USE_LOCAL_PACKAGES}
|
||||||
|
)
|
||||||
|
option(CPM_LOCAL_PACKAGES_ONLY "Only use `find_package` to get dependencies"
|
||||||
|
$ENV{CPM_LOCAL_PACKAGES_ONLY}
|
||||||
|
)
|
||||||
option(CPM_DOWNLOAD_ALL "Always download dependencies from source" $ENV{CPM_DOWNLOAD_ALL})
|
option(CPM_DOWNLOAD_ALL "Always download dependencies from source" $ENV{CPM_DOWNLOAD_ALL})
|
||||||
option(CPM_DONT_UPDATE_MODULE_PATH "Don't update the module path to allow using find_package" $ENV{CPM_DONT_UPDATE_MODULE_PATH})
|
option(CPM_DONT_UPDATE_MODULE_PATH "Don't update the module path to allow using find_package"
|
||||||
option(CPM_DONT_CREATE_PACKAGE_LOCK "Don't create a package lock file in the binary path" $ENV{CPM_DONT_CREATE_PACKAGE_LOCK})
|
$ENV{CPM_DONT_UPDATE_MODULE_PATH}
|
||||||
option(CPM_INCLUDE_ALL_IN_PACKAGE_LOCK "Add all packages added through CPM.cmake to the package lock" $ENV{CPM_INCLUDE_ALL_IN_PACKAGE_LOCK})
|
)
|
||||||
|
option(CPM_DONT_CREATE_PACKAGE_LOCK "Don't create a package lock file in the binary path"
|
||||||
|
$ENV{CPM_DONT_CREATE_PACKAGE_LOCK}
|
||||||
|
)
|
||||||
|
option(CPM_INCLUDE_ALL_IN_PACKAGE_LOCK
|
||||||
|
"Add all packages added through CPM.cmake to the package lock"
|
||||||
|
$ENV{CPM_INCLUDE_ALL_IN_PACKAGE_LOCK}
|
||||||
|
)
|
||||||
|
|
||||||
set(CPM_VERSION ${CURRENT_CPM_VERSION} CACHE INTERNAL "")
|
set(CPM_VERSION
|
||||||
set(CPM_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} CACHE INTERNAL "")
|
${CURRENT_CPM_VERSION}
|
||||||
set(CPM_FILE ${CMAKE_CURRENT_LIST_FILE} CACHE INTERNAL "")
|
CACHE INTERNAL ""
|
||||||
set(CPM_PACKAGES "" CACHE INTERNAL "")
|
)
|
||||||
set(CPM_DRY_RUN OFF CACHE INTERNAL "Don't download or configure dependencies (for testing)")
|
set(CPM_DIRECTORY
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}
|
||||||
|
CACHE INTERNAL ""
|
||||||
|
)
|
||||||
|
set(CPM_FILE
|
||||||
|
${CMAKE_CURRENT_LIST_FILE}
|
||||||
|
CACHE INTERNAL ""
|
||||||
|
)
|
||||||
|
set(CPM_PACKAGES
|
||||||
|
""
|
||||||
|
CACHE INTERNAL ""
|
||||||
|
)
|
||||||
|
set(CPM_DRY_RUN
|
||||||
|
OFF
|
||||||
|
CACHE INTERNAL "Don't download or configure dependencies (for testing)"
|
||||||
|
)
|
||||||
|
|
||||||
if(DEFINED ENV{CPM_SOURCE_CACHE})
|
if(DEFINED ENV{CPM_SOURCE_CACHE})
|
||||||
set(CPM_SOURCE_CACHE_DEFAULT $ENV{CPM_SOURCE_CACHE})
|
set(CPM_SOURCE_CACHE_DEFAULT $ENV{CPM_SOURCE_CACHE})
|
||||||
@@ -69,28 +104,100 @@ else()
|
|||||||
set(CPM_SOURCE_CACHE_DEFAULT OFF)
|
set(CPM_SOURCE_CACHE_DEFAULT OFF)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(CPM_SOURCE_CACHE ${CPM_SOURCE_CACHE_DEFAULT} CACHE PATH "Directory to downlaod CPM dependencies")
|
set(CPM_SOURCE_CACHE
|
||||||
|
${CPM_SOURCE_CACHE_DEFAULT}
|
||||||
|
CACHE PATH "Directory to download CPM dependencies"
|
||||||
|
)
|
||||||
|
|
||||||
if (NOT CPM_DONT_UPDATE_MODULE_PATH)
|
if(NOT CPM_DONT_UPDATE_MODULE_PATH)
|
||||||
set(CPM_MODULE_PATH "${CMAKE_BINARY_DIR}/CPM_modules" CACHE INTERNAL "")
|
set(CPM_MODULE_PATH
|
||||||
|
"${CMAKE_BINARY_DIR}/CPM_modules"
|
||||||
|
CACHE INTERNAL ""
|
||||||
|
)
|
||||||
# remove old modules
|
# remove old modules
|
||||||
FILE(REMOVE_RECURSE ${CPM_MODULE_PATH})
|
file(REMOVE_RECURSE ${CPM_MODULE_PATH})
|
||||||
file(MAKE_DIRECTORY ${CPM_MODULE_PATH})
|
file(MAKE_DIRECTORY ${CPM_MODULE_PATH})
|
||||||
# locally added CPM modules should override global packages
|
# locally added CPM modules should override global packages
|
||||||
set(CMAKE_MODULE_PATH "${CPM_MODULE_PATH};${CMAKE_MODULE_PATH}")
|
set(CMAKE_MODULE_PATH "${CPM_MODULE_PATH};${CMAKE_MODULE_PATH}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOT CPM_DONT_CREATE_PACKAGE_LOCK)
|
if(NOT CPM_DONT_CREATE_PACKAGE_LOCK)
|
||||||
set(CPM_PACKAGE_LOCK_FILE "${CMAKE_BINARY_DIR}/cpm-package-lock.cmake" CACHE INTERNAL "")
|
set(CPM_PACKAGE_LOCK_FILE
|
||||||
file(WRITE ${CPM_PACKAGE_LOCK_FILE} "# CPM Package Lock\n# This file should be committed to version control\n\n")
|
"${CMAKE_BINARY_DIR}/cpm-package-lock.cmake"
|
||||||
|
CACHE INTERNAL ""
|
||||||
|
)
|
||||||
|
file(WRITE ${CPM_PACKAGE_LOCK_FILE}
|
||||||
|
"# CPM Package Lock\n# This file should be committed to version control\n\n"
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
include(FetchContent)
|
include(FetchContent)
|
||||||
include(CMakeParseArguments)
|
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)
|
||||||
@@ -99,45 +206,49 @@ function(cpm_find_package NAME VERSION)
|
|||||||
if(${CPM_ARGS_NAME}_FOUND)
|
if(${CPM_ARGS_NAME}_FOUND)
|
||||||
message(STATUS "${CPM_INDENT} using local package ${CPM_ARGS_NAME}@${VERSION}")
|
message(STATUS "${CPM_INDENT} using local package ${CPM_ARGS_NAME}@${VERSION}")
|
||||||
CPMRegisterPackage(${CPM_ARGS_NAME} "${VERSION}")
|
CPMRegisterPackage(${CPM_ARGS_NAME} "${VERSION}")
|
||||||
set(CPM_PACKAGE_FOUND YES PARENT_SCOPE)
|
set(CPM_PACKAGE_FOUND
|
||||||
|
YES
|
||||||
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
else()
|
else()
|
||||||
set(CPM_PACKAGE_FOUND NO PARENT_SCOPE)
|
set(CPM_PACKAGE_FOUND
|
||||||
|
NO
|
||||||
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# Create a custom FindXXX.cmake module for a CPM package
|
# Create a custom FindXXX.cmake module for a CPM package This prevents `find_package(NAME)` from
|
||||||
# This prevents `find_package(NAME)` from finding the system library
|
# finding the system library
|
||||||
function(CPMCreateModuleFile Name)
|
function(cpm_create_module_file Name)
|
||||||
if (NOT CPM_DONT_UPDATE_MODULE_PATH)
|
if(NOT CPM_DONT_UPDATE_MODULE_PATH)
|
||||||
# erase any previous modules
|
# erase any previous modules
|
||||||
FILE(WRITE ${CPM_MODULE_PATH}/Find${Name}.cmake "include(${CPM_FILE})\n${ARGN}\nset(${Name}_FOUND TRUE)")
|
file(WRITE ${CPM_MODULE_PATH}/Find${Name}.cmake
|
||||||
|
"include(${CPM_FILE})\n${ARGN}\nset(${Name}_FOUND TRUE)"
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# Find a package locally or fallback to CPMAddPackage
|
# Find a package locally or fallback to CPMAddPackage
|
||||||
function(CPMFindPackage)
|
function(CPMFindPackage)
|
||||||
set(oneValueArgs
|
set(oneValueArgs NAME VERSION GIT_TAG FIND_PACKAGE_ARGUMENTS)
|
||||||
NAME
|
|
||||||
VERSION
|
|
||||||
FIND_PACKAGE_ARGUMENTS
|
|
||||||
)
|
|
||||||
|
|
||||||
cmake_parse_arguments(CPM_ARGS "" "${oneValueArgs}" "" ${ARGN})
|
cmake_parse_arguments(CPM_ARGS "" "${oneValueArgs}" "" ${ARGN})
|
||||||
|
|
||||||
if (NOT DEFINED CPM_ARGS_VERSION)
|
if(NOT DEFINED CPM_ARGS_VERSION)
|
||||||
if (DEFINED CPM_ARGS_GIT_TAG)
|
if(DEFINED CPM_ARGS_GIT_TAG)
|
||||||
cpm_get_version_from_git_tag("${CPM_ARGS_GIT_TAG}" CPM_ARGS_VERSION)
|
cpm_get_version_from_git_tag("${CPM_ARGS_GIT_TAG}" CPM_ARGS_VERSION)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (CPM_DOWNLOAD_ALL)
|
if(CPM_DOWNLOAD_ALL)
|
||||||
CPMAddPackage(${ARGN})
|
CPMAddPackage(${ARGN})
|
||||||
cpm_export_variables(${CPM_ARGS_NAME})
|
cpm_export_variables(${CPM_ARGS_NAME})
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
CPMCheckIfPackageAlreadyAdded(${CPM_ARGS_NAME} "${CPM_ARGS_VERSION}" "${CPM_ARGS_OPTIONS}")
|
cpm_check_if_package_already_added(${CPM_ARGS_NAME} "${CPM_ARGS_VERSION}" "${CPM_ARGS_OPTIONS}")
|
||||||
if (CPM_PACKAGE_ALREADY_ADDED)
|
if(CPM_PACKAGE_ALREADY_ADDED)
|
||||||
cpm_export_variables(${CPM_ARGS_NAME})
|
cpm_export_variables(${CPM_ARGS_NAME})
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
@@ -152,31 +263,115 @@ function(CPMFindPackage)
|
|||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# checks if a package has been added before
|
# checks if a package has been added before
|
||||||
function(CPMCheckIfPackageAlreadyAdded CPM_ARGS_NAME CPM_ARGS_VERSION CPM_ARGS_OPTIONS)
|
function(cpm_check_if_package_already_added CPM_ARGS_NAME CPM_ARGS_VERSION CPM_ARGS_OPTIONS)
|
||||||
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}")
|
||||||
message(WARNING "${CPM_INDENT} requires a newer version of ${CPM_ARGS_NAME} (${CPM_ARGS_VERSION}) than currently included (${CPM_PACKAGE_VERSION}).")
|
message(
|
||||||
|
WARNING
|
||||||
|
"${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)
|
if(CPM_ARGS_OPTIONS)
|
||||||
foreach(OPTION ${CPM_ARGS_OPTIONS})
|
foreach(OPTION ${CPM_ARGS_OPTIONS})
|
||||||
cpm_parse_option(${OPTION})
|
cpm_parse_option(${OPTION})
|
||||||
if(NOT "${${OPTION_KEY}}" STREQUAL "${OPTION_VALUE}")
|
if(NOT "${${OPTION_KEY}}" STREQUAL "${OPTION_VALUE}")
|
||||||
message(WARNING "${CPM_INDENT} ignoring package option for ${CPM_ARGS_NAME}: ${OPTION_KEY} = ${OPTION_VALUE} (${${OPTION_KEY}})")
|
message(
|
||||||
|
WARNING
|
||||||
|
"${CPM_INDENT} ignoring package option for ${CPM_ARGS_NAME}: ${OPTION_KEY} = ${OPTION_VALUE} (${${OPTION_KEY}})"
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
endforeach()
|
endforeach()
|
||||||
endif()
|
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 YES PARENT_SCOPE)
|
set(CPM_PACKAGE_ALREADY_ADDED
|
||||||
|
YES
|
||||||
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
cpm_export_variables(${CPM_ARGS_NAME})
|
cpm_export_variables(${CPM_ARGS_NAME})
|
||||||
else()
|
else()
|
||||||
SET(CPM_PACKAGE_ALREADY_ADDED NO PARENT_SCOPE)
|
set(CPM_PACKAGE_ALREADY_ADDED
|
||||||
|
NO
|
||||||
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
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
|
||||||
@@ -190,18 +385,20 @@ function(CPMAddPackage)
|
|||||||
SOURCE_DIR
|
SOURCE_DIR
|
||||||
DOWNLOAD_COMMAND
|
DOWNLOAD_COMMAND
|
||||||
FIND_PACKAGE_ARGUMENTS
|
FIND_PACKAGE_ARGUMENTS
|
||||||
|
NO_CACHE
|
||||||
|
GIT_SHALLOW
|
||||||
|
EXCLUDE_FROM_ALL
|
||||||
|
SOURCE_SUBDIR
|
||||||
)
|
)
|
||||||
|
|
||||||
set(multiValueArgs
|
set(multiValueArgs URL OPTIONS)
|
||||||
OPTIONS
|
|
||||||
)
|
|
||||||
|
|
||||||
cmake_parse_arguments(CPM_ARGS "" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}")
|
cmake_parse_arguments(CPM_ARGS "" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}")
|
||||||
|
|
||||||
# Set default values for arguments
|
# Set default values for arguments
|
||||||
|
|
||||||
if (NOT DEFINED CPM_ARGS_VERSION)
|
if(NOT DEFINED CPM_ARGS_VERSION)
|
||||||
if (DEFINED CPM_ARGS_GIT_TAG)
|
if(DEFINED CPM_ARGS_GIT_TAG)
|
||||||
cpm_get_version_from_git_tag("${CPM_ARGS_GIT_TAG}" CPM_ARGS_VERSION)
|
cpm_get_version_from_git_tag("${CPM_ARGS_GIT_TAG}" CPM_ARGS_VERSION)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
@@ -212,53 +409,92 @@ function(CPMAddPackage)
|
|||||||
set(DOWNLOAD_ONLY NO)
|
set(DOWNLOAD_ONLY NO)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (DEFINED CPM_ARGS_GITHUB_REPOSITORY)
|
if(DEFINED CPM_ARGS_GITHUB_REPOSITORY)
|
||||||
set(CPM_ARGS_GIT_REPOSITORY "https://github.com/${CPM_ARGS_GITHUB_REPOSITORY}.git")
|
set(CPM_ARGS_GIT_REPOSITORY "https://github.com/${CPM_ARGS_GITHUB_REPOSITORY}.git")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (DEFINED CPM_ARGS_GITLAB_REPOSITORY)
|
if(DEFINED CPM_ARGS_GITLAB_REPOSITORY)
|
||||||
list(CPM_ARGS_GIT_REPOSITORY "https://gitlab.com/${CPM_ARGS_GITLAB_REPOSITORY}.git")
|
set(CPM_ARGS_GIT_REPOSITORY "https://gitlab.com/${CPM_ARGS_GITLAB_REPOSITORY}.git")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (DEFINED CPM_ARGS_GIT_REPOSITORY)
|
if(DEFINED CPM_ARGS_GIT_REPOSITORY)
|
||||||
list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS GIT_REPOSITORY ${CPM_ARGS_GIT_REPOSITORY})
|
list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS GIT_REPOSITORY ${CPM_ARGS_GIT_REPOSITORY})
|
||||||
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()
|
||||||
|
|
||||||
if (DEFINED CPM_ARGS_GIT_TAG)
|
set(CPM_SKIP_FETCH FALSE)
|
||||||
|
|
||||||
|
if(DEFINED CPM_ARGS_GIT_TAG)
|
||||||
list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS GIT_TAG ${CPM_ARGS_GIT_TAG})
|
list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS GIT_TAG ${CPM_ARGS_GIT_TAG})
|
||||||
|
# If GIT_SHALLOW is explicitly specified, honor the value.
|
||||||
|
if(DEFINED CPM_ARGS_GIT_SHALLOW)
|
||||||
|
list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS GIT_SHALLOW ${CPM_ARGS_GIT_SHALLOW})
|
||||||
|
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()
|
endif()
|
||||||
|
|
||||||
# Check if package has been added before
|
# Check if package has been added before
|
||||||
CPMCheckIfPackageAlreadyAdded(${CPM_ARGS_NAME} "${CPM_ARGS_VERSION}" "${CPM_ARGS_OPTIONS}")
|
cpm_check_if_package_already_added(${CPM_ARGS_NAME} "${CPM_ARGS_VERSION}" "${CPM_ARGS_OPTIONS}")
|
||||||
if (CPM_PACKAGE_ALREADY_ADDED)
|
if(CPM_PACKAGE_ALREADY_ADDED)
|
||||||
cpm_export_variables(${CPM_ARGS_NAME})
|
cpm_export_variables(${CPM_ARGS_NAME})
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Check for manual overrides
|
# Check for manual overrides
|
||||||
if (NOT CPM_ARGS_FORCE AND NOT "${CPM_${CPM_ARGS_NAME}_SOURCE}" STREQUAL "")
|
if(NOT CPM_ARGS_FORCE AND NOT "${CPM_${CPM_ARGS_NAME}_SOURCE}" STREQUAL "")
|
||||||
set(PACKAGE_SOURCE ${CPM_${CPM_ARGS_NAME}_SOURCE})
|
set(PACKAGE_SOURCE ${CPM_${CPM_ARGS_NAME}_SOURCE})
|
||||||
set(CPM_${CPM_ARGS_NAME}_SOURCE "")
|
set(CPM_${CPM_ARGS_NAME}_SOURCE "")
|
||||||
CPMAddPackage(
|
CPMAddPackage(
|
||||||
NAME ${CPM_ARGS_NAME}
|
NAME ${CPM_ARGS_NAME}
|
||||||
SOURCE_DIR ${PACKAGE_SOURCE}
|
SOURCE_DIR ${PACKAGE_SOURCE}
|
||||||
FORCE True
|
FORCE True
|
||||||
|
OPTIONS ${CPM_ARGS_OPTIONS}
|
||||||
)
|
)
|
||||||
cpm_export_variables(${CPM_ARGS_NAME})
|
cpm_export_variables(${CPM_ARGS_NAME})
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Check for available declaration
|
# Check for available declaration
|
||||||
if (NOT CPM_ARGS_FORCE AND NOT "${CPM_DECLARATION_${CPM_ARGS_NAME}}" STREQUAL "")
|
if(NOT CPM_ARGS_FORCE AND NOT "${CPM_DECLARATION_${CPM_ARGS_NAME}}" STREQUAL "")
|
||||||
set(declaration ${CPM_DECLARATION_${CPM_ARGS_NAME}})
|
set(declaration ${CPM_DECLARATION_${CPM_ARGS_NAME}})
|
||||||
set(CPM_DECLARATION_${CPM_ARGS_NAME} "")
|
set(CPM_DECLARATION_${CPM_ARGS_NAME} "")
|
||||||
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
|
||||||
CPMCheckIfPackageAlreadyAdded(${CPM_ARGS_NAME} "${CPM_ARGS_VERSION}" "${CPM_ARGS_OPTIONS}")
|
cpm_check_if_package_already_added(${CPM_ARGS_NAME} "${CPM_ARGS_VERSION}" "${CPM_ARGS_OPTIONS}")
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -271,53 +507,76 @@ function(CPMAddPackage)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(CPM_LOCAL_PACKAGES_ONLY)
|
if(CPM_LOCAL_PACKAGES_ONLY)
|
||||||
message(SEND_ERROR "CPM: ${CPM_ARGS_NAME} not found via find_package(${CPM_ARGS_NAME} ${CPM_ARGS_VERSION})")
|
message(
|
||||||
|
SEND_ERROR
|
||||||
|
"CPM: ${CPM_ARGS_NAME} not found via find_package(${CPM_ARGS_NAME} ${CPM_ARGS_VERSION})"
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
CPMRegisterPackage("${CPM_ARGS_NAME}" "${CPM_ARGS_VERSION}")
|
CPMRegisterPackage("${CPM_ARGS_NAME}" "${CPM_ARGS_VERSION}")
|
||||||
|
|
||||||
if (CPM_ARGS_OPTIONS)
|
if(CPM_ARGS_OPTIONS)
|
||||||
foreach(OPTION ${CPM_ARGS_OPTIONS})
|
foreach(OPTION ${CPM_ARGS_OPTIONS})
|
||||||
cpm_parse_option(${OPTION})
|
cpm_parse_option(${OPTION})
|
||||||
set(${OPTION_KEY} ${OPTION_VALUE} CACHE INTERNAL "")
|
set(${OPTION_KEY}
|
||||||
|
${OPTION_VALUE}
|
||||||
|
CACHE INTERNAL ""
|
||||||
|
)
|
||||||
endforeach()
|
endforeach()
|
||||||
endif()
|
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)
|
||||||
set(PACKAGE_INFO "${CPM_ARGS_SOURCE_DIR}")
|
set(PACKAGE_INFO "${CPM_ARGS_SOURCE_DIR}")
|
||||||
else()
|
else()
|
||||||
set(PACKAGE_INFO "${CPM_ARGS_VERSION}")
|
set(PACKAGE_INFO "${CPM_ARGS_VERSION}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (DEFINED CPM_ARGS_DOWNLOAD_COMMAND)
|
if(DEFINED CPM_ARGS_DOWNLOAD_COMMAND)
|
||||||
list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS DOWNLOAD_COMMAND ${CPM_ARGS_DOWNLOAD_COMMAND})
|
list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS DOWNLOAD_COMMAND ${CPM_ARGS_DOWNLOAD_COMMAND})
|
||||||
elseif (DEFINED CPM_ARGS_SOURCE_DIR)
|
elseif(DEFINED CPM_ARGS_SOURCE_DIR)
|
||||||
list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS SOURCE_DIR ${CPM_ARGS_SOURCE_DIR})
|
list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS SOURCE_DIR ${CPM_ARGS_SOURCE_DIR})
|
||||||
elseif (CPM_SOURCE_CACHE)
|
elseif(CPM_SOURCE_CACHE AND NOT CPM_ARGS_NO_CACHE)
|
||||||
string(TOLOWER ${CPM_ARGS_NAME} lower_case_name)
|
string(TOLOWER ${CPM_ARGS_NAME} lower_case_name)
|
||||||
set(origin_parameters ${CPM_ARGS_UNPARSED_ARGUMENTS})
|
set(origin_parameters ${CPM_ARGS_UNPARSED_ARGUMENTS})
|
||||||
list(SORT origin_parameters)
|
list(SORT origin_parameters)
|
||||||
string(SHA1 origin_hash "${origin_parameters}")
|
string(SHA1 origin_hash "${origin_parameters}")
|
||||||
set(download_directory ${CPM_SOURCE_CACHE}/${lower_case_name}/${origin_hash})
|
set(download_directory ${CPM_SOURCE_CACHE}/${lower_case_name}/${origin_hash})
|
||||||
list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS SOURCE_DIR ${download_directory})
|
list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS SOURCE_DIR ${download_directory})
|
||||||
if (EXISTS ${download_directory})
|
if(EXISTS ${download_directory})
|
||||||
# disable the download command to allow offline builds
|
# avoid FetchContent modules to improve performance
|
||||||
list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS DOWNLOAD_COMMAND "${CMAKE_COMMAND}")
|
set(${CPM_ARGS_NAME}_BINARY_DIR ${CMAKE_BINARY_DIR}/_deps/${lower_case_name}-build)
|
||||||
set(PACKAGE_INFO "${download_directory}")
|
set(${CPM_ARGS_NAME}_ADDED YES)
|
||||||
|
set(${CPM_ARGS_NAME}_SOURCE_DIR ${download_directory})
|
||||||
|
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}"
|
||||||
|
)
|
||||||
|
set(CPM_SKIP_FETCH TRUE)
|
||||||
|
set(PACKAGE_INFO "${PACKAGE_INFO} at ${download_directory}")
|
||||||
else()
|
else()
|
||||||
|
# Enable shallow clone when GIT_TAG is not a commit hash. Our guess may not be accurate, but
|
||||||
|
# it should guarantee no commit hash get mis-detected.
|
||||||
|
if(NOT DEFINED CPM_ARGS_GIT_SHALLOW)
|
||||||
|
cpm_is_git_tag_commit_hash("${CPM_ARGS_GIT_TAG}" IS_HASH)
|
||||||
|
if(NOT ${IS_HASH})
|
||||||
|
list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS GIT_SHALLOW TRUE)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
# remove timestamps so CMake will re-download the dependency
|
# remove timestamps so CMake will re-download the dependency
|
||||||
file(REMOVE_RECURSE ${CMAKE_BINARY_DIR}/_deps/${lower_case_name}-subbuild)
|
file(REMOVE_RECURSE ${CMAKE_BINARY_DIR}/_deps/${lower_case_name}-subbuild)
|
||||||
set(PACKAGE_INFO "${PACKAGE_INFO} -> ${download_directory}")
|
set(PACKAGE_INFO "${PACKAGE_INFO} to ${download_directory}")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
CPMCreateModuleFile(${CPM_ARGS_NAME} "CPMAddPackage(${ARGN})")
|
cpm_create_module_file(${CPM_ARGS_NAME} "CPMAddPackage(${ARGN})")
|
||||||
|
|
||||||
if (CPM_PACKAGE_LOCK_ENABLED)
|
if(CPM_PACKAGE_LOCK_ENABLED)
|
||||||
if ((CPM_ARGS_VERSION AND NOT CPM_ARGS_SOURCE_DIR) OR CPM_INCLUDE_ALL_IN_PACKAGE_LOCK)
|
if((CPM_ARGS_VERSION AND NOT CPM_ARGS_SOURCE_DIR) OR CPM_INCLUDE_ALL_IN_PACKAGE_LOCK)
|
||||||
cpm_add_to_package_lock(${CPM_ARGS_NAME} "${ARGN}")
|
cpm_add_to_package_lock(${CPM_ARGS_NAME} "${ARGN}")
|
||||||
elseif(CPM_ARGS_SOURCE_DIR)
|
elseif(CPM_ARGS_SOURCE_DIR)
|
||||||
cpm_add_comment_to_package_lock(${CPM_ARGS_NAME} "local directory")
|
cpm_add_comment_to_package_lock(${CPM_ARGS_NAME} "local directory")
|
||||||
@@ -326,63 +585,89 @@ function(CPMAddPackage)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
cpm_declare_fetch("${CPM_ARGS_NAME}" "${CPM_ARGS_VERSION}" "${PACKAGE_INFO}" "${CPM_ARGS_UNPARSED_ARGUMENTS}")
|
message(
|
||||||
cpm_fetch_package("${CPM_ARGS_NAME}" "${DOWNLOAD_ONLY}")
|
STATUS "${CPM_INDENT} adding package ${CPM_ARGS_NAME}@${CPM_ARGS_VERSION} (${PACKAGE_INFO})"
|
||||||
cpm_get_fetch_properties("${CPM_ARGS_NAME}")
|
)
|
||||||
|
|
||||||
SET(${CPM_ARGS_NAME}_ADDED YES)
|
if(NOT CPM_SKIP_FETCH)
|
||||||
|
cpm_declare_fetch(
|
||||||
|
"${CPM_ARGS_NAME}" "${CPM_ARGS_VERSION}" "${PACKAGE_INFO}" "${CPM_ARGS_UNPARSED_ARGUMENTS}"
|
||||||
|
)
|
||||||
|
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_get_fetch_properties("${CPM_ARGS_NAME}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(${CPM_ARGS_NAME}_ADDED YES)
|
||||||
cpm_export_variables("${CPM_ARGS_NAME}")
|
cpm_export_variables("${CPM_ARGS_NAME}")
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# Fetch a previously declared package
|
# Fetch a previously declared package
|
||||||
macro(CPMGetPackage Name)
|
macro(CPMGetPackage Name)
|
||||||
if (DEFINED "CPM_DECLARATION_${Name}")
|
if(DEFINED "CPM_DECLARATION_${Name}")
|
||||||
CPMAddPackage(
|
CPMAddPackage(NAME ${Name})
|
||||||
NAME ${Name}
|
|
||||||
)
|
|
||||||
else()
|
else()
|
||||||
message(SEND_ERROR "Cannot retrieve package ${Name}: no declaration available")
|
message(SEND_ERROR "Cannot retrieve package ${Name}: no declaration available")
|
||||||
endif()
|
endif()
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
# export variables available to the caller to the parent scope
|
# export variables available to the caller to the parent scope expects ${CPM_ARGS_NAME} to be set
|
||||||
# expects ${CPM_ARGS_NAME} to be set
|
|
||||||
macro(cpm_export_variables name)
|
macro(cpm_export_variables name)
|
||||||
SET(${name}_SOURCE_DIR "${${name}_SOURCE_DIR}" PARENT_SCOPE)
|
set(${name}_SOURCE_DIR
|
||||||
SET(${name}_BINARY_DIR "${${name}_BINARY_DIR}" PARENT_SCOPE)
|
"${${name}_SOURCE_DIR}"
|
||||||
SET(${name}_ADDED "${${name}_ADDED}" PARENT_SCOPE)
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
|
set(${name}_BINARY_DIR
|
||||||
|
"${${name}_BINARY_DIR}"
|
||||||
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
|
set(${name}_ADDED
|
||||||
|
"${${name}_ADDED}"
|
||||||
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
# declares a package, so that any call to CPMAddPackage for the
|
# declares a package, so that any call to CPMAddPackage for the package name will use these
|
||||||
# package name will use these arguments instead
|
# arguments instead. Previous declarations will not be overriden.
|
||||||
macro(CPMDeclarePackage Name)
|
macro(CPMDeclarePackage Name)
|
||||||
if (NOT DEFINED "${CPM_DECLARATION_${Name}}")
|
if(NOT DEFINED "CPM_DECLARATION_${Name}")
|
||||||
set("CPM_DECLARATION_${Name}" "${ARGN}")
|
set("CPM_DECLARATION_${Name}" "${ARGN}")
|
||||||
endif()
|
endif()
|
||||||
endmacro()
|
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)
|
||||||
file(APPEND ${CPM_PACKAGE_LOCK_FILE} "# ${Name} (unversioned)\n# CPMDeclarePackage(${Name} \"${ARGN}\")\n")
|
cpm_prettify_package_arguments(PRETTY_ARGN true ${ARGN})
|
||||||
|
file(APPEND ${CPM_PACKAGE_LOCK_FILE}
|
||||||
|
"# ${Name} (unversioned)\n# CPMDeclarePackage(${Name}\n${PRETTY_ARGN}#)\n"
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# includes the package lock file if it exists and creates a target
|
# includes the package lock file if it exists and creates a target `cpm-write-package-lock` to
|
||||||
# `cpm-write-package-lock` to update it
|
# update it
|
||||||
macro(CPMUsePackageLock file)
|
macro(CPMUsePackageLock file)
|
||||||
if (NOT CPM_DONT_CREATE_PACKAGE_LOCK)
|
if(NOT CPM_DONT_CREATE_PACKAGE_LOCK)
|
||||||
get_filename_component(CPM_ABSOLUTE_PACKAGE_LOCK_PATH ${file} ABSOLUTE)
|
get_filename_component(CPM_ABSOLUTE_PACKAGE_LOCK_PATH ${file} ABSOLUTE)
|
||||||
if(EXISTS ${CPM_ABSOLUTE_PACKAGE_LOCK_PATH})
|
if(EXISTS ${CPM_ABSOLUTE_PACKAGE_LOCK_PATH})
|
||||||
include(${CPM_ABSOLUTE_PACKAGE_LOCK_PATH})
|
include(${CPM_ABSOLUTE_PACKAGE_LOCK_PATH})
|
||||||
endif()
|
endif()
|
||||||
if (NOT TARGET cpm-update-package-lock)
|
if(NOT TARGET cpm-update-package-lock)
|
||||||
add_custom_target(cpm-update-package-lock COMMAND ${CMAKE_COMMAND} -E copy ${CPM_PACKAGE_LOCK_FILE} ${CPM_ABSOLUTE_PACKAGE_LOCK_PATH})
|
add_custom_target(
|
||||||
|
cpm-update-package-lock COMMAND ${CMAKE_COMMAND} -E copy ${CPM_PACKAGE_LOCK_FILE}
|
||||||
|
${CPM_ABSOLUTE_PACKAGE_LOCK_PATH}
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
set(CPM_PACKAGE_LOCK_ENABLED true)
|
set(CPM_PACKAGE_LOCK_ENABLED true)
|
||||||
endif()
|
endif()
|
||||||
@@ -391,58 +676,89 @@ endmacro()
|
|||||||
# registers a package that has been added to CPM
|
# registers a package that has been added to CPM
|
||||||
function(CPMRegisterPackage PACKAGE VERSION)
|
function(CPMRegisterPackage PACKAGE VERSION)
|
||||||
list(APPEND CPM_PACKAGES ${PACKAGE})
|
list(APPEND CPM_PACKAGES ${PACKAGE})
|
||||||
set(CPM_PACKAGES ${CPM_PACKAGES} CACHE INTERNAL "")
|
set(CPM_PACKAGES
|
||||||
set("CPM_PACKAGE_${PACKAGE}_VERSION" ${VERSION} CACHE INTERNAL "")
|
${CPM_PACKAGES}
|
||||||
|
CACHE INTERNAL ""
|
||||||
|
)
|
||||||
|
set("CPM_PACKAGE_${PACKAGE}_VERSION"
|
||||||
|
${VERSION}
|
||||||
|
CACHE INTERNAL ""
|
||||||
|
)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# retrieve the current version of the package to ${OUTPUT}
|
# retrieve the current version of the package to ${OUTPUT}
|
||||||
function(CPMGetPackageVersion PACKAGE OUTPUT)
|
function(CPMGetPackageVersion PACKAGE OUTPUT)
|
||||||
set(${OUTPUT} "${CPM_PACKAGE_${PACKAGE}_VERSION}" PARENT_SCOPE)
|
set(${OUTPUT}
|
||||||
|
"${CPM_PACKAGE_${PACKAGE}_VERSION}"
|
||||||
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# declares a package in FetchContent_Declare
|
# declares a package in FetchContent_Declare
|
||||||
function (cpm_declare_fetch PACKAGE VERSION INFO)
|
function(cpm_declare_fetch PACKAGE VERSION INFO)
|
||||||
message(STATUS "${CPM_INDENT} adding package ${PACKAGE}@${VERSION} (${INFO})")
|
if(${CPM_DRY_RUN})
|
||||||
|
|
||||||
if (${CPM_DRY_RUN})
|
|
||||||
message(STATUS "${CPM_INDENT} package not declared (dry run)")
|
message(STATUS "${CPM_INDENT} package not declared (dry run)")
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
FetchContent_Declare(${PACKAGE}
|
FetchContent_Declare(${PACKAGE} ${ARGN})
|
||||||
${ARGN}
|
|
||||||
)
|
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# returns properties for a package previously defined by cpm_declare_fetch
|
# returns properties for a package previously defined by cpm_declare_fetch
|
||||||
function (cpm_get_fetch_properties PACKAGE)
|
function(cpm_get_fetch_properties PACKAGE)
|
||||||
if (${CPM_DRY_RUN})
|
if(${CPM_DRY_RUN})
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
FetchContent_GetProperties(${PACKAGE})
|
FetchContent_GetProperties(${PACKAGE})
|
||||||
string(TOLOWER ${PACKAGE} lpackage)
|
string(TOLOWER ${PACKAGE} lpackage)
|
||||||
SET(${PACKAGE}_SOURCE_DIR "${${lpackage}_SOURCE_DIR}" PARENT_SCOPE)
|
set(${PACKAGE}_SOURCE_DIR
|
||||||
SET(${PACKAGE}_BINARY_DIR "${${lpackage}_BINARY_DIR}" PARENT_SCOPE)
|
"${${lpackage}_SOURCE_DIR}"
|
||||||
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
|
set(${PACKAGE}_BINARY_DIR
|
||||||
|
"${${lpackage}_BINARY_DIR}"
|
||||||
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
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)
|
||||||
if (${CPM_DRY_RUN})
|
if(NOT DOWNLOAD_ONLY AND EXISTS ${SOURCE_DIR}/CMakeLists.txt)
|
||||||
|
if(EXCLUDE)
|
||||||
|
set(addSubdirectoryExtraArgs EXCLUDE_FROM_ALL)
|
||||||
|
else()
|
||||||
|
set(addSubdirectoryExtraArgs "")
|
||||||
|
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})
|
||||||
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()
|
endif()
|
||||||
else()
|
|
||||||
set(CPM_OLD_INDENT "${CPM_INDENT}")
|
string(TOLOWER "${PACKAGE}" lower_case_name)
|
||||||
set(CPM_INDENT "${CPM_INDENT} ${PACKAGE}:")
|
set(${PACKAGE}_SOURCE_DIR
|
||||||
FetchContent_MakeAvailable(${PACKAGE})
|
${${lower_case_name}_SOURCE_DIR}
|
||||||
set(CPM_INDENT "${CPM_OLD_INDENT}")
|
PARENT_SCOPE
|
||||||
endif()
|
)
|
||||||
|
set(${PACKAGE}_BINARY_DIR
|
||||||
|
${${lower_case_name}_BINARY_DIR}
|
||||||
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# splits a package option
|
# splits a package option
|
||||||
@@ -450,25 +766,126 @@ function(cpm_parse_option OPTION)
|
|||||||
string(REGEX MATCH "^[^ ]+" OPTION_KEY ${OPTION})
|
string(REGEX MATCH "^[^ ]+" OPTION_KEY ${OPTION})
|
||||||
string(LENGTH ${OPTION} OPTION_LENGTH)
|
string(LENGTH ${OPTION} OPTION_LENGTH)
|
||||||
string(LENGTH ${OPTION_KEY} OPTION_KEY_LENGTH)
|
string(LENGTH ${OPTION_KEY} OPTION_KEY_LENGTH)
|
||||||
if (OPTION_KEY_LENGTH STREQUAL OPTION_LENGTH)
|
if(OPTION_KEY_LENGTH STREQUAL OPTION_LENGTH)
|
||||||
# no value for key provided, assume user wants to set option to "ON"
|
# no value for key provided, assume user wants to set option to "ON"
|
||||||
set(OPTION_VALUE "ON")
|
set(OPTION_VALUE "ON")
|
||||||
else()
|
else()
|
||||||
math(EXPR OPTION_KEY_LENGTH "${OPTION_KEY_LENGTH}+1")
|
math(EXPR OPTION_KEY_LENGTH "${OPTION_KEY_LENGTH}+1")
|
||||||
string(SUBSTRING ${OPTION} "${OPTION_KEY_LENGTH}" "-1" OPTION_VALUE)
|
string(SUBSTRING ${OPTION} "${OPTION_KEY_LENGTH}" "-1" OPTION_VALUE)
|
||||||
endif()
|
endif()
|
||||||
set(OPTION_KEY "${OPTION_KEY}" PARENT_SCOPE)
|
set(OPTION_KEY
|
||||||
set(OPTION_VALUE "${OPTION_VALUE}" PARENT_SCOPE)
|
"${OPTION_KEY}"
|
||||||
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
|
set(OPTION_VALUE
|
||||||
|
"${OPTION_VALUE}"
|
||||||
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# guesses the package version from a git tag
|
# guesses the package version from a git tag
|
||||||
function(cpm_get_version_from_git_tag GIT_TAG RESULT)
|
function(cpm_get_version_from_git_tag GIT_TAG RESULT)
|
||||||
string(LENGTH ${GIT_TAG} length)
|
string(LENGTH ${GIT_TAG} length)
|
||||||
if (length EQUAL 40)
|
if(length EQUAL 40)
|
||||||
# GIT_TAG is probably a git hash
|
# GIT_TAG is probably a git hash
|
||||||
SET(${RESULT} 0 PARENT_SCOPE)
|
set(${RESULT}
|
||||||
|
0
|
||||||
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
else()
|
else()
|
||||||
string(REGEX MATCH "v?([0123456789.]*).*" _ ${GIT_TAG})
|
string(REGEX MATCH "v?([0123456789.]*).*" _ ${GIT_TAG})
|
||||||
SET(${RESULT} ${CMAKE_MATCH_1} PARENT_SCOPE)
|
set(${RESULT}
|
||||||
|
${CMAKE_MATCH_1}
|
||||||
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
# guesses if the git tag is a commit hash or an actual tag or a branch nane.
|
||||||
|
function(cpm_is_git_tag_commit_hash GIT_TAG RESULT)
|
||||||
|
string(LENGTH "${GIT_TAG}" length)
|
||||||
|
# full hash has 40 characters, and short hash has at least 7 characters.
|
||||||
|
if(length LESS 7 OR length GREATER 40)
|
||||||
|
set(${RESULT}
|
||||||
|
0
|
||||||
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
if(${GIT_TAG} MATCHES "^[a-fA-F0-9]+$")
|
||||||
|
set(${RESULT}
|
||||||
|
1
|
||||||
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
set(${RESULT}
|
||||||
|
0
|
||||||
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
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()
|
||||||
|
|||||||
21
cmake/get_cpm.cmake
Normal file
21
cmake/get_cpm.cmake
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
set(CPM_DOWNLOAD_VERSION 1.0.0-development-version)
|
||||||
|
|
||||||
|
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")
|
||||||
|
elseif(DEFINED ENV{CPM_SOURCE_CACHE})
|
||||||
|
set(CPM_DOWNLOAD_LOCATION "$ENV{CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
|
||||||
|
else()
|
||||||
|
set(CPM_DOWNLOAD_LOCATION "${CMAKE_BINARY_DIR}/cmake/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT (EXISTS ${CPM_DOWNLOAD_LOCATION}))
|
||||||
|
message(STATUS "Downloading CPM.cmake to ${CPM_DOWNLOAD_LOCATION}")
|
||||||
|
file(DOWNLOAD
|
||||||
|
https://github.com/cpm-cmake/CPM.cmake/releases/download/v${CPM_DOWNLOAD_VERSION}/CPM.cmake
|
||||||
|
${CPM_DOWNLOAD_LOCATION}
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
include(${CPM_DOWNLOAD_LOCATION})
|
||||||
@@ -1,34 +1,73 @@
|
|||||||
|
|
||||||
function(ASSERT_EQUAL)
|
function(ASSERT_EQUAL)
|
||||||
if (NOT ARGC EQUAL 2)
|
if(NOT ARGC EQUAL 2)
|
||||||
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}'")
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
function(ASSERT_DEFINED KEY)
|
||||||
|
if(DEFINED ${KEY})
|
||||||
|
message(STATUS "test passed: '${KEY}' is defined")
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "assertion failed: '${KEY}' is not defiend")
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(ASSERT_NOT_DEFINED KEY)
|
||||||
|
if(DEFINED ${KEY})
|
||||||
|
message(FATAL_ERROR "assertion failed: '${KEY}' is defiend")
|
||||||
|
else()
|
||||||
|
message(STATUS "test passed: '${KEY}' is not defined")
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
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}})")
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
function(ASSERTION_FAILED)
|
function(ASSERTION_FAILED)
|
||||||
message(FATAL_ERROR "assertion failed: ${ARGN}")
|
message(FATAL_ERROR "assertion failed: ${ARGN}")
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
function(ASSERT_EXISTS file)
|
function(ASSERT_EXISTS file)
|
||||||
if (NOT EXISTS ${file})
|
if(EXISTS ${file})
|
||||||
|
message(STATUS "test passed: '${file}' exists")
|
||||||
|
else()
|
||||||
message(FATAL_ERROR "assertion failed: file ${file} does not exist")
|
message(FATAL_ERROR "assertion failed: file ${file} does not exist")
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
function(ASSERT_NOT_EXISTS file)
|
function(ASSERT_NOT_EXISTS file)
|
||||||
if (EXISTS ${file})
|
if(NOT EXISTS ${file})
|
||||||
|
message(STATUS "test passed: '${file}' does not exist")
|
||||||
|
else()
|
||||||
message(FATAL_ERROR "assertion failed: file ${file} exists")
|
message(FATAL_ERROR "assertion failed: file ${file} exists")
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|||||||
63
examples/asio-standalone/CMakeLists.txt
Normal file
63
examples/asio-standalone/CMakeLists.txt
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||||
|
|
||||||
|
project(CPMExampleASIOStandalone)
|
||||||
|
|
||||||
|
# ---- Dependencies ----
|
||||||
|
|
||||||
|
include(../../cmake/CPM.cmake)
|
||||||
|
|
||||||
|
find_package(Threads REQUIRED)
|
||||||
|
|
||||||
|
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:
|
||||||
|
#
|
||||||
|
# 1) If _WIN32_WINNT is not set, ASIO assumes _WIN32_WINNT=0x0501, i.e. Windows XP target, which is
|
||||||
|
# definitely not the platform which most users target.
|
||||||
|
#
|
||||||
|
# 2) WIN32_LEAN_AND_MEAN is defined to make Winsock2 work.
|
||||||
|
if(asio_ADDED)
|
||||||
|
add_library(asio INTERFACE)
|
||||||
|
|
||||||
|
target_include_directories(asio SYSTEM INTERFACE ${asio_SOURCE_DIR}/asio/include)
|
||||||
|
|
||||||
|
target_compile_definitions(asio INTERFACE ASIO_STANDALONE ASIO_NO_DEPRECATED)
|
||||||
|
|
||||||
|
target_link_libraries(asio INTERFACE Threads::Threads)
|
||||||
|
|
||||||
|
if(WIN32)
|
||||||
|
# macro see @ https://stackoverflow.com/a/40217291/1746503
|
||||||
|
macro(get_win32_winnt version)
|
||||||
|
if(CMAKE_SYSTEM_VERSION)
|
||||||
|
set(ver ${CMAKE_SYSTEM_VERSION})
|
||||||
|
string(REGEX MATCH "^([0-9]+).([0-9])" ver ${ver})
|
||||||
|
string(REGEX MATCH "^([0-9]+)" verMajor ${ver})
|
||||||
|
# Check for Windows 10, b/c we'll need to convert to hex 'A'.
|
||||||
|
if("${verMajor}" MATCHES "10")
|
||||||
|
set(verMajor "A")
|
||||||
|
string(REGEX REPLACE "^([0-9]+)" ${verMajor} ver ${ver})
|
||||||
|
endif("${verMajor}" MATCHES "10")
|
||||||
|
# Remove all remaining '.' characters.
|
||||||
|
string(REPLACE "." "" ver ${ver})
|
||||||
|
# Prepend each digit with a zero.
|
||||||
|
string(REGEX REPLACE "([0-9A-Z])" "0\\1" ver ${ver})
|
||||||
|
set(${version} "0x${ver}")
|
||||||
|
endif()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
if(NOT DEFINED _WIN32_WINNT)
|
||||||
|
get_win32_winnt(ver)
|
||||||
|
set(_WIN32_WINNT ${ver})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
message(STATUS "Set _WIN32_WINNET=${_WIN32_WINNT}")
|
||||||
|
|
||||||
|
target_compile_definitions(asio INTERFACE _WIN32_WINNT=${_WIN32_WINNT} WIN32_LEAN_AND_MEAN)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# ---- Executable ----
|
||||||
|
|
||||||
|
add_executable(CPMExampleASIOStandalone main.cpp)
|
||||||
|
target_link_libraries(CPMExampleASIOStandalone asio)
|
||||||
|
target_compile_features(CPMExampleASIOStandalone PRIVATE cxx_std_11)
|
||||||
93
examples/asio-standalone/main.cpp
Normal file
93
examples/asio-standalone/main.cpp
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
//
|
||||||
|
// async_tcp_echo_server.cpp
|
||||||
|
// ~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
//
|
||||||
|
// Copyright (c) 2003-2020 Christopher M. Kohlhoff (chris at kohlhoff dot com)
|
||||||
|
//
|
||||||
|
// Distributed under the Boost Software License, Version 1.0.
|
||||||
|
// (See http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <iostream>
|
||||||
|
#include <memory>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
#include "asio.hpp"
|
||||||
|
|
||||||
|
// An asynchronous tcp echo server.
|
||||||
|
// See https://think-async.com/Asio/asio-1.16.1/src/examples/cpp11/echo/async_tcp_echo_server.cpp
|
||||||
|
|
||||||
|
using asio::ip::tcp;
|
||||||
|
|
||||||
|
class session : public std::enable_shared_from_this<session> {
|
||||||
|
public:
|
||||||
|
session(tcp::socket socket) : socket_(std::move(socket)) {}
|
||||||
|
|
||||||
|
void start() { do_read(); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
void do_read() {
|
||||||
|
auto self(shared_from_this());
|
||||||
|
socket_.async_read_some(asio::buffer(data_, max_length),
|
||||||
|
[this, self](std::error_code ec, std::size_t length) {
|
||||||
|
if (!ec) {
|
||||||
|
do_write(length);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void do_write(std::size_t length) {
|
||||||
|
auto self(shared_from_this());
|
||||||
|
asio::async_write(socket_, asio::buffer(data_, length),
|
||||||
|
[this, self](std::error_code ec, std::size_t /*length*/) {
|
||||||
|
if (!ec) {
|
||||||
|
do_read();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
tcp::socket socket_;
|
||||||
|
enum { max_length = 1024 };
|
||||||
|
char data_[max_length];
|
||||||
|
};
|
||||||
|
|
||||||
|
class server {
|
||||||
|
public:
|
||||||
|
server(asio::io_context& io_context, short port)
|
||||||
|
: acceptor_(io_context, tcp::endpoint(tcp::v4(), port)) {
|
||||||
|
do_accept();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void do_accept() {
|
||||||
|
acceptor_.async_accept([this](std::error_code ec, tcp::socket socket) {
|
||||||
|
if (!ec) {
|
||||||
|
std::make_shared<session>(std::move(socket))->start();
|
||||||
|
}
|
||||||
|
|
||||||
|
do_accept();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
tcp::acceptor acceptor_;
|
||||||
|
};
|
||||||
|
|
||||||
|
int main(int argc, char* argv[]) {
|
||||||
|
try {
|
||||||
|
if (argc != 2) {
|
||||||
|
std::cerr << "Usage: async_tcp_echo_server <port>\n";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
asio::io_context io_context;
|
||||||
|
|
||||||
|
server s(io_context, std::atoi(argv[1]));
|
||||||
|
|
||||||
|
io_context.run();
|
||||||
|
} catch (std::exception& e) {
|
||||||
|
std::cerr << "Exception: " << e.what() << "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -6,27 +6,22 @@ project(CPMExampleBenchmark)
|
|||||||
|
|
||||||
include(../../cmake/CPM.cmake)
|
include(../../cmake/CPM.cmake)
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage("gh:cpm-cmake/testpack-fibonacci@2.0")
|
||||||
NAME fibonacci
|
|
||||||
GIT_REPOSITORY https://github.com/TheLartians/Fibonacci.git
|
|
||||||
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
|
OPTIONS "BENCHMARK_ENABLE_TESTING Off"
|
||||||
"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)
|
||||||
|
|||||||
@@ -1,14 +1,13 @@
|
|||||||
#include <benchmark/benchmark.h>
|
#include <benchmark/benchmark.h>
|
||||||
#include <vector>
|
|
||||||
#include <algorithm>
|
|
||||||
#include <random>
|
|
||||||
|
|
||||||
#include <fibonacci.h>
|
#include <fibonacci.h>
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
#include <random>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
std::vector<unsigned> createTestNumbers(){
|
std::vector<unsigned> createTestNumbers() {
|
||||||
std::vector<unsigned> v;
|
std::vector<unsigned> v;
|
||||||
for (int i=0;i<25;++i) v.emplace_back(i);
|
for (int i = 0; i < 25; ++i) v.emplace_back(i);
|
||||||
std::random_device rd;
|
std::random_device rd;
|
||||||
std::mt19937 g(rd());
|
std::mt19937 g(rd());
|
||||||
std::shuffle(v.begin(), v.end(), g);
|
std::shuffle(v.begin(), v.end(), g);
|
||||||
@@ -18,7 +17,7 @@ std::vector<unsigned> createTestNumbers(){
|
|||||||
void fibonacci(benchmark::State& state) {
|
void fibonacci(benchmark::State& state) {
|
||||||
auto numbers = createTestNumbers();
|
auto numbers = createTestNumbers();
|
||||||
for (auto _ : state) {
|
for (auto _ : state) {
|
||||||
for (auto v: numbers) benchmark::DoNotOptimize(fibonacci(v));
|
for (auto v : numbers) benchmark::DoNotOptimize(fibonacci(v));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -27,7 +26,7 @@ BENCHMARK(fibonacci);
|
|||||||
void fastFibonacci(benchmark::State& state) {
|
void fastFibonacci(benchmark::State& state) {
|
||||||
auto numbers = createTestNumbers();
|
auto numbers = createTestNumbers();
|
||||||
for (auto _ : state) {
|
for (auto _ : state) {
|
||||||
for (auto v: numbers) benchmark::DoNotOptimize(fastFibonacci(v));
|
for (auto v : numbers) benchmark::DoNotOptimize(fastFibonacci(v));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -8,17 +8,13 @@
|
|||||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
//
|
//
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include <boost/asio.hpp>
|
#include <boost/asio.hpp>
|
||||||
#include <boost/date_time/posix_time/posix_time.hpp>
|
#include <boost/date_time/posix_time/posix_time.hpp>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
void print(const boost::system::error_code& /*e*/)
|
void print(const boost::system::error_code& /*e*/) { std::cout << "Hello, world!" << std::endl; }
|
||||||
{
|
|
||||||
std::cout << "Hello, world!" << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main()
|
int main() {
|
||||||
{
|
|
||||||
boost::asio::io_service io;
|
boost::asio::io_service io;
|
||||||
|
|
||||||
boost::asio::deadline_timer t(io, boost::posix_time::seconds(1));
|
boost::asio::deadline_timer t(io, boost::posix_time::seconds(1));
|
||||||
|
|||||||
@@ -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,25 +6,16 @@ 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")
|
||||||
GIT_REPOSITORY https://github.com/TheLartians/Fibonacci.git
|
|
||||||
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 ----
|
||||||
|
|
||||||
ENABLE_TESTING()
|
enable_testing()
|
||||||
ADD_TEST(CPMExampleCatch2 CPMExampleCatch2)
|
add_test(CPMExampleCatch2 CPMExampleCatch2)
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
#define CATCH_CONFIG_MAIN
|
#define CATCH_CONFIG_MAIN
|
||||||
|
|
||||||
#include <catch2/catch.hpp>
|
|
||||||
#include <fibonacci.h>
|
#include <fibonacci.h>
|
||||||
|
|
||||||
TEST_CASE("fibonacci"){
|
#include <catch2/catch.hpp>
|
||||||
|
|
||||||
|
TEST_CASE("fibonacci") {
|
||||||
REQUIRE(fibonacci(0) == 0);
|
REQUIRE(fibonacci(0) == 0);
|
||||||
REQUIRE(fibonacci(1) == 1);
|
REQUIRE(fibonacci(1) == 1);
|
||||||
REQUIRE(fibonacci(2) == 1);
|
REQUIRE(fibonacci(2) == 1);
|
||||||
@@ -13,8 +14,8 @@ TEST_CASE("fibonacci"){
|
|||||||
REQUIRE(fibonacci(13) == 233);
|
REQUIRE(fibonacci(13) == 233);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("fastFibonacci"){
|
TEST_CASE("fastFibonacci") {
|
||||||
for (unsigned i=0; i<25; ++i){
|
for (unsigned i = 0; i < 25; ++i) {
|
||||||
REQUIRE(fibonacci(i) == fastFibonacci(i));
|
REQUIRE(fibonacci(i) == fastFibonacci(i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,15 +8,13 @@ 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
|
OPTIONS "SKIP_PORTABILITY_TEST ON" "JUST_INSTALL_CEREAL ON"
|
||||||
"SKIP_PORTABILITY_TEST ON"
|
|
||||||
"JUST_INSTALL_CEREAL ON"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# ---- Create binary ----
|
# ---- Create binary ----
|
||||||
|
|
||||||
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)
|
||||||
|
|||||||
@@ -1,28 +1,20 @@
|
|||||||
#define CATCH_CONFIG_MAIN
|
#define CATCH_CONFIG_MAIN
|
||||||
|
|
||||||
#include <cereal/cereal.hpp>
|
|
||||||
#include <cereal/archives/json.hpp>
|
#include <cereal/archives/json.hpp>
|
||||||
|
#include <cereal/cereal.hpp>
|
||||||
#include <string>
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
struct player_data
|
struct player_data {
|
||||||
{
|
|
||||||
int id{-1};
|
int id{-1};
|
||||||
std::string name{};
|
std::string name{};
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename Archive>
|
template <typename Archive> void serialize(Archive &archive, player_data const &data) {
|
||||||
void serialize(Archive& archive, player_data const &data)
|
archive(cereal::make_nvp("id", data.id), cereal::make_nvp("name", data.name));
|
||||||
{
|
|
||||||
archive(
|
|
||||||
cereal::make_nvp("id", data.id),
|
|
||||||
cereal::make_nvp("name", data.name)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char const *argv[])
|
int main(int argc, char const *argv[]) {
|
||||||
{
|
|
||||||
player_data player{3, "Gamer One"};
|
player_data player{3, "Gamer One"};
|
||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
cereal::JSONOutputArchive output(oss);
|
cereal::JSONOutputArchive output(oss);
|
||||||
|
|||||||
@@ -6,17 +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)
|
||||||
|
|||||||
@@ -1,12 +1,10 @@
|
|||||||
#include <cxxopts.hpp>
|
#include <cxxopts.hpp>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
int main(int argc, char ** argv) {
|
int main(int argc, char** argv) {
|
||||||
cxxopts::Options options("MyProgram", "One line description of MyProgram");
|
cxxopts::Options options("MyProgram", "One line description of MyProgram");
|
||||||
options.add_options()
|
options.add_options()("h,help", "Show help")("d,debug", "Enable debugging")(
|
||||||
("h,help", "Show help")
|
"f,file", "File name", cxxopts::value<std::string>());
|
||||||
("d,debug", "Enable debugging")
|
|
||||||
("f,file", "File name", cxxopts::value<std::string>());
|
|
||||||
|
|
||||||
auto result = options.parse(argc, argv);
|
auto result = options.parse(argc, argv);
|
||||||
|
|
||||||
@@ -15,7 +13,7 @@ int main(int argc, char ** argv) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto arg: result.arguments()) {
|
for (auto arg : result.arguments()) {
|
||||||
std::cout << "option: " << arg.key() << ": " << arg.value() << std::endl;
|
std::cout << "option: " << arg.key() << ": " << arg.value() << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,25 +6,16 @@ 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")
|
||||||
GIT_REPOSITORY https://github.com/TheLartians/Fibonacci.git
|
|
||||||
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 ----
|
||||||
|
|
||||||
ENABLE_TESTING()
|
enable_testing()
|
||||||
ADD_TEST(CPMExampleDoctest CPMExampleDoctest)
|
add_test(CPMExampleDoctest CPMExampleDoctest)
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
#include <doctest/doctest.h>
|
#include <doctest/doctest.h>
|
||||||
#include <fibonacci.h>
|
#include <fibonacci.h>
|
||||||
|
|
||||||
TEST_CASE("fibonacci"){
|
TEST_CASE("fibonacci") {
|
||||||
CHECK(fibonacci(0) == 0);
|
CHECK(fibonacci(0) == 0);
|
||||||
CHECK(fibonacci(1) == 1);
|
CHECK(fibonacci(1) == 1);
|
||||||
CHECK(fibonacci(2) == 1);
|
CHECK(fibonacci(2) == 1);
|
||||||
@@ -13,8 +13,8 @@ TEST_CASE("fibonacci"){
|
|||||||
CHECK(fibonacci(13) == 233);
|
CHECK(fibonacci(13) == 233);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("fastfibonacci"){
|
TEST_CASE("fastfibonacci") {
|
||||||
for (unsigned i=0; i<25; ++i){
|
for (unsigned i = 0; i < 25; ++i) {
|
||||||
CHECK(fibonacci(i) == fastFibonacci(i));
|
CHECK(fibonacci(i) == fastFibonacci(i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,13 +14,13 @@ CPMAddPackage(
|
|||||||
DOWNLOAD_ONLY True
|
DOWNLOAD_ONLY True
|
||||||
)
|
)
|
||||||
|
|
||||||
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)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#include <entt/entt.hpp>
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
#include <entt/entt.hpp>
|
||||||
|
|
||||||
struct position {
|
struct position {
|
||||||
float x;
|
float x;
|
||||||
@@ -14,7 +14,7 @@ struct velocity {
|
|||||||
void update(entt::registry ®istry) {
|
void update(entt::registry ®istry) {
|
||||||
auto view = registry.view<position, velocity>();
|
auto view = registry.view<position, velocity>();
|
||||||
|
|
||||||
for(auto entity: view) {
|
for (auto entity : view) {
|
||||||
// gets only the components that are going to be used ...
|
// gets only the components that are going to be used ...
|
||||||
|
|
||||||
auto &vel = view.get<velocity>(entity);
|
auto &vel = view.get<velocity>(entity);
|
||||||
@@ -41,10 +41,12 @@ int main() {
|
|||||||
entt::registry registry;
|
entt::registry registry;
|
||||||
std::uint64_t dt = 16;
|
std::uint64_t dt = 16;
|
||||||
|
|
||||||
for(auto i = 0; i < 10; ++i) {
|
for (auto i = 0; i < 10; ++i) {
|
||||||
auto entity = registry.create();
|
auto entity = registry.create();
|
||||||
registry.assign<position>(entity, i * 1.f, i * 1.f);
|
registry.assign<position>(entity, i * 1.f, i * 1.f);
|
||||||
if(i % 2 == 0) { registry.assign<velocity>(entity, i * .1f, i * .1f); }
|
if (i % 2 == 0) {
|
||||||
|
registry.assign<velocity>(entity, i * .1f, i * .1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
update(dt, registry);
|
update(dt, registry);
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
|
|
||||||
int main(){
|
int main() {
|
||||||
fmt::print("Hello, {}!\n", "world");
|
fmt::print("Hello, {}!\n", "world");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,27 +6,21 @@ project(CPMExampleGtest)
|
|||||||
|
|
||||||
include(../../cmake/CPM.cmake)
|
include(../../cmake/CPM.cmake)
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage("gh:cpm-cmake/testpack-fibonacci@2.0")
|
||||||
NAME fibonacci
|
|
||||||
GIT_REPOSITORY https://github.com/TheLartians/Fibonacci.git
|
|
||||||
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
|
OPTIONS "INSTALL_GTEST OFF" "gtest_force_shared_crt"
|
||||||
"INSTALL_GTEST OFF"
|
|
||||||
"gtest_force_shared_crt"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# ---- Create binary ----
|
# ---- Create binary ----
|
||||||
|
|
||||||
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 ----
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
#include <gtest/gtest.h>
|
|
||||||
#include <fibonacci.h>
|
#include <fibonacci.h>
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
TEST(FibonacciTests, BasicChecks)
|
TEST(FibonacciTests, BasicChecks) {
|
||||||
{
|
|
||||||
ASSERT_TRUE(fibonacci(0) == 0);
|
ASSERT_TRUE(fibonacci(0) == 0);
|
||||||
ASSERT_TRUE(fibonacci(1) == 1);
|
ASSERT_TRUE(fibonacci(1) == 1);
|
||||||
ASSERT_TRUE(fibonacci(2) == 1);
|
ASSERT_TRUE(fibonacci(2) == 1);
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -1,23 +1,15 @@
|
|||||||
#include <nlohmann/json.hpp>
|
|
||||||
#include <iostream>
|
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
|
#include <iostream>
|
||||||
|
#include <nlohmann/json.hpp>
|
||||||
|
|
||||||
int main(){
|
int main() {
|
||||||
|
nlohmann::json json = {{"pi", 3.141},
|
||||||
nlohmann::json json = {
|
|
||||||
{"pi", 3.141},
|
|
||||||
{"happy", true},
|
{"happy", true},
|
||||||
{"name", "Niels"},
|
{"name", "Niels"},
|
||||||
{"nothing", nullptr},
|
{"nothing", nullptr},
|
||||||
{"answer", {
|
{"answer", {{"everything", 42}}},
|
||||||
{"everything", 42}
|
|
||||||
}},
|
|
||||||
{"list", {1, 0, 2}},
|
{"list", {1, 0, 2}},
|
||||||
{"object", {
|
{"object", {{"currency", "USD"}, {"value", 42.99}}}};
|
||||||
{"currency", "USD"},
|
|
||||||
{"value", 42.99}
|
|
||||||
}}
|
|
||||||
};
|
|
||||||
|
|
||||||
std::cout << "declared JSON object: " << std::setw(2) << json << std::endl;
|
std::cout << "declared JSON object: " << std::setw(2) << json << std::endl;
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "linenoise.h"
|
|
||||||
|
|
||||||
|
#include "linenoise.h"
|
||||||
|
|
||||||
void completion(const char *buf, linenoiseCompletions *lc) {
|
void completion(const char *buf, linenoiseCompletions *lc) {
|
||||||
if (buf[0] == 'h') {
|
if (buf[0] == 'h') {
|
||||||
linenoiseAddCompletion(lc,"hello");
|
linenoiseAddCompletion(lc, "hello");
|
||||||
linenoiseAddCompletion(lc,"hello there");
|
linenoiseAddCompletion(lc, "hello there");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -16,13 +16,13 @@ int main(int argc, char **argv) {
|
|||||||
char *prgname = argv[0];
|
char *prgname = argv[0];
|
||||||
|
|
||||||
/* Parse options, with --multiline we enable multi line editing. */
|
/* Parse options, with --multiline we enable multi line editing. */
|
||||||
while(argc > 1) {
|
while (argc > 1) {
|
||||||
argc--;
|
argc--;
|
||||||
argv++;
|
argv++;
|
||||||
if (!strcmp(*argv,"--multiline")) {
|
if (!strcmp(*argv, "--multiline")) {
|
||||||
linenoiseSetMultiLine(1);
|
linenoiseSetMultiLine(1);
|
||||||
printf("Multi-line mode enabled.\n");
|
printf("Multi-line mode enabled.\n");
|
||||||
} else if (!strcmp(*argv,"--keycodes")) {
|
} else if (!strcmp(*argv, "--keycodes")) {
|
||||||
linenoisePrintKeyCodes();
|
linenoisePrintKeyCodes();
|
||||||
exit(0);
|
exit(0);
|
||||||
} else {
|
} else {
|
||||||
@@ -45,15 +45,15 @@ int main(int argc, char **argv) {
|
|||||||
*
|
*
|
||||||
* The typed string is returned as a malloc() allocated string by
|
* The typed string is returned as a malloc() allocated string by
|
||||||
* linenoise, so the user needs to free() it. */
|
* linenoise, so the user needs to free() it. */
|
||||||
while((line = linenoise("hello> ")) != NULL) {
|
while ((line = linenoise("hello> ")) != NULL) {
|
||||||
/* Do something with the string. */
|
/* Do something with the string. */
|
||||||
if (line[0] != '\0' && line[0] != '/') {
|
if (line[0] != '\0' && line[0] != '/') {
|
||||||
printf("echo: '%s'\n", line);
|
printf("echo: '%s'\n", line);
|
||||||
linenoiseHistoryAdd(line); /* Add to the history. */
|
linenoiseHistoryAdd(line); /* Add to the history. */
|
||||||
linenoiseHistorySave("history.txt"); /* Save the history on disk. */
|
linenoiseHistorySave("history.txt"); /* Save the history on disk. */
|
||||||
} else if (!strncmp(line,"/historylen",11)) {
|
} else if (!strncmp(line, "/historylen", 11)) {
|
||||||
/* The "/historylen" command will change the history len. */
|
/* The "/historylen" command will change the history len. */
|
||||||
int len = atoi(line+11);
|
int len = atoi(line + 11);
|
||||||
linenoiseHistorySetMaxLen(len);
|
linenoiseHistorySetMaxLen(len);
|
||||||
} else if (line[0] == '/') {
|
} else if (line[0] == '/') {
|
||||||
printf("Unreconized command: %s\n", line);
|
printf("Unreconized command: %s\n", line);
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -18,21 +18,18 @@
|
|||||||
// vector all_of is_six: false
|
// vector all_of is_six: false
|
||||||
// vector none_of is_six: false
|
// vector none_of is_six: false
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
#include <range/v3/algorithm/all_of.hpp>
|
#include <range/v3/algorithm/all_of.hpp>
|
||||||
#include <range/v3/algorithm/any_of.hpp>
|
#include <range/v3/algorithm/any_of.hpp>
|
||||||
#include <range/v3/algorithm/for_each.hpp>
|
#include <range/v3/algorithm/for_each.hpp>
|
||||||
#include <range/v3/algorithm/none_of.hpp>
|
#include <range/v3/algorithm/none_of.hpp>
|
||||||
#include <range/v3/view/all.hpp>
|
#include <range/v3/view/all.hpp>
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
using std::cout;
|
using std::cout;
|
||||||
|
|
||||||
auto is_six = [](int i) { return i == 6; };
|
auto is_six = [](int i) { return i == 6; };
|
||||||
|
|
||||||
int
|
int main() {
|
||||||
main()
|
|
||||||
{
|
|
||||||
std::vector<int> v{6, 2, 3, 4, 5, 6};
|
std::vector<int> v{6, 2, 3, 4, 5, 6};
|
||||||
cout << std::boolalpha;
|
cout << std::boolalpha;
|
||||||
cout << "vector: " << ranges::view::all(v) << '\n';
|
cout << "vector: " << ranges::view::all(v) << '\n';
|
||||||
|
|||||||
@@ -15,12 +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)
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
|
#include <iostream>
|
||||||
#include <simple_match/simple_match.hpp>
|
#include <simple_match/simple_match.hpp>
|
||||||
|
|
||||||
#include <iostream>
|
int main(int argc, char** argv) {
|
||||||
|
|
||||||
int main(int argc, char ** argv){
|
|
||||||
using namespace simple_match;
|
using namespace simple_match;
|
||||||
using namespace simple_match::placeholders;
|
using namespace simple_match::placeholders;
|
||||||
|
|
||||||
@@ -12,22 +11,23 @@ int main(int argc, char ** argv){
|
|||||||
while (true) {
|
while (true) {
|
||||||
std::cout << "> ";
|
std::cout << "> ";
|
||||||
std::getline(std::cin, input);
|
std::getline(std::cin, input);
|
||||||
if (input == "quit") { break; }
|
if (input == "quit") {
|
||||||
|
break;
|
||||||
|
}
|
||||||
int x;
|
int x;
|
||||||
try {
|
try {
|
||||||
x = std::stoi(input);
|
x = std::stoi(input);
|
||||||
} catch(std::invalid_argument &) {
|
} catch (std::invalid_argument&) {
|
||||||
std::cout << "invalid input" << std::endl;
|
std::cout << "invalid input" << std::endl;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
match(x,
|
match(
|
||||||
1, []() {std::cout << "The answer is one\n"; },
|
x, 1, []() { std::cout << "The answer is one\n"; }, 2,
|
||||||
2, []() {std::cout << "The answer is two\n"; },
|
[]() { std::cout << "The answer is two\n"; }, _x < 10,
|
||||||
_x < 10, [](auto&& a) {std::cout << "The answer " << a << " is less than 10\n"; },
|
[](auto&& a) { std::cout << "The answer " << a << " is less than 10\n"; }, 10 < _x < 20,
|
||||||
10 < _x < 20, [](auto&& a) {std::cout << "The answer " << a << " is between 10 and 20 exclusive\n"; },
|
[](auto&& a) { std::cout << "The answer " << a << " is between 10 and 20 exclusive\n"; }, _,
|
||||||
_, []() {std::cout << "Did not match\n"; }
|
[]() { std::cout << "Did not match\n"; });
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -13,19 +13,16 @@ CPMAddPackage(
|
|||||||
DOWNLOAD_ONLY YES
|
DOWNLOAD_ONLY YES
|
||||||
)
|
)
|
||||||
|
|
||||||
if (lua_ADDED)
|
if(lua_ADDED)
|
||||||
# lua has no CMakeLists, so we create our own target
|
# lua has no CMakeLists, so we create our own target
|
||||||
|
|
||||||
FILE(GLOB lua_sources ${lua_SOURCE_DIR}/*.c)
|
file(GLOB lua_sources ${lua_SOURCE_DIR}/*.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
|
target_include_directories(lua SYSTEM PUBLIC $<BUILD_INTERFACE:${lua_SOURCE_DIR}>)
|
||||||
PUBLIC
|
|
||||||
$<BUILD_INTERFACE:${lua_SOURCE_DIR}>
|
|
||||||
)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage(
|
||||||
NAME sol2
|
NAME sol2
|
||||||
URL https://github.com/ThePhD/sol2/archive/v3.0.2.zip
|
URL https://github.com/ThePhD/sol2/archive/v3.0.2.zip
|
||||||
@@ -33,15 +30,14 @@ CPMAddPackage(
|
|||||||
DOWNLOAD_ONLY YES
|
DOWNLOAD_ONLY YES
|
||||||
)
|
)
|
||||||
|
|
||||||
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)
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#include <sol/sol.hpp>
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
#include <sol/sol.hpp>
|
||||||
|
|
||||||
struct vars {
|
struct vars {
|
||||||
int boop = 0;
|
int boop = 0;
|
||||||
@@ -7,9 +7,10 @@ struct vars {
|
|||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
sol::state lua;
|
sol::state lua;
|
||||||
lua.open_libraries( sol::lib::base );
|
lua.open_libraries(sol::lib::base);
|
||||||
lua.new_usertype<vars>("vars", "boop", &vars::boop);
|
lua.new_usertype<vars>("vars", "boop", &vars::boop);
|
||||||
lua.script("beep = vars.new()\n"
|
lua.script(
|
||||||
|
"beep = vars.new()\n"
|
||||||
"beep.boop = 1\n"
|
"beep.boop = 1\n"
|
||||||
"print('beep boop')");
|
"print('beep boop')");
|
||||||
assert(lua.get<vars>("beep").boop == 1);
|
assert(lua.get<vars>("beep").boop == 1);
|
||||||
|
|||||||
15
examples/spdlog/CMakeLists.txt
Normal file
15
examples/spdlog/CMakeLists.txt
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||||
|
|
||||||
|
project(CPMSpdlogExample)
|
||||||
|
|
||||||
|
# ---- Dependencies ----
|
||||||
|
|
||||||
|
include(../../cmake/CPM.cmake)
|
||||||
|
|
||||||
|
CPMAddPackage("gh:gabime/spdlog@1.8.2")
|
||||||
|
|
||||||
|
# ---- Executable ----
|
||||||
|
|
||||||
|
add_executable(CPMSpdlogExample main.cpp)
|
||||||
|
target_compile_features(CPMSpdlogExample PRIVATE cxx_std_17)
|
||||||
|
target_link_libraries(CPMSpdlogExample spdlog)
|
||||||
6
examples/spdlog/main.cpp
Normal file
6
examples/spdlog/main.cpp
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
#include <spdlog/spdlog.h>
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
spdlog::info("Hello, world!");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -6,22 +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)
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
#include <yaml-cpp/yaml.h>
|
#include <yaml-cpp/yaml.h>
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
int main(int argc, char ** argv){
|
int main(int argc, char** argv) {
|
||||||
if (argc != 2) {
|
if (argc != 2) {
|
||||||
std::cout << "usage: " << argv[0] << " <path to yaml file>" << std::endl;
|
std::cout << "usage: " << argv[0] << " <path to yaml file>" << std::endl;
|
||||||
return 1;
|
return 1;
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ enable_testing()
|
|||||||
|
|
||||||
foreach(test ${tests})
|
foreach(test ${tests})
|
||||||
message(STATUS "adding test: ${test}")
|
message(STATUS "adding test: ${test}")
|
||||||
add_test(
|
add_test(NAME ${test} COMMAND ${CMAKE_COMMAND} -DCPM_PATH=${CMAKE_CURRENT_SOURCE_DIR}/../cmake -P
|
||||||
NAME ${test}
|
"${test}"
|
||||||
COMMAND ${CMAKE_COMMAND} -DCPM_PATH=${CMAKE_CURRENT_SOURCE_DIR}/../cmake -P "${test}"
|
|
||||||
)
|
)
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
|
|||||||
12
test/style/CMakeLists.txt
Normal file
12
test/style/CMakeLists.txt
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||||
|
|
||||||
|
project(CPMStyleCheck)
|
||||||
|
|
||||||
|
include(${CMAKE_CURRENT_LIST_DIR}/../../cmake/CPM.cmake)
|
||||||
|
|
||||||
|
CPMAddPackage(
|
||||||
|
NAME Format.cmake
|
||||||
|
VERSION 1.6
|
||||||
|
GITHUB_REPOSITORY TheLartians/Format.cmake
|
||||||
|
OPTIONS "FORMAT_CHECK_CMAKE ON"
|
||||||
|
)
|
||||||
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)
|
||||||
@@ -3,130 +3,135 @@ cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
|||||||
include(${CPM_PATH}/testing.cmake)
|
include(${CPM_PATH}/testing.cmake)
|
||||||
include(CMakePackageConfigHelpers)
|
include(CMakePackageConfigHelpers)
|
||||||
|
|
||||||
|
|
||||||
set(CPM_SOURCE_CACHE_DIR "${CMAKE_CURRENT_BINARY_DIR}/CPM")
|
set(CPM_SOURCE_CACHE_DIR "${CMAKE_CURRENT_BINARY_DIR}/CPM")
|
||||||
set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/cache)
|
set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/remote_dependency)
|
||||||
|
|
||||||
function(clear_cache)
|
function(clear_cache)
|
||||||
message(STATUS "clearing CPM cache")
|
message(STATUS "clearing CPM cache")
|
||||||
FILE(REMOVE_RECURSE ${CPM_SOURCE_CACHE_DIR})
|
file(REMOVE_RECURSE ${CPM_SOURCE_CACHE_DIR})
|
||||||
|
assert_not_exists("${CPM_SOURCE_CACHE_DIR}")
|
||||||
if (EXISTS "${CPM_SOURCE_CACHE_DIR}")
|
|
||||||
ASSERTION_FAILED("cache not cleared")
|
|
||||||
endif()
|
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
function(update_cmake_lists)
|
function(update_cmake_lists)
|
||||||
configure_package_config_file(
|
configure_package_config_file(
|
||||||
"${CMAKE_CURRENT_LIST_DIR}/cache/CMakeLists.txt.in"
|
"${CMAKE_CURRENT_LIST_DIR}/remote_dependency/CMakeLists.txt.in"
|
||||||
"${CMAKE_CURRENT_LIST_DIR}/cache/CMakeLists.txt"
|
"${CMAKE_CURRENT_LIST_DIR}/remote_dependency/CMakeLists.txt"
|
||||||
INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/junk
|
INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/junk
|
||||||
)
|
)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
function(reset_test)
|
function(reset_test)
|
||||||
clear_cache()
|
clear_cache()
|
||||||
FILE(REMOVE_RECURSE ${TEST_BUILD_DIR})
|
file(REMOVE_RECURSE ${TEST_BUILD_DIR})
|
||||||
update_cmake_lists()
|
update_cmake_lists()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
set(FIBONACCI_VERSION 1.0)
|
set(FIBONACCI_VERSION 1.0)
|
||||||
|
|
||||||
## Read CPM_SOURCE_CACHE from arguments
|
# Read CPM_SOURCE_CACHE from arguments
|
||||||
|
|
||||||
reset_test()
|
reset_test()
|
||||||
|
|
||||||
execute_process(
|
execute_process(
|
||||||
COMMAND
|
COMMAND ${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/remote_dependency" "-B${TEST_BUILD_DIR}"
|
||||||
${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/cache" "-B${TEST_BUILD_DIR}" "-DCPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}"
|
"-DCPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}" RESULT_VARIABLE ret
|
||||||
RESULT_VARIABLE ret
|
|
||||||
)
|
)
|
||||||
|
|
||||||
ASSERT_EQUAL(${ret} "0")
|
assert_equal(${ret} "0")
|
||||||
|
assert_exists("${CPM_SOURCE_CACHE_DIR}/fibonacci")
|
||||||
|
|
||||||
if (NOT EXISTS "${CPM_SOURCE_CACHE_DIR}/fibonacci")
|
file(GLOB FIBONACCI_VERSIONs "${CPM_SOURCE_CACHE_DIR}/fibonacci/*")
|
||||||
ASSERTION_FAILED("fibonacci not in cache")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
FILE(GLOB FIBONACCI_VERSIONs "${CPM_SOURCE_CACHE_DIR}/fibonacci/*")
|
|
||||||
list(LENGTH FIBONACCI_VERSIONs FIBONACCI_VERSION_count)
|
list(LENGTH FIBONACCI_VERSIONs FIBONACCI_VERSION_count)
|
||||||
ASSERT_EQUAL(${FIBONACCI_VERSION_count} "1")
|
assert_equal(${FIBONACCI_VERSION_count} "1")
|
||||||
|
|
||||||
FILE(GLOB fibonacci_versions "${CPM_SOURCE_CACHE_DIR}/fibonacci/*")
|
file(GLOB fibonacci_versions "${CPM_SOURCE_CACHE_DIR}/fibonacci/*")
|
||||||
list(LENGTH fibonacci_versions fibonacci_version_count)
|
list(LENGTH fibonacci_versions fibonacci_version_count)
|
||||||
ASSERT_EQUAL(${fibonacci_version_count} "1")
|
assert_equal(${fibonacci_version_count} "1")
|
||||||
|
|
||||||
## Update dependency and keep CPM_SOURCE_CACHE
|
# Update dependency and keep CPM_SOURCE_CACHE
|
||||||
|
|
||||||
set(FIBONACCI_VERSION 2.0)
|
set(FIBONACCI_VERSION 2.0)
|
||||||
update_cmake_lists()
|
update_cmake_lists()
|
||||||
|
|
||||||
execute_process(
|
execute_process(COMMAND ${CMAKE_COMMAND} ${TEST_BUILD_DIR} RESULT_VARIABLE ret)
|
||||||
COMMAND
|
|
||||||
${CMAKE_COMMAND} ${TEST_BUILD_DIR}
|
|
||||||
RESULT_VARIABLE ret
|
|
||||||
)
|
|
||||||
|
|
||||||
ASSERT_EQUAL(${ret} "0")
|
assert_equal(${ret} "0")
|
||||||
|
|
||||||
FILE(GLOB FIBONACCI_VERSIONs "${CPM_SOURCE_CACHE_DIR}/fibonacci/*")
|
file(GLOB FIBONACCI_VERSIONs "${CPM_SOURCE_CACHE_DIR}/fibonacci/*")
|
||||||
list(LENGTH FIBONACCI_VERSIONs FIBONACCI_VERSION_count)
|
list(LENGTH FIBONACCI_VERSIONs FIBONACCI_VERSION_count)
|
||||||
ASSERT_EQUAL(${FIBONACCI_VERSION_count} "2")
|
assert_equal(${FIBONACCI_VERSION_count} "2")
|
||||||
|
|
||||||
## Clear cache and update
|
# Clear cache and update
|
||||||
|
|
||||||
clear_cache()
|
clear_cache()
|
||||||
|
|
||||||
|
execute_process(COMMAND ${CMAKE_COMMAND} ${TEST_BUILD_DIR} RESULT_VARIABLE ret)
|
||||||
|
|
||||||
|
assert_equal(${ret} "0")
|
||||||
|
assert_exists("${CPM_SOURCE_CACHE_DIR}/fibonacci")
|
||||||
|
|
||||||
|
# Read CPM_SOURCE_CACHE from environment
|
||||||
|
|
||||||
|
reset_test()
|
||||||
|
|
||||||
execute_process(
|
execute_process(
|
||||||
COMMAND
|
COMMAND ${CMAKE_COMMAND} -E env "CPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}" ${CMAKE_COMMAND}
|
||||||
${CMAKE_COMMAND} ${TEST_BUILD_DIR}
|
"-H${CMAKE_CURRENT_LIST_DIR}/remote_dependency" "-B${TEST_BUILD_DIR}" RESULT_VARIABLE ret
|
||||||
|
)
|
||||||
|
|
||||||
|
assert_equal(${ret} "0")
|
||||||
|
assert_exists("${CPM_SOURCE_CACHE_DIR}/fibonacci")
|
||||||
|
|
||||||
|
# Reuse cached packages for other build
|
||||||
|
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E env "CPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}" ${CMAKE_COMMAND}
|
||||||
|
"-H${CMAKE_CURRENT_LIST_DIR}/remote_dependency" "-B${TEST_BUILD_DIR}-2"
|
||||||
RESULT_VARIABLE ret
|
RESULT_VARIABLE ret
|
||||||
)
|
)
|
||||||
|
|
||||||
ASSERT_EQUAL(${ret} "0")
|
assert_equal(${ret} "0")
|
||||||
|
|
||||||
if (NOT EXISTS "${CPM_SOURCE_CACHE_DIR}/fibonacci")
|
# Overwrite CPM_SOURCE_CACHE with argument
|
||||||
ASSERTION_FAILED("fibonacci not in cache")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
## Read CPM_SOURCE_CACHE from environment
|
|
||||||
|
|
||||||
reset_test()
|
reset_test()
|
||||||
|
|
||||||
execute_process(
|
execute_process(
|
||||||
COMMAND
|
COMMAND
|
||||||
${CMAKE_COMMAND} -E env "CPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}" ${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/cache" "-B${TEST_BUILD_DIR}"
|
${CMAKE_COMMAND} -E env "CPM_SOURCE_CACHE=${CMAKE_CURRENT_BINARY_DIR}/junk" ${CMAKE_COMMAND}
|
||||||
|
"-H${CMAKE_CURRENT_LIST_DIR}/remote_dependency" "-B${TEST_BUILD_DIR}"
|
||||||
|
"-DCPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}"
|
||||||
RESULT_VARIABLE ret
|
RESULT_VARIABLE ret
|
||||||
)
|
)
|
||||||
|
|
||||||
ASSERT_EQUAL(${ret} "0")
|
assert_equal(${ret} "0")
|
||||||
|
assert_exists("${CPM_SOURCE_CACHE_DIR}/fibonacci")
|
||||||
|
|
||||||
if (NOT EXISTS "${CPM_SOURCE_CACHE_DIR}/fibonacci")
|
# Use NO_CACHE option
|
||||||
ASSERTION_FAILED("fibonacci not in cache")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
## Reuse cached packages for other build
|
|
||||||
|
|
||||||
execute_process(
|
|
||||||
COMMAND
|
|
||||||
${CMAKE_COMMAND} -E env "CPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}" ${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/cache" "-B${TEST_BUILD_DIR}-2"
|
|
||||||
RESULT_VARIABLE ret
|
|
||||||
)
|
|
||||||
|
|
||||||
ASSERT_EQUAL(${ret} "0")
|
|
||||||
|
|
||||||
## Overwrite CPM_SOURCE_CACHE with argument
|
|
||||||
|
|
||||||
|
set(FIBONACCI_PACKAGE_ARGS "NO_CACHE YES")
|
||||||
|
set(FIBONACCI_VERSION 1.0)
|
||||||
|
update_cmake_lists()
|
||||||
reset_test()
|
reset_test()
|
||||||
|
|
||||||
execute_process(
|
execute_process(
|
||||||
COMMAND
|
COMMAND ${CMAKE_COMMAND} -E env "CPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}" ${CMAKE_COMMAND}
|
||||||
${CMAKE_COMMAND} -E env "CPM_SOURCE_CACHE=${CMAKE_CURRENT_BINARY_DIR}/junk" ${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/cache" "-B${TEST_BUILD_DIR}" "-DCPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}"
|
"-H${CMAKE_CURRENT_LIST_DIR}/remote_dependency" "-B${TEST_BUILD_DIR}" RESULT_VARIABLE ret
|
||||||
RESULT_VARIABLE ret
|
|
||||||
)
|
)
|
||||||
|
|
||||||
ASSERT_EQUAL(${ret} "0")
|
assert_equal(${ret} "0")
|
||||||
|
assert_not_exists("${CPM_SOURCE_CACHE_DIR}/fibonacci")
|
||||||
|
|
||||||
if (NOT EXISTS "${CPM_SOURCE_CACHE_DIR}/fibonacci")
|
# Use commit hash after version
|
||||||
ASSERTION_FAILED("fibonacci not in cache")
|
|
||||||
endif()
|
set(FIBONACCI_PACKAGE_ARGS "NO_CACHE YES GIT_TAG e9ebf168ca0fffaa4ef8c6fefc6346aaa22f6ed5")
|
||||||
|
set(FIBONACCI_VERSION 1.1)
|
||||||
|
update_cmake_lists()
|
||||||
|
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E env "CPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}" ${CMAKE_COMMAND}
|
||||||
|
"-H${CMAKE_CURRENT_LIST_DIR}/remote_dependency" "-B${TEST_BUILD_DIR}" RESULT_VARIABLE ret
|
||||||
|
)
|
||||||
|
|
||||||
|
assert_equal(${ret} "0")
|
||||||
|
assert_not_exists("${CPM_SOURCE_CACHE_DIR}/fibonacci")
|
||||||
|
|||||||
@@ -5,31 +5,19 @@ include(${CPM_PATH}/testing.cmake)
|
|||||||
|
|
||||||
set(CPM_DRY_RUN ON)
|
set(CPM_DRY_RUN ON)
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage(NAME A GIT_TAG 1.2.3)
|
||||||
NAME A
|
|
||||||
GIT_TAG 1.2.3
|
|
||||||
)
|
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage(NAME A VERSION 1.2.3)
|
||||||
NAME A
|
|
||||||
VERSION 1.2.3
|
|
||||||
)
|
|
||||||
|
|
||||||
CPMGetPackageVersion(A VERSION)
|
CPMGetPackageVersion(A VERSION)
|
||||||
ASSERT_EQUAL(${VERSION} "1.2.3")
|
assert_equal(${VERSION} "1.2.3")
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage(NAME B VERSION 2.4.1)
|
||||||
NAME B
|
|
||||||
VERSION 2.4.1
|
|
||||||
)
|
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage(NAME B GIT_TAG v2.3.1)
|
||||||
NAME B
|
|
||||||
GIT_TAG v2.3.1
|
|
||||||
)
|
|
||||||
|
|
||||||
CPMGetPackageVersion(B VERSION)
|
CPMGetPackageVersion(B VERSION)
|
||||||
ASSERT_EQUAL(${VERSION} "2.4.1")
|
assert_equal(${VERSION} "2.4.1")
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage(
|
||||||
NAME C
|
NAME C
|
||||||
@@ -38,4 +26,4 @@ CPMAddPackage(
|
|||||||
)
|
)
|
||||||
|
|
||||||
CPMGetPackageVersion(C VERSION)
|
CPMGetPackageVersion(C VERSION)
|
||||||
ASSERT_EQUAL(${VERSION} "3.1.2")
|
assert_equal(${VERSION} "3.1.2")
|
||||||
|
|||||||
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)
|
||||||
22
test/unit/is_git_tag_commit_hash.cmake
Normal file
22
test/unit/is_git_tag_commit_hash.cmake
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||||
|
|
||||||
|
include(${CPM_PATH}/CPM.cmake)
|
||||||
|
include(${CPM_PATH}/testing.cmake)
|
||||||
|
|
||||||
|
cpm_is_git_tag_commit_hash("v1.2.3" RESULT)
|
||||||
|
assert_equal("0" ${RESULT})
|
||||||
|
|
||||||
|
cpm_is_git_tag_commit_hash("asio-1-12-1" RESULT)
|
||||||
|
assert_equal("0" ${RESULT})
|
||||||
|
|
||||||
|
cpm_is_git_tag_commit_hash("513039e3cba83284cec71287fd829865b9f423bc" RESULT)
|
||||||
|
assert_equal("1" ${RESULT})
|
||||||
|
|
||||||
|
cpm_is_git_tag_commit_hash("513039E3CBA83284CEC71287FD829865B9F423BC" RESULT)
|
||||||
|
assert_equal("1" ${RESULT})
|
||||||
|
|
||||||
|
cpm_is_git_tag_commit_hash("513039E" RESULT)
|
||||||
|
assert_equal("1" ${RESULT})
|
||||||
|
|
||||||
|
cpm_is_git_tag_commit_hash("513039E3CBA8" RESULT)
|
||||||
|
assert_equal("1" ${RESULT})
|
||||||
2
test/unit/local_dependency/.gitignore
vendored
Normal file
2
test/unit/local_dependency/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/CMakeLists.txt
|
||||||
|
/package-lock.cmake
|
||||||
@@ -24,3 +24,11 @@ endif()
|
|||||||
# ---- Call dependency method to validate correct addition of directory ----
|
# ---- Call dependency method to validate correct addition of directory ----
|
||||||
|
|
||||||
dependency_function()
|
dependency_function()
|
||||||
|
|
||||||
|
# ---- Check parameters ----
|
||||||
|
|
||||||
|
include(@CPM_PATH@/testing.cmake)
|
||||||
|
|
||||||
|
ASSERT_TRUTHY(@TEST_DEPENDENCY_NAME@_ADDED)
|
||||||
|
ASSERT_DEFINED(@TEST_DEPENDENCY_NAME@_SOURCE_DIR)
|
||||||
|
ASSERT_DEFINED(@TEST_DEPENDENCY_NAME@_BINARY_DIR)
|
||||||
@@ -17,3 +17,11 @@ CPMAddPackage(
|
|||||||
# ---- Call dependency method to validate correct addition of directory ----
|
# ---- Call dependency method to validate correct addition of directory ----
|
||||||
|
|
||||||
dependency_function()
|
dependency_function()
|
||||||
|
|
||||||
|
# ---- Check parameters ----
|
||||||
|
|
||||||
|
include(@CPM_PATH@/testing.cmake)
|
||||||
|
|
||||||
|
ASSERT_TRUTHY(Dependency_ADDED)
|
||||||
|
ASSERT_DEFINED(Dependency_SOURCE_DIR)
|
||||||
|
ASSERT_DEFINED(Dependency_BINARY_DIR)
|
||||||
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,4 +1,3 @@
|
|||||||
|
|
||||||
function(dependency_function)
|
function(dependency_function)
|
||||||
message("called external method")
|
message("called external method")
|
||||||
endfunction()
|
endfunction()
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
function(inner_dependency_function)
|
||||||
|
message("called inner method")
|
||||||
|
endfunction()
|
||||||
@@ -1,30 +1,28 @@
|
|||||||
|
|
||||||
include(CMakePackageConfigHelpers)
|
include(CMakePackageConfigHelpers)
|
||||||
include(${CPM_PATH}/testing.cmake)
|
include(${CPM_PATH}/testing.cmake)
|
||||||
|
|
||||||
set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/modules)
|
set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/modules)
|
||||||
|
|
||||||
function(initProjectWithDependency TEST_DEPENDENCY_NAME)
|
function(init_project_with_dependency TEST_DEPENDENCY_NAME)
|
||||||
configure_package_config_file(
|
configure_package_config_file(
|
||||||
"${CMAKE_CURRENT_LIST_DIR}/test_project/ModuleCMakeLists.txt.in"
|
"${CMAKE_CURRENT_LIST_DIR}/local_dependency/ModuleCMakeLists.txt.in"
|
||||||
"${CMAKE_CURRENT_LIST_DIR}/test_project/CMakeLists.txt"
|
"${CMAKE_CURRENT_LIST_DIR}/local_dependency/CMakeLists.txt"
|
||||||
INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/junk
|
INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/junk
|
||||||
)
|
)
|
||||||
|
|
||||||
execute_process(
|
execute_process(
|
||||||
COMMAND
|
COMMAND ${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/local_dependency" "-B${TEST_BUILD_DIR}"
|
||||||
${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/test_project" "-B${TEST_BUILD_DIR}"
|
|
||||||
RESULT_VARIABLE ret
|
RESULT_VARIABLE ret
|
||||||
)
|
)
|
||||||
|
|
||||||
ASSERT_EQUAL(${ret} "0")
|
assert_equal(${ret} "0")
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
initProjectWithDependency(A)
|
init_project_with_dependency(A)
|
||||||
ASSERT_EXISTS(${TEST_BUILD_DIR}/CPM_modules)
|
assert_exists(${TEST_BUILD_DIR}/CPM_modules)
|
||||||
ASSERT_EXISTS(${TEST_BUILD_DIR}/CPM_modules/FindA.cmake)
|
assert_exists(${TEST_BUILD_DIR}/CPM_modules/FindA.cmake)
|
||||||
ASSERT_NOT_EXISTS(${TEST_BUILD_DIR}/CPM_modules/FindB.cmake)
|
assert_not_exists(${TEST_BUILD_DIR}/CPM_modules/FindB.cmake)
|
||||||
|
|
||||||
initProjectWithDependency(B)
|
init_project_with_dependency(B)
|
||||||
ASSERT_NOT_EXISTS(${TEST_BUILD_DIR}/CPM_modules/FindA.cmake)
|
assert_not_exists(${TEST_BUILD_DIR}/CPM_modules/FindA.cmake)
|
||||||
ASSERT_EXISTS(${TEST_BUILD_DIR}/CPM_modules/FindB.cmake)
|
assert_exists(${TEST_BUILD_DIR}/CPM_modules/FindB.cmake)
|
||||||
|
|||||||
@@ -1,49 +1,53 @@
|
|||||||
|
|
||||||
include(CMakePackageConfigHelpers)
|
include(CMakePackageConfigHelpers)
|
||||||
include(${CPM_PATH}/testing.cmake)
|
include(${CPM_PATH}/testing.cmake)
|
||||||
|
|
||||||
set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/package-lock)
|
set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/package-lock)
|
||||||
|
|
||||||
function(configureWithDeclare DECLARE_DEPENDENCY)
|
function(configure_with_declare DECLARE_DEPENDENCY)
|
||||||
execute_process(COMMAND ${CMAKE_COMMAND} -E rm -rf ${TEST_BUILD_DIR})
|
execute_process(COMMAND ${CMAKE_COMMAND} -E rm -rf ${TEST_BUILD_DIR})
|
||||||
|
|
||||||
if (DECLARE_DEPENDENCY)
|
if(DECLARE_DEPENDENCY)
|
||||||
set(PREPARE_CODE "CPMDeclarePackage(Dependency
|
set(PREPARE_CODE
|
||||||
|
"CPMDeclarePackage(Dependency
|
||||||
NAME Dependency
|
NAME Dependency
|
||||||
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/test_project/dependency
|
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/local_dependency/dependency
|
||||||
)")
|
)"
|
||||||
|
)
|
||||||
else()
|
else()
|
||||||
set(PREPARE_CODE "")
|
set(PREPARE_CODE "")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
configure_package_config_file(
|
configure_package_config_file(
|
||||||
"${CMAKE_CURRENT_LIST_DIR}/test_project/PackageLockCMakeLists.txt.in"
|
"${CMAKE_CURRENT_LIST_DIR}/local_dependency/PackageLockCMakeLists.txt.in"
|
||||||
"${CMAKE_CURRENT_LIST_DIR}/test_project/CMakeLists.txt"
|
"${CMAKE_CURRENT_LIST_DIR}/local_dependency/CMakeLists.txt"
|
||||||
INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/junk
|
INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/junk
|
||||||
)
|
)
|
||||||
|
|
||||||
execute_process(
|
execute_process(
|
||||||
COMMAND ${CMAKE_COMMAND} -H${CMAKE_CURRENT_LIST_DIR}/test_project -B${TEST_BUILD_DIR} -DCPM_INCLUDE_ALL_IN_PACKAGE_LOCK=1
|
COMMAND ${CMAKE_COMMAND} -H${CMAKE_CURRENT_LIST_DIR}/local_dependency -B${TEST_BUILD_DIR}
|
||||||
RESULT_VARIABLE ret
|
-DCPM_INCLUDE_ALL_IN_PACKAGE_LOCK=1 RESULT_VARIABLE ret
|
||||||
)
|
)
|
||||||
|
|
||||||
ASSERT_EQUAL(${ret} "0")
|
assert_equal(${ret} "0")
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
function(updatePackageLock)
|
function(update_package_lock)
|
||||||
execute_process(
|
execute_process(
|
||||||
COMMAND ${CMAKE_COMMAND} --build ${TEST_BUILD_DIR} --target cpm-update-package-lock
|
COMMAND ${CMAKE_COMMAND} --build ${TEST_BUILD_DIR} --target cpm-update-package-lock
|
||||||
RESULT_VARIABLE ret
|
RESULT_VARIABLE ret
|
||||||
)
|
)
|
||||||
|
|
||||||
ASSERT_EQUAL(${ret} "0")
|
assert_equal(${ret} "0")
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
execute_process(COMMAND ${CMAKE_COMMAND} -E rm -f ${CMAKE_CURRENT_LIST_DIR}/test_project/package-lock.cmake)
|
execute_process(
|
||||||
configureWithDeclare(YES)
|
COMMAND ${CMAKE_COMMAND} -E rm -f ${CMAKE_CURRENT_LIST_DIR}/local_dependency/package-lock.cmake
|
||||||
ASSERT_NOT_EXISTS(${CMAKE_CURRENT_LIST_DIR}/test_project/package-lock.cmake)
|
)
|
||||||
updatePackageLock()
|
configure_with_declare(YES)
|
||||||
ASSERT_EXISTS(${CMAKE_CURRENT_LIST_DIR}/test_project/package-lock.cmake)
|
assert_not_exists(${CMAKE_CURRENT_LIST_DIR}/local_dependency/package-lock.cmake)
|
||||||
configureWithDeclare(NO)
|
update_package_lock()
|
||||||
execute_process(COMMAND ${CMAKE_COMMAND} -E rm -f ${CMAKE_CURRENT_LIST_DIR}/test_project/package-lock.cmake)
|
assert_exists(${CMAKE_CURRENT_LIST_DIR}/local_dependency/package-lock.cmake)
|
||||||
|
configure_with_declare(NO)
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E rm -f ${CMAKE_CURRENT_LIST_DIR}/local_dependency/package-lock.cmake
|
||||||
|
)
|
||||||
|
|||||||
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})
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
include(CMakePackageConfigHelpers)
|
include(CMakePackageConfigHelpers)
|
||||||
include(${CPM_PATH}/testing.cmake)
|
include(${CPM_PATH}/testing.cmake)
|
||||||
|
|
||||||
@@ -7,14 +6,15 @@ set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/project-override)
|
|||||||
execute_process(COMMAND ${CMAKE_COMMAND} -E rm -rf ${TEST_BUILD_DIR})
|
execute_process(COMMAND ${CMAKE_COMMAND} -E rm -rf ${TEST_BUILD_DIR})
|
||||||
|
|
||||||
configure_package_config_file(
|
configure_package_config_file(
|
||||||
"${CMAKE_CURRENT_LIST_DIR}/test_project/OverrideCMakeLists.txt.in"
|
"${CMAKE_CURRENT_LIST_DIR}/local_dependency/OverrideCMakeLists.txt.in"
|
||||||
"${CMAKE_CURRENT_LIST_DIR}/test_project/CMakeLists.txt"
|
"${CMAKE_CURRENT_LIST_DIR}/local_dependency/CMakeLists.txt"
|
||||||
INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/junk
|
INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/junk
|
||||||
)
|
)
|
||||||
|
|
||||||
execute_process(
|
execute_process(
|
||||||
COMMAND ${CMAKE_COMMAND} -H${CMAKE_CURRENT_LIST_DIR}/test_project -B${TEST_BUILD_DIR} -DCPM_Dependency_SOURCE=${CMAKE_CURRENT_LIST_DIR}/test_project/dependency
|
COMMAND ${CMAKE_COMMAND} -H${CMAKE_CURRENT_LIST_DIR}/local_dependency -B${TEST_BUILD_DIR}
|
||||||
|
-DCPM_Dependency_SOURCE=${CMAKE_CURRENT_LIST_DIR}/local_dependency/dependency
|
||||||
RESULT_VARIABLE ret
|
RESULT_VARIABLE ret
|
||||||
)
|
)
|
||||||
|
|
||||||
ASSERT_EQUAL(${ret} "0")
|
assert_equal(${ret} "0")
|
||||||
|
|||||||
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,8 +12,9 @@ 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@
|
||||||
)
|
)
|
||||||
|
|
||||||
# ---- Create binary ----
|
# ---- Create binary ----
|
||||||
@@ -21,3 +22,11 @@ CPMAddPackage(
|
|||||||
add_executable(CPMExampleCatch2 main.cpp)
|
add_executable(CPMExampleCatch2 main.cpp)
|
||||||
target_link_libraries(CPMExampleCatch2 fibonacci)
|
target_link_libraries(CPMExampleCatch2 fibonacci)
|
||||||
set_target_properties(CPMExampleCatch2 PROPERTIES CXX_STANDARD 17 COMPILE_FLAGS "-Wall -pedantic -Wextra -Werror")
|
set_target_properties(CPMExampleCatch2 PROPERTIES CXX_STANDARD 17 COMPILE_FLAGS "-Wall -pedantic -Wextra -Werror")
|
||||||
|
|
||||||
|
# ---- Check parameters ----
|
||||||
|
|
||||||
|
include(@CPM_PATH@/testing.cmake)
|
||||||
|
|
||||||
|
ASSERT_TRUTHY(fibonacci_ADDED)
|
||||||
|
ASSERT_DEFINED(fibonacci_SOURCE_DIR)
|
||||||
|
ASSERT_DEFINED(fibonacci_BINARY_DIR)
|
||||||
@@ -1,9 +1,10 @@
|
|||||||
#define CATCH_CONFIG_MAIN
|
#define CATCH_CONFIG_MAIN
|
||||||
|
|
||||||
#include <fibonacci.h>
|
#include <fibonacci.h>
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
int main(){
|
int main() {
|
||||||
std::cout << "fib(10) = " << fastFibonacci(10) << std::endl;
|
std::cout << "fib(10) = " << fastFibonacci(10) << std::endl;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
include(CMakePackageConfigHelpers)
|
include(CMakePackageConfigHelpers)
|
||||||
include(${CPM_PATH}/testing.cmake)
|
include(${CPM_PATH}/testing.cmake)
|
||||||
|
|
||||||
@@ -7,15 +6,14 @@ set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/source_dir)
|
|||||||
set(TEST_DEPENDENCY_NAME Dependency)
|
set(TEST_DEPENDENCY_NAME Dependency)
|
||||||
|
|
||||||
configure_package_config_file(
|
configure_package_config_file(
|
||||||
"${CMAKE_CURRENT_LIST_DIR}/test_project/ModuleCMakeLists.txt.in"
|
"${CMAKE_CURRENT_LIST_DIR}/local_dependency/ModuleCMakeLists.txt.in"
|
||||||
"${CMAKE_CURRENT_LIST_DIR}/test_project/CMakeLists.txt"
|
"${CMAKE_CURRENT_LIST_DIR}/local_dependency/CMakeLists.txt"
|
||||||
INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/junk
|
INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/junk
|
||||||
)
|
)
|
||||||
|
|
||||||
execute_process(
|
execute_process(
|
||||||
COMMAND
|
COMMAND ${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/local_dependency" "-B${TEST_BUILD_DIR}"
|
||||||
${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/test_project" "-B${TEST_BUILD_DIR}"
|
|
||||||
RESULT_VARIABLE ret
|
RESULT_VARIABLE ret
|
||||||
)
|
)
|
||||||
|
|
||||||
ASSERT_EQUAL(${ret} "0")
|
assert_equal(${ret} "0")
|
||||||
|
|||||||
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")
|
||||||
@@ -3,14 +3,14 @@ cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
|||||||
include(${CPM_PATH}/CPM.cmake)
|
include(${CPM_PATH}/CPM.cmake)
|
||||||
include(${CPM_PATH}/testing.cmake)
|
include(${CPM_PATH}/testing.cmake)
|
||||||
|
|
||||||
CPM_GET_VERSION_FROM_GIT_TAG("1.2.3" VERSION)
|
cpm_get_version_from_git_tag("1.2.3" VERSION)
|
||||||
ASSERT_EQUAL("1.2.3" ${VERSION})
|
assert_equal("1.2.3" ${VERSION})
|
||||||
|
|
||||||
CPM_GET_VERSION_FROM_GIT_TAG("v1.2.3" VERSION)
|
cpm_get_version_from_git_tag("v1.2.3" VERSION)
|
||||||
ASSERT_EQUAL("1.2.3" ${VERSION})
|
assert_equal("1.2.3" ${VERSION})
|
||||||
|
|
||||||
CPM_GET_VERSION_FROM_GIT_TAG("1.2.3-a" VERSION)
|
cpm_get_version_from_git_tag("1.2.3-a" VERSION)
|
||||||
ASSERT_EQUAL("1.2.3" ${VERSION})
|
assert_equal("1.2.3" ${VERSION})
|
||||||
|
|
||||||
CPM_GET_VERSION_FROM_GIT_TAG("v1.2.3-a" VERSION)
|
cpm_get_version_from_git_tag("v1.2.3-a" VERSION)
|
||||||
ASSERT_EQUAL("1.2.3" ${VERSION})
|
assert_equal("1.2.3" ${VERSION})
|
||||||
|
|||||||
Reference in New Issue
Block a user