mirror of
https://github.com/cpm-cmake/CPM.cmake.git
synced 2025-11-18 07:07:47 -05:00
Compare commits
74 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4fad2eac0a | ||
|
|
ee08119642 | ||
|
|
259f1be8e2 | ||
|
|
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 | ||
|
|
4425bd38cf | ||
|
|
6da5c38dae | ||
|
|
76d7b27459 | ||
|
|
54a2d80d1e | ||
|
|
829262cbd3 | ||
|
|
4aeea1d31d | ||
|
|
58365446f5 | ||
|
|
4937617ef1 | ||
|
|
6f053907f5 | ||
|
|
84b31b560a | ||
|
|
3fff3ca70d | ||
|
|
ca33abc236 | ||
|
|
119eaee84d | ||
|
|
00b5e80f88 | ||
|
|
618cdefa0d | ||
|
|
464ba554c2 | ||
|
|
90558aa9cb | ||
|
|
95c5426d25 | ||
|
|
cea81872cf | ||
|
|
01b69aad82 | ||
|
|
775a235880 | ||
|
|
f8d4e959bb | ||
|
|
4c7aa36dff | ||
|
|
3a4516265c | ||
|
|
47bfb554ab | ||
|
|
0a8a65df32 | ||
|
|
a2800dc96c | ||
|
|
7638be873a | ||
|
|
d1a1b70d4a | ||
|
|
4064a45552 | ||
|
|
b1855e9275 | ||
|
|
5191b4c703 |
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
|
||||
22
.github/workflows/macos.yml
vendored
Normal file
22
.github/workflows/macos.yml
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
name: MacOS
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: macos-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
|
||||
- name: run tests
|
||||
run: |
|
||||
cmake -Htest -Bbuild/test
|
||||
cmake --build build/test --target test-verbose
|
||||
28
.github/workflows/publish.yaml
vendored
Normal file
28
.github/workflows/publish.yaml
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
name: Publish
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- '*'
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Publish CPM.cmake
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- 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
|
||||
uses: svenstaro/upload-release-action@v1-release
|
||||
with:
|
||||
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
tag: ${{ github.ref }}
|
||||
file: dist/*.cmake
|
||||
file_glob: 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
|
||||
29
.github/workflows/ubuntu.yml
vendored
Normal file
29
.github/workflows/ubuntu.yml
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
name: Ubuntu
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
|
||||
- name: install updates
|
||||
run: |
|
||||
wget -O cmake.sh https://cmake.org/files/v3.14/cmake-3.14.0-Linux-x86_64.sh
|
||||
sudo sh cmake.sh --skip-license --exclude-subdir --prefix=/usr/local
|
||||
export PATH=/usr/local/bin:$PATH
|
||||
cmake --version
|
||||
|
||||
- name: run tests
|
||||
run: |
|
||||
cmake -Htest -Bbuild/test
|
||||
cmake --build build/test --target test-verbose
|
||||
22
.github/workflows/windows.yml
vendored
Normal file
22
.github/workflows/windows.yml
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
name: Windows
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: windows-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
|
||||
- name: run tests
|
||||
run: |
|
||||
cmake -Htest -Bbuild/test
|
||||
cmake --build build/test --target test-verbose
|
||||
16
.gitignore
vendored
16
.gitignore
vendored
@@ -1,12 +1,4 @@
|
||||
CMakeCache.txt
|
||||
CMakeFiles
|
||||
CMakeScripts
|
||||
Testing
|
||||
Makefile
|
||||
cmake_install.cmake
|
||||
install_manifest.txt
|
||||
compile_commands.json
|
||||
CTestTestfile.cmake
|
||||
build
|
||||
.vscode
|
||||
.DS_Store
|
||||
build/
|
||||
/build*
|
||||
/.vscode
|
||||
*.DS_Store
|
||||
|
||||
22
.travis.yml
22
.travis.yml
@@ -1,4 +1,3 @@
|
||||
|
||||
language: cpp
|
||||
sudo: require
|
||||
dist: xenial
|
||||
@@ -17,7 +16,7 @@ matrix:
|
||||
addons: &gcc8
|
||||
apt:
|
||||
sources: *all_sources
|
||||
packages:
|
||||
packages:
|
||||
- g++-8
|
||||
env:
|
||||
- MATRIX_EVAL="export CC=gcc-8; export CXX=g++-8;"
|
||||
@@ -25,11 +24,11 @@ matrix:
|
||||
- os: linux
|
||||
compiler: clang
|
||||
addons:
|
||||
apt:
|
||||
sources: *all_sources
|
||||
packages:
|
||||
- g++-8
|
||||
- clang-6.0
|
||||
apt:
|
||||
sources: *all_sources
|
||||
packages:
|
||||
- g++-8
|
||||
- clang-6.0
|
||||
env:
|
||||
- MATRIX_EVAL="export CC=clang-6.0; export CXX=clang++-6.0;"
|
||||
|
||||
@@ -38,7 +37,7 @@ before_install:
|
||||
- eval "${MATRIX_EVAL}"
|
||||
- echo "CC=$CC CXX=$CXX"
|
||||
# Install a supported cmake version (>= 3.14)
|
||||
- wget -O cmake.sh https://cmake.org/files/v3.14/cmake-3.14.0-Linux-x86_64.sh
|
||||
- wget -O cmake.sh https://cmake.org/files/v3.14/cmake-3.14.0-Linux-x86_64.sh
|
||||
- sudo sh cmake.sh --skip-license --exclude-subdir --prefix=/usr/local
|
||||
- export PATH=/usr/local/bin:$PATH
|
||||
- cmake --version
|
||||
@@ -46,7 +45,6 @@ before_install:
|
||||
script:
|
||||
# unit tests
|
||||
- cmake -Htest -Bbuild/test
|
||||
- CTEST_OUTPUT_ON_FAILURE=1 cmake --build build/test --target test
|
||||
# examples
|
||||
- python3 examples/run_all.py
|
||||
|
||||
- cmake --build build/test --target test-verbose
|
||||
# build examples
|
||||
- python3 examples/build_all.py
|
||||
|
||||
281
README.md
281
README.md
@@ -1,19 +1,29 @@
|
||||
[](https://travis-ci.com/TheLartians/CPM)
|
||||
[](https://travis-ci.com/cpm-cmake/CPM.cmake)
|
||||
[](https://github.com/cpm-cmake/CPM.cmake/actions)
|
||||
[](https://github.com/cpm-cmake/CPM.cmake/actions)
|
||||
[](https://github.com/cpm-cmake/CPM.cmake/actions)
|
||||
|
||||
<br />
|
||||
<p align="center">
|
||||
<img src="./logo/CPM.png" height="100" />
|
||||
</p>
|
||||
<br />
|
||||
|
||||
# Setup-free CMake dependency management
|
||||
|
||||
CPM is a CMake script that adds dependency management capabilities to CMake.
|
||||
It's built as a wrapper around CMake's [FetchContent](https://cmake.org/cmake/help/latest/module/FetchContent.html) module that adds version control and a simple API.
|
||||
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, a simple API [and more](#comparison-to-pure-fetchcontent--externalproject).
|
||||
|
||||
## Manage everything
|
||||
|
||||
Anything can be added as a version-controlled dependency though CPM, no packaging required.
|
||||
Projects using CMake are automatically configured and their targets can be used immediately.
|
||||
For everything else, a target can be created manually (see below).
|
||||
Any downloadable project or resource can be added as a version-controlled dependency though CPM, it is not necessary to modify or package anything.
|
||||
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).
|
||||
|
||||
## 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
|
||||
|
||||
@@ -23,23 +33,54 @@ Afterwards, any targets defined in the dependency can be used directly.
|
||||
|
||||
```cmake
|
||||
CPMAddPackage(
|
||||
NAME # The unique name of the dependency (should be the main target's name)
|
||||
NAME # The unique name of the dependency (should be the exported target's name)
|
||||
VERSION # The minimum version of the dependency (optional, defaults to 0)
|
||||
OPTIONS # Configuration options passed to the dependency (optional)
|
||||
DOWNLOAD_ONLY # If set, the project is downloaded, but not configured (optional)
|
||||
[...] # Origin paramters forwarded to FetchContent_Declare, see below
|
||||
[...] # Origin parameters forwarded to FetchContent_Declare, see below
|
||||
)
|
||||
```
|
||||
|
||||
The origin may be specified by a `GIT_REPOSITORY`, but other sources, such as direct URLs, are [also supported](https://cmake.org/cmake/help/v3.11/module/ExternalProject.html#external-project-definition).
|
||||
If `GIT_TAG` hasn't been explicitly specified it defaults to `v(VERSION)`, a common convention for git projects.
|
||||
`GIT_TAG` can also be set to a specific commit or a branch name such as `master` to download the most recent version.
|
||||
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.
|
||||
|
||||
Besides downloading and to configuring the dependency, 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.
|
||||
|
||||
- `(DEPENDENCY)_SOURCE_DIR` is the path to the source of the dependency.
|
||||
- `(DEPENDENCY)_BINARY_DIR` is the path to the build directory of the dependency.
|
||||
- `(DEPENDENCY)_ADDED` is set to `YES` if the dependency has not been added before, otherwise it is set to `NO`.
|
||||
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>_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`.
|
||||
|
||||
For using CPM.cmake projects with external package managers, such as conan or vcpkg, setting the variable [`CPM_USE_LOCAL_PACKAGES`](#options) will make CPM.cmake try to add a package through `find_package` first, and add it from source if it doesn't succeed.
|
||||
|
||||
In rare cases, this behaviour may be desirable by default. The function `CPMFindPackage` will try to find a local dependency via CMake's `find_package` and fallback to `CPMAddPackage`, if the dependency is not found.
|
||||
|
||||
## Full CMakeLists Example
|
||||
|
||||
@@ -50,123 +91,205 @@ cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
project(MyProject)
|
||||
|
||||
# add executable
|
||||
add_executable(myProject myProject.cpp)
|
||||
set_target_properties(myProject PROPERTIES CXX_STANDARD 17)
|
||||
add_executable(tests tests.cpp)
|
||||
|
||||
# add dependencies
|
||||
include(cmake/CPM.cmake)
|
||||
CPMAddPackage("gh:catchorg/Catch2@2.5.0")
|
||||
|
||||
CPMAddPackage(
|
||||
NAME LarsParser
|
||||
VERSION 1.8
|
||||
GIT_REPOSITORY https://github.com/TheLartians/Parser.git
|
||||
OPTIONS
|
||||
"LARS_PARSER_BUILD_GLUE_EXTENSION ON"
|
||||
)
|
||||
|
||||
target_link_libraries(myProject LarsParser)
|
||||
# link dependencies
|
||||
target_link_libraries(tests Catch2)
|
||||
```
|
||||
|
||||
See the [examples directory](https://github.com/TheLartians/CPM/tree/master/examples) for more examples with source code.
|
||||
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
|
||||
|
||||
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
|
||||
mkdir -p cmake
|
||||
wget -O cmake/CPM.cmake https://raw.githubusercontent.com/TheLartians/CPM/master/cmake/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/wiki/Adding-CPM) 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
|
||||
|
||||
To update CPM to the newest version, simply update the script in the project's cmake directory, for example by running the command above. Dependencies using CPM will automatically use the updated script of the outermost project.
|
||||
To update CPM to the newest version, update the script in the project's root directory, for example by running the command above.
|
||||
Dependencies using CPM will automatically use the updated script of the outermost project.
|
||||
|
||||
## Advantages
|
||||
|
||||
- **Small and reusable projects** CPM takes care of all project dependencies, allowing developers to focus on creating small, well-tested frameworks.
|
||||
- **Cross-Platform** CPM adds projects via `add_subdirectory`, which is compatible with all cmake toolchains and generators.
|
||||
- **Reproducable builds** By using versioning via git tags it is ensured that a project will always be in the same state everywhere.
|
||||
- **Recursive dependencies** Ensures that no dependency is added twice and is added in the minimum required version.
|
||||
- **Small and reusable projects** CPM takes care of all project dependencies, allowing developers to focus on creating small, well-tested libraries.
|
||||
- **Cross-Platform** CPM adds projects directly at the configure stage and is compatible with all CMake toolchains and generators.
|
||||
- **Reproducible builds** By versioning dependencies via git commits or tags it is ensured that a project will always be buildable.
|
||||
- **Recursive dependencies** Ensures that no dependency is added twice and all are added in the minimum required version.
|
||||
- **Plug-and-play** No need to install anything. Just add the script to your project and you're good to go.
|
||||
- **No packaging required** There is a good chance your existing projects already work as CPM dependencies.
|
||||
- **Simple source distribution** CPM makes including projects with source files and dependencies easy, reducing the need for monolithic header files.
|
||||
- **No packaging required** Simply add all external sources as a dependency.
|
||||
- **Simple source distribution** CPM makes including projects with source files and dependencies easy, reducing the need for monolithic header files or git submodules.
|
||||
|
||||
## Limitations
|
||||
|
||||
- **No pre-built binaries** For every new project, all dependencies must be downloaded and built from scratch. A possible workaround is to use CPM to fetch a pre-built binary or to enable local packages (see [below](#local-packages)).
|
||||
- **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 best practices on preparing your projects for CPM, see the [wiki](https://github.com/TheLartians/CPM/wiki/Preparing-projects-for-CPM).
|
||||
- **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 an error. This can be resolved by updating the outermost dependency version.
|
||||
- **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/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).
|
||||
|
||||
For projects with more complex needs and where an extra setup step doesn't matter, it is worth to check out fully featured C++ package managers such as [conan](https://conan.io), [vcpkg](https://github.com/microsoft/vcpkg) or [hunter](https://github.com/ruslo/hunter).
|
||||
Support for package managers is also [planned](https://github.com/TheLartians/CPM/issues/51) for a future version of CPM.
|
||||
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.
|
||||
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.
|
||||
- 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
|
||||
|
||||
### CPM_SOURCE_ROOT
|
||||
### CPM_SOURCE_CACHE
|
||||
|
||||
To avoid re-downloading dependencies, configure the project with the cmake option `-DCPM_SOURCE_ROOT=<path to an external download directory>`.
|
||||
To avoid re-downloading dependencies, CPM has an option `CPM_SOURCE_CACHE` that can be passed to CMake as `-DCPM_SOURCE_CACHE=<path to an external download directory>`.
|
||||
This will also allow projects to be configured offline, as long as the dependencies have been added to the cache before.
|
||||
It may also be defined system-wide as an environmental variable, e.g. by exporting `CPM_SOURCE_CACHE` in your `.bashrc` or `.bash_profile`.
|
||||
|
||||
```bash
|
||||
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.
|
||||
|
||||
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
|
||||
|
||||
If set, CPM will forward all calls to `CPMFindPackage` as `CPMAddPackage`.
|
||||
This is useful to create reproducible builds or to determine if the source parameters have all been set correctly.
|
||||
This can also be set as an environmental variable.
|
||||
|
||||
### CPM_USE_LOCAL_PACKAGES
|
||||
|
||||
CPM can be configured to use `find_package` to search for locally installed dependencies first by setting the CMake option `CPM_USE_LOCAL_PACKAGES`.
|
||||
If the option `CPM_LOCAL_PACKAGES_ONLY` is set, CPM will emit an error if the dependency is not found locally.
|
||||
These options can also be set as environmental variables.
|
||||
|
||||
In the case that `find_package` requires additional arguments, the parameter `FIND_PACKAGE_ARGUMENTS` may be specified in the `CPMAddPackage` call. The value of this parameter will be forwarded to `find_package`.
|
||||
|
||||
## Local package override
|
||||
|
||||
Library developers are often in the situation where they work on a locally checked out dependency at the same time as on a consumer project.
|
||||
It is possible to override the consumer's dependency with the version by supplying the CMake option `CPM_<dependency name>_SOURCE` set to the absolute path of the local library.
|
||||
For example, to use the local version of the dependency `Dep` at the path `/path/to/dep`, the consumer can be built with the following command.
|
||||
|
||||
```bash
|
||||
cmake -Bbuild -DCPM_Dep_SOURCE=/path/to/dep
|
||||
```
|
||||
|
||||
## Package lock
|
||||
|
||||
In large projects with many transitive dependencies, it can be useful to introduce a package lock file.
|
||||
This will list all CPM.cmake dependencies and can be used to update dependencies without modifying the original `CMakeLists.txt`.
|
||||
To use a package lock, add the following line directly after including CPM.cmake.
|
||||
|
||||
```cmake
|
||||
CPMUsePackageLock(package-lock.cmake)
|
||||
```
|
||||
|
||||
To create or update the package lock file, build the `cpm-update-package-lock` target.
|
||||
|
||||
```bash
|
||||
cmake -Bbuild
|
||||
cmake --build build --target cpm-update-package-lock
|
||||
```
|
||||
|
||||
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
|
||||
|
||||
These examples demonstrate how to include some well-known projects with CPM.
|
||||
See the [wiki](https://github.com/TheLartians/CPM/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)
|
||||
|
||||
```cmake
|
||||
CPMAddPackage(
|
||||
NAME Catch2
|
||||
GITHUB_REPOSITORY catchorg/Catch2
|
||||
VERSION 2.5.0
|
||||
)
|
||||
CPMAddPackage("gh:catchorg/Catch2@2.5.0")
|
||||
```
|
||||
|
||||
### [Boost (via boost-cmake)](https://github.com/Orphis/boost-cmake)
|
||||
|
||||
```CMake
|
||||
CPMAddPackage(
|
||||
NAME boost-cmake
|
||||
GITHUB_REPOSITORY Orphis/boost-cmake
|
||||
VERSION 1.67.0
|
||||
)
|
||||
CPMAddPackage("gh:Orphis/boost-cmake@1.67.0")
|
||||
```
|
||||
|
||||
### [cxxopts](https://github.com/jarro2783/cxxopts)
|
||||
|
||||
```cmake
|
||||
CPMAddPackage(
|
||||
NAME cxxopts
|
||||
GITHUB_REPOSITORY jarro2783/cxxopts
|
||||
VERSION 2.2.0
|
||||
OPTIONS
|
||||
"CXXOPTS_BUILD_EXAMPLES Off"
|
||||
"CXXOPTS_BUILD_TESTS Off"
|
||||
VERSION 2.2.1
|
||||
OPTIONS "CXXOPTS_BUILD_EXAMPLES NO" "CXXOPTS_BUILD_TESTS NO" "CXXOPTS_ENABLE_INSTALL YES"
|
||||
)
|
||||
```
|
||||
|
||||
### [Yaml-cpp](https://github.com/jbeder/yaml-cpp)
|
||||
|
||||
```CMake
|
||||
CPMAddPackage(
|
||||
NAME yaml-cpp
|
||||
GITHUB_REPOSITORY jbeder/yaml-cpp
|
||||
# 0.6.2 uses depricated CMake syntax
|
||||
VERSION 0.6.3
|
||||
# 0.6.3 is not released yet, so use a recent commit
|
||||
GIT_TAG 012269756149ae99745b6dafefd415843d7420bb
|
||||
OPTIONS
|
||||
"YAML_CPP_BUILD_TESTS Off"
|
||||
"YAML_CPP_BUILD_CONTRIB Off"
|
||||
"YAML_CPP_BUILD_TOOLS Off"
|
||||
)
|
||||
CPMAddPackage("gh:jbeder/yaml-cpp#yaml-cpp-0.6.3@0.6.3")
|
||||
```
|
||||
|
||||
### [google/benchmark](https://github.com/google/benchmark)
|
||||
@@ -175,14 +298,13 @@ CPMAddPackage(
|
||||
CPMAddPackage(
|
||||
NAME benchmark
|
||||
GITHUB_REPOSITORY google/benchmark
|
||||
VERSION 1.4.1
|
||||
OPTIONS
|
||||
"BENCHMARK_ENABLE_TESTING Off"
|
||||
VERSION 1.5.2
|
||||
OPTIONS "BENCHMARK_ENABLE_TESTING Off"
|
||||
)
|
||||
|
||||
if (benchmark_ADDED)
|
||||
# compile with C++17
|
||||
set_target_properties(benchmark PROPERTIES CXX_STANDARD 17)
|
||||
if(benchmark_ADDED)
|
||||
# enable c++11 to avoid compilation errors
|
||||
set_target_properties(benchmark PROPERTIES CXX_STANDARD 11)
|
||||
endif()
|
||||
```
|
||||
|
||||
@@ -191,7 +313,7 @@ endif()
|
||||
```cmake
|
||||
CPMAddPackage(
|
||||
NAME nlohmann_json
|
||||
VERSION 3.6.1
|
||||
VERSION 3.6.1
|
||||
# the git repo is incredibly large, so we download the archived include directory
|
||||
URL https://github.com/nlohmann/json/releases/download/v3.6.1/include.zip
|
||||
URL_HASH SHA256=69cc88207ce91347ea530b227ff0776db82dcb8de6704e1a3d74f4841bc651cf
|
||||
@@ -214,7 +336,7 @@ CPMAddPackage(
|
||||
DOWNLOAD_ONLY True
|
||||
)
|
||||
|
||||
if(range-v3_ADDED)
|
||||
if(range-v3_ADDED)
|
||||
add_library(range-v3 INTERFACE IMPORTED)
|
||||
target_include_directories(range-v3 INTERFACE "${range-v3_SOURCE_DIR}/include")
|
||||
endif()
|
||||
@@ -234,6 +356,7 @@ if (lua_ADDED)
|
||||
# lua has no CMake support, so we create our own target
|
||||
|
||||
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})
|
||||
|
||||
target_include_directories(lua
|
||||
@@ -247,4 +370,4 @@ For a full example on using CPM to download and configure lua with sol2 see [her
|
||||
|
||||
### Full Examples
|
||||
|
||||
See the [examples directory](https://github.com/TheLartians/CPM/tree/master/examples) for full examples with source code.
|
||||
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.
|
||||
|
||||
940
cmake/CPM.cmake
940
cmake/CPM.cmake
File diff suppressed because it is too large
Load Diff
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,10 +1,81 @@
|
||||
|
||||
function(ASSERT_EQUAL)
|
||||
if (NOT ARGC EQUAL 2)
|
||||
if(NOT ARGC EQUAL 2)
|
||||
message(FATAL_ERROR "assertion failed: invalid argument count: ${ARGC}")
|
||||
endif()
|
||||
|
||||
if (NOT ${ARGV0} EQUAL ${ARGV1})
|
||||
if(NOT "${ARGV0}" STREQUAL "${ARGV1}")
|
||||
message(FATAL_ERROR "assertion failed: '${ARGV0}' != '${ARGV1}'")
|
||||
else()
|
||||
message(STATUS "test passed: '${ARGV0}' == '${ARGV1}'")
|
||||
endif()
|
||||
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)
|
||||
if(NOT ARGC EQUAL 0)
|
||||
message(FATAL_ERROR "assertion failed: input ${ARGC} not empty: '${ARGV}'")
|
||||
endif()
|
||||
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 (${${KEY}})")
|
||||
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 truthy (${${KEY}})")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(ASSERT_FALSY KEY)
|
||||
if(${${KEY}})
|
||||
message(FATAL_ERROR "assertion failed: value of '${KEY}' is not falsy (${${KEY}})")
|
||||
else()
|
||||
message(STATUS "test passed: '${KEY}' is set falsy")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(ASSERTION_FAILED)
|
||||
message(FATAL_ERROR "assertion failed: ${ARGN}")
|
||||
endfunction()
|
||||
|
||||
function(ASSERT_EXISTS file)
|
||||
if(EXISTS ${file})
|
||||
message(STATUS "test passed: '${file}' exists")
|
||||
else()
|
||||
message(FATAL_ERROR "assertion failed: file ${file} does not exist")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(ASSERT_NOT_EXISTS file)
|
||||
if(NOT EXISTS ${file})
|
||||
message(STATUS "test passed: '${file}' does not exist")
|
||||
else()
|
||||
message(FATAL_ERROR "assertion failed: file ${file} exists")
|
||||
endif()
|
||||
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;
|
||||
}
|
||||
@@ -1,30 +1,27 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMExampleBenchmark)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME fibonacci
|
||||
GIT_REPOSITORY https://github.com/TheLartians/Fibonacci.git
|
||||
VERSION 1.0
|
||||
)
|
||||
CPMAddPackage("gh:cpm-cmake/testpack-fibonacci@2.0")
|
||||
|
||||
CPMAddPackage(
|
||||
NAME benchmark
|
||||
GITHUB_REPOSITORY google/benchmark
|
||||
VERSION 1.4.1
|
||||
OPTIONS
|
||||
"BENCHMARK_ENABLE_TESTING Off"
|
||||
VERSION 1.5.2
|
||||
OPTIONS "BENCHMARK_ENABLE_TESTING Off"
|
||||
)
|
||||
|
||||
if (benchmark_ADDED)
|
||||
# patch google benchmark target
|
||||
set_target_properties(benchmark PROPERTIES CXX_STANDARD 17)
|
||||
if(benchmark_ADDED)
|
||||
# enable c++11 to avoid compilation errors
|
||||
set_target_properties(benchmark PROPERTIES CXX_STANDARD 11)
|
||||
endif()
|
||||
|
||||
# ---- Executable ----
|
||||
|
||||
add_executable(CPMExampleBenchmark "main.cpp")
|
||||
set_target_properties(CPMExampleBenchmark PROPERTIES CXX_STANDARD 17)
|
||||
target_link_libraries(CPMExampleBenchmark fibonacci benchmark)
|
||||
target_compile_features(CPMExampleBenchmark PRIVATE cxx_std_17)
|
||||
|
||||
@@ -1,33 +1,32 @@
|
||||
#include <benchmark/benchmark.h>
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
#include <random>
|
||||
|
||||
#include <fibonacci.h>
|
||||
|
||||
#include <algorithm>
|
||||
#include <random>
|
||||
#include <vector>
|
||||
|
||||
std::vector<unsigned> createTestNumbers(){
|
||||
std::vector<unsigned> createTestNumbers() {
|
||||
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::mt19937 g(rd());
|
||||
std::shuffle(v.begin(), v.end(), g);
|
||||
return v;
|
||||
}
|
||||
|
||||
void fibonnacci(benchmark::State& state) {
|
||||
void fibonacci(benchmark::State& state) {
|
||||
auto numbers = createTestNumbers();
|
||||
for (auto _ : state) {
|
||||
for (auto v: numbers) benchmark::DoNotOptimize(fibonnacci(v));
|
||||
for (auto v : numbers) benchmark::DoNotOptimize(fibonacci(v));
|
||||
}
|
||||
}
|
||||
|
||||
BENCHMARK(fibonnacci);
|
||||
BENCHMARK(fibonacci);
|
||||
|
||||
void fastFibonacci(benchmark::State& state) {
|
||||
auto numbers = createTestNumbers();
|
||||
for (auto _ : state) {
|
||||
for (auto v: numbers) benchmark::DoNotOptimize(fastFibonacci(v));
|
||||
for (auto v : numbers) benchmark::DoNotOptimize(fastFibonacci(v));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,18 +1,24 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMExampleBoost)
|
||||
|
||||
# ---- Create binary ----
|
||||
|
||||
add_executable(CPMExampleBoost main.cpp)
|
||||
set_target_properties(CPMExampleBoost PROPERTIES CXX_STANDARD 17)
|
||||
target_compile_features(CPMExampleBoost PRIVATE cxx_std_17)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME boost
|
||||
CPMFindPackage(
|
||||
NAME Boost
|
||||
GITHUB_REPOSITORY Orphis/boost-cmake
|
||||
VERSION 1.67.0
|
||||
# setting FIND_PACKAGE_ARGUMENTS allow usage with `CPM_USE_LOCAL_PACKAGES`
|
||||
FIND_PACKAGE_ARGUMENTS "COMPONENTS system"
|
||||
)
|
||||
|
||||
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)
|
||||
//
|
||||
|
||||
#include <iostream>
|
||||
#include <boost/asio.hpp>
|
||||
#include <boost/date_time/posix_time/posix_time.hpp>
|
||||
#include <iostream>
|
||||
|
||||
void print(const boost::system::error_code& /*e*/)
|
||||
{
|
||||
std::cout << "Hello, world!" << std::endl;
|
||||
}
|
||||
void print(const boost::system::error_code& /*e*/) { std::cout << "Hello, world!" << std::endl; }
|
||||
|
||||
int main()
|
||||
{
|
||||
int main() {
|
||||
boost::asio::io_service io;
|
||||
|
||||
boost::asio::deadline_timer t(io, boost::posix_time::seconds(1));
|
||||
|
||||
10
examples/run_all.py → examples/build_all.py
Normal file → Executable file
10
examples/run_all.py → examples/build_all.py
Normal file → Executable file
@@ -1,5 +1,7 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
import os
|
||||
|
||||
from pathlib import Path
|
||||
from subprocess import PIPE, run
|
||||
|
||||
@@ -9,21 +11,23 @@ examples = [
|
||||
|
||||
assert(len(examples) > 0)
|
||||
|
||||
|
||||
def runCommand(command):
|
||||
print('- %s' % command)
|
||||
result = run(command, stdout=PIPE, stderr=PIPE, universal_newlines=True, shell=True)
|
||||
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)
|
||||
return result.stdout
|
||||
|
||||
|
||||
print('')
|
||||
for example in examples:
|
||||
print("running example %s" % example.name)
|
||||
print("================" + ('=' * len(example.name)))
|
||||
project = Path(".") / 'build' / example.name
|
||||
configure = runCommand('cmake -H%s -B%s -DCMAKE_BUILD_TYPE=RelWithDebInfo' % (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]))
|
||||
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('')
|
||||
@@ -1,39 +1,21 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
# ---- Options ----
|
||||
|
||||
option(ENABLE_TEST_COVERAGE "Enable test coverage" OFF)
|
||||
project(CPMExampleCatch2)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME fibonacci
|
||||
GIT_REPOSITORY https://github.com/TheLartians/Fibonacci.git
|
||||
VERSION 1.0
|
||||
)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME Catch2
|
||||
GITHUB_REPOSITORY catchorg/Catch2
|
||||
VERSION 2.5.0
|
||||
)
|
||||
CPMAddPackage("gh:cpm-cmake/testpack-fibonacci@2.0")
|
||||
CPMAddPackage("gh:catchorg/Catch2@2.13.4")
|
||||
|
||||
# ---- Create binary ----
|
||||
|
||||
add_executable(CPMExampleCatch2 main.cpp)
|
||||
target_link_libraries(CPMExampleCatch2 fibonacci Catch2)
|
||||
set_target_properties(CPMExampleCatch2 PROPERTIES CXX_STANDARD 17 COMPILE_FLAGS "-Wall -pedantic -Wextra -Werror")
|
||||
target_compile_features(CPMExampleCatch2 PRIVATE cxx_std_17)
|
||||
|
||||
# ---- Enable testing ----
|
||||
|
||||
ENABLE_TESTING()
|
||||
ADD_TEST(CPMExampleCatch2 CPMExampleCatch2)
|
||||
|
||||
# ---- Add code coverage ----
|
||||
|
||||
if (${ENABLE_TEST_COVERAGE})
|
||||
set_target_properties(CPMExampleCatch2 PROPERTIES CXX_STANDARD 17 COMPILE_FLAGS "-O0 -g -fprofile-arcs -ftest-coverage --coverage")
|
||||
target_link_options(CPMExampleCatch2 PUBLIC "--coverage")
|
||||
endif()
|
||||
enable_testing()
|
||||
add_test(CPMExampleCatch2 CPMExampleCatch2)
|
||||
|
||||
@@ -1,20 +1,21 @@
|
||||
#define CATCH_CONFIG_MAIN
|
||||
|
||||
#include <catch2/catch.hpp>
|
||||
#include <fibonacci.h>
|
||||
|
||||
TEST_CASE("fibonnacci"){
|
||||
REQUIRE(fibonnacci(0) == 0);
|
||||
REQUIRE(fibonnacci(1) == 1);
|
||||
REQUIRE(fibonnacci(2) == 1);
|
||||
REQUIRE(fibonnacci(3) == 2);
|
||||
REQUIRE(fibonnacci(4) == 3);
|
||||
REQUIRE(fibonnacci(5) == 5);
|
||||
REQUIRE(fibonnacci(13) == 233);
|
||||
#include <catch2/catch.hpp>
|
||||
|
||||
TEST_CASE("fibonacci") {
|
||||
REQUIRE(fibonacci(0) == 0);
|
||||
REQUIRE(fibonacci(1) == 1);
|
||||
REQUIRE(fibonacci(2) == 1);
|
||||
REQUIRE(fibonacci(3) == 2);
|
||||
REQUIRE(fibonacci(4) == 3);
|
||||
REQUIRE(fibonacci(5) == 5);
|
||||
REQUIRE(fibonacci(13) == 233);
|
||||
}
|
||||
|
||||
TEST_CASE("fastFibonnacci"){
|
||||
for (unsigned i=0; i<25; ++i){
|
||||
REQUIRE(fibonnacci(i) == fastFibonacci(i));
|
||||
TEST_CASE("fastFibonacci") {
|
||||
for (unsigned i = 0; i < 25; ++i) {
|
||||
REQUIRE(fibonacci(i) == fastFibonacci(i));
|
||||
}
|
||||
}
|
||||
|
||||
20
examples/cereal/CMakeLists.txt
Normal file
20
examples/cereal/CMakeLists.txt
Normal file
@@ -0,0 +1,20 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMExampleCereal)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME cereal
|
||||
VERSION 1.3.0
|
||||
GITHUB_REPOSITORY USCiLab/cereal
|
||||
OPTIONS "SKIP_PORTABILITY_TEST ON" "JUST_INSTALL_CEREAL ON"
|
||||
)
|
||||
|
||||
# ---- Create binary ----
|
||||
|
||||
add_executable(CPMExampleCereal main.cpp)
|
||||
target_link_libraries(CPMExampleCereal cereal)
|
||||
target_compile_features(CPMExampleCereal PRIVATE cxx_std_17)
|
||||
26
examples/cereal/main.cpp
Normal file
26
examples/cereal/main.cpp
Normal file
@@ -0,0 +1,26 @@
|
||||
#define CATCH_CONFIG_MAIN
|
||||
|
||||
#include <cereal/archives/json.hpp>
|
||||
#include <cereal/cereal.hpp>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
|
||||
struct player_data {
|
||||
int id{-1};
|
||||
std::string name{};
|
||||
};
|
||||
|
||||
template <typename Archive> void serialize(Archive &archive, player_data const &data) {
|
||||
archive(cereal::make_nvp("id", data.id), cereal::make_nvp("name", data.name));
|
||||
}
|
||||
|
||||
int main(int argc, char const *argv[]) {
|
||||
player_data player{3, "Gamer One"};
|
||||
std::ostringstream oss;
|
||||
cereal::JSONOutputArchive output(oss);
|
||||
output(cereal::make_nvp("player_data", player));
|
||||
|
||||
std::cout << oss.str() << std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,24 +1,15 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
# ---- Options ----
|
||||
|
||||
option(ENABLE_TEST_COVERAGE "Enable test coverage" OFF)
|
||||
project(CPMExampleCXXOpts)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME cxxopts
|
||||
GITHUB_REPOSITORY jarro2783/cxxopts
|
||||
VERSION 2.2.0
|
||||
OPTIONS
|
||||
"CXXOPTS_BUILD_EXAMPLES Off"
|
||||
"CXXOPTS_BUILD_TESTS Off"
|
||||
)
|
||||
CPMAddPackage("gh:jarro2783/cxxopts@2.2.0")
|
||||
|
||||
# ---- Create binary ----
|
||||
|
||||
add_executable(CPMExampleCXXOpts main.cpp)
|
||||
target_link_libraries(CPMExampleCXXOpts cxxopts)
|
||||
set_target_properties(CPMExampleCXXOpts PROPERTIES CXX_STANDARD 17 COMPILE_FLAGS "-Wall -pedantic -Wextra -Werror")
|
||||
target_compile_features(CPMExampleCXXOpts PRIVATE cxx_std_17)
|
||||
|
||||
@@ -1,21 +1,19 @@
|
||||
#include <cxxopts.hpp>
|
||||
#include <iostream>
|
||||
|
||||
int main(int argc, char ** argv) {
|
||||
int main(int argc, char** argv) {
|
||||
cxxopts::Options options("MyProgram", "One line description of MyProgram");
|
||||
options.add_options()
|
||||
("h,help", "Show help")
|
||||
("d,debug", "Enable debugging")
|
||||
("f,file", "File name", cxxopts::value<std::string>());
|
||||
options.add_options()("h,help", "Show help")("d,debug", "Enable debugging")(
|
||||
"f,file", "File name", cxxopts::value<std::string>());
|
||||
|
||||
auto result = options.parse(argc, argv);
|
||||
|
||||
|
||||
if (result["help"].as<bool>()) {
|
||||
std::cout << options.help() << std::endl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (auto arg: result.arguments()) {
|
||||
for (auto arg : result.arguments()) {
|
||||
std::cout << "option: " << arg.key() << ": " << arg.value() << std::endl;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,39 +1,21 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
# ---- Options ----
|
||||
|
||||
option(ENABLE_TEST_COVERAGE "Enable test coverage" OFF)
|
||||
project(CPMExampleDoctest)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME fibonacci
|
||||
GIT_REPOSITORY https://github.com/TheLartians/Fibonacci.git
|
||||
VERSION 1.0
|
||||
)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME doctest
|
||||
GITHUB_REPOSITORY onqtam/doctest
|
||||
GIT_TAG 2.3.2
|
||||
)
|
||||
CPMAddPackage("gh:cpm-cmake/testpack-fibonacci@2.0")
|
||||
CPMAddPackage("gh:onqtam/doctest#2.4.5")
|
||||
|
||||
# ---- Create binary ----
|
||||
|
||||
add_executable(CPMExampleDoctest main.cpp)
|
||||
target_link_libraries(CPMExampleDoctest fibonacci doctest)
|
||||
set_target_properties(CPMExampleDoctest PROPERTIES CXX_STANDARD 17 COMPILE_FLAGS "-Wall -pedantic -Wextra -Werror")
|
||||
target_compile_features(CPMExampleDoctest PRIVATE cxx_std_17)
|
||||
|
||||
# ---- Enable testing ----
|
||||
|
||||
ENABLE_TESTING()
|
||||
ADD_TEST(CPMExampleDoctest CPMExampleDoctest)
|
||||
|
||||
# ---- Add code coverage ----
|
||||
|
||||
if (${ENABLE_TEST_COVERAGE})
|
||||
set_target_properties(CPMExampleDoctest PROPERTIES CXX_STANDARD 17 COMPILE_FLAGS "-O0 -g -fprofile-arcs -ftest-coverage --coverage")
|
||||
target_link_options(CPMExampleDoctest PUBLIC "--coverage")
|
||||
endif()
|
||||
enable_testing()
|
||||
add_test(CPMExampleDoctest CPMExampleDoctest)
|
||||
|
||||
@@ -3,18 +3,18 @@
|
||||
#include <doctest/doctest.h>
|
||||
#include <fibonacci.h>
|
||||
|
||||
TEST_CASE("fibonnacci"){
|
||||
CHECK(fibonnacci(0) == 0);
|
||||
CHECK(fibonnacci(1) == 1);
|
||||
CHECK(fibonnacci(2) == 1);
|
||||
CHECK(fibonnacci(3) == 2);
|
||||
CHECK(fibonnacci(4) == 3);
|
||||
CHECK(fibonnacci(5) == 5);
|
||||
CHECK(fibonnacci(13) == 233);
|
||||
TEST_CASE("fibonacci") {
|
||||
CHECK(fibonacci(0) == 0);
|
||||
CHECK(fibonacci(1) == 1);
|
||||
CHECK(fibonacci(2) == 1);
|
||||
CHECK(fibonacci(3) == 2);
|
||||
CHECK(fibonacci(4) == 3);
|
||||
CHECK(fibonacci(5) == 5);
|
||||
CHECK(fibonacci(13) == 233);
|
||||
}
|
||||
|
||||
TEST_CASE("fastFibonnacci"){
|
||||
for (unsigned i=0; i<25; ++i){
|
||||
CHECK(fibonnacci(i) == fastFibonacci(i));
|
||||
TEST_CASE("fastfibonacci") {
|
||||
for (unsigned i = 0; i < 25; ++i) {
|
||||
CHECK(fibonacci(i) == fastFibonacci(i));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMEnTTExample)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
@@ -12,13 +14,13 @@ CPMAddPackage(
|
||||
DOWNLOAD_ONLY True
|
||||
)
|
||||
|
||||
if (EnTT_ADDED)
|
||||
if(EnTT_ADDED)
|
||||
add_library(EnTT INTERFACE)
|
||||
target_include_directories(EnTT INTERFACE ${EnTT_SOURCE_DIR}/src)
|
||||
target_include_directories(EnTT SYSTEM INTERFACE ${EnTT_SOURCE_DIR}/src)
|
||||
endif()
|
||||
|
||||
# ---- Executable ----
|
||||
|
||||
add_executable(CPMEnTTExample "main.cpp")
|
||||
set_target_properties(CPMEnTTExample PROPERTIES CXX_STANDARD 17)
|
||||
add_executable(CPMEnTTExample main.cpp)
|
||||
target_compile_features(CPMEnTTExample PRIVATE cxx_std_17)
|
||||
target_link_libraries(CPMEnTTExample EnTT)
|
||||
|
||||
@@ -1,54 +1,56 @@
|
||||
#include <entt/entt.hpp>
|
||||
#include <cstdint>
|
||||
#include <entt/entt.hpp>
|
||||
|
||||
struct position {
|
||||
float x;
|
||||
float y;
|
||||
float x;
|
||||
float y;
|
||||
};
|
||||
|
||||
struct velocity {
|
||||
float dx;
|
||||
float dy;
|
||||
float dx;
|
||||
float dy;
|
||||
};
|
||||
|
||||
void update(entt::registry ®istry) {
|
||||
auto view = registry.view<position, velocity>();
|
||||
auto view = registry.view<position, velocity>();
|
||||
|
||||
for(auto entity: view) {
|
||||
// gets only the components that are going to be used ...
|
||||
for (auto entity : view) {
|
||||
// gets only the components that are going to be used ...
|
||||
|
||||
auto &vel = view.get<velocity>(entity);
|
||||
auto &vel = view.get<velocity>(entity);
|
||||
|
||||
vel.dx = 0.;
|
||||
vel.dy = 0.;
|
||||
vel.dx = 0.;
|
||||
vel.dy = 0.;
|
||||
|
||||
// ...
|
||||
}
|
||||
// ...
|
||||
}
|
||||
}
|
||||
|
||||
void update(std::uint64_t dt, entt::registry ®istry) {
|
||||
registry.view<position, velocity>().each([dt](auto &pos, auto &vel) {
|
||||
// gets all the components of the view at once ...
|
||||
registry.view<position, velocity>().each([dt](auto &pos, auto &vel) {
|
||||
// gets all the components of the view at once ...
|
||||
|
||||
pos.x += vel.dx * dt;
|
||||
pos.y += vel.dy * dt;
|
||||
pos.x += vel.dx * dt;
|
||||
pos.y += vel.dy * dt;
|
||||
|
||||
// ...
|
||||
});
|
||||
// ...
|
||||
});
|
||||
}
|
||||
|
||||
int main() {
|
||||
entt::registry registry;
|
||||
std::uint64_t dt = 16;
|
||||
entt::registry registry;
|
||||
std::uint64_t dt = 16;
|
||||
|
||||
for(auto i = 0; i < 10; ++i) {
|
||||
auto entity = registry.create();
|
||||
registry.assign<position>(entity, i * 1.f, i * 1.f);
|
||||
if(i % 2 == 0) { registry.assign<velocity>(entity, i * .1f, i * .1f); }
|
||||
for (auto i = 0; i < 10; ++i) {
|
||||
auto entity = registry.create();
|
||||
registry.assign<position>(entity, i * 1.f, i * 1.f);
|
||||
if (i % 2 == 0) {
|
||||
registry.assign<velocity>(entity, i * .1f, i * .1f);
|
||||
}
|
||||
}
|
||||
|
||||
update(dt, registry);
|
||||
update(registry);
|
||||
update(dt, registry);
|
||||
update(registry);
|
||||
|
||||
// ...
|
||||
// ...
|
||||
}
|
||||
|
||||
15
examples/fmt/CMakeLists.txt
Normal file
15
examples/fmt/CMakeLists.txt
Normal file
@@ -0,0 +1,15 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMJSONExample)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage("gh:fmtlib/fmt#7.1.3")
|
||||
|
||||
# ---- Executable ----
|
||||
|
||||
add_executable(CPMFmtExample main.cpp)
|
||||
target_compile_features(CPMFmtExample PRIVATE cxx_std_17)
|
||||
target_link_libraries(CPMFmtExample fmt)
|
||||
6
examples/fmt/main.cpp
Normal file
6
examples/fmt/main.cpp
Normal file
@@ -0,0 +1,6 @@
|
||||
#include <fmt/format.h>
|
||||
|
||||
int main() {
|
||||
fmt::print("Hello, {}!\n", "world");
|
||||
return 0;
|
||||
}
|
||||
28
examples/gtest/CMakeLists.txt
Normal file
28
examples/gtest/CMakeLists.txt
Normal file
@@ -0,0 +1,28 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMExampleGtest)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage("gh:cpm-cmake/testpack-fibonacci@2.0")
|
||||
|
||||
CPMAddPackage(
|
||||
NAME googletest
|
||||
GITHUB_REPOSITORY google/googletest
|
||||
GIT_TAG release-1.10.0
|
||||
VERSION 1.10.0
|
||||
OPTIONS "INSTALL_GTEST OFF" "gtest_force_shared_crt"
|
||||
)
|
||||
|
||||
# ---- Create binary ----
|
||||
|
||||
add_executable(CPMExampleGtest main.cpp)
|
||||
target_link_libraries(CPMExampleGtest fibonacci gtest gtest_main gmock)
|
||||
target_compile_features(CPMExampleGtest PRIVATE cxx_std_17)
|
||||
|
||||
# ---- Enable testing ----
|
||||
|
||||
enable_testing()
|
||||
add_test(CPMExampleGtest CPMExampleGtest)
|
||||
12
examples/gtest/main.cpp
Normal file
12
examples/gtest/main.cpp
Normal file
@@ -0,0 +1,12 @@
|
||||
#include <fibonacci.h>
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
TEST(FibonacciTests, BasicChecks) {
|
||||
ASSERT_TRUE(fibonacci(0) == 0);
|
||||
ASSERT_TRUE(fibonacci(1) == 1);
|
||||
ASSERT_TRUE(fibonacci(2) == 1);
|
||||
ASSERT_TRUE(fibonacci(3) == 2);
|
||||
ASSERT_TRUE(fibonacci(4) == 3);
|
||||
ASSERT_TRUE(fibonacci(5) == 5);
|
||||
ASSERT_TRUE(fibonacci(13) == 233);
|
||||
}
|
||||
@@ -1,24 +1,26 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMJSONExample)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME nlohmann_json
|
||||
VERSION 3.6.1
|
||||
VERSION 3.9.1
|
||||
# not using the repo as it takes forever to clone
|
||||
URL https://github.com/nlohmann/json/releases/download/v3.6.1/include.zip
|
||||
URL_HASH SHA256=69cc88207ce91347ea530b227ff0776db82dcb8de6704e1a3d74f4841bc651cf
|
||||
URL https://github.com/nlohmann/json/releases/download/v3.9.1/include.zip
|
||||
URL_HASH SHA256=6bea5877b1541d353bd77bdfbdb2696333ae5ed8f9e8cc22df657192218cad91
|
||||
)
|
||||
|
||||
if(nlohmann_json_ADDED)
|
||||
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()
|
||||
|
||||
# ---- Executable ----
|
||||
|
||||
add_executable(CPMJSONExample "main.cpp")
|
||||
set_target_properties(CPMJSONExample PROPERTIES CXX_STANDARD 17)
|
||||
add_executable(CPMJSONExample main.cpp)
|
||||
target_compile_features(CPMJSONExample PRIVATE cxx_std_17)
|
||||
target_link_libraries(CPMJSONExample nlohmann_json)
|
||||
|
||||
@@ -1,23 +1,15 @@
|
||||
#include <nlohmann/json.hpp>
|
||||
#include <iostream>
|
||||
#include <iomanip>
|
||||
#include <iostream>
|
||||
#include <nlohmann/json.hpp>
|
||||
|
||||
int main(){
|
||||
|
||||
nlohmann::json json = {
|
||||
{"pi", 3.141},
|
||||
{"happy", true},
|
||||
{"name", "Niels"},
|
||||
{"nothing", nullptr},
|
||||
{"answer", {
|
||||
{"everything", 42}
|
||||
}},
|
||||
{"list", {1, 0, 2}},
|
||||
{"object", {
|
||||
{"currency", "USD"},
|
||||
{"value", 42.99}
|
||||
}}
|
||||
};
|
||||
int main() {
|
||||
nlohmann::json json = {{"pi", 3.141},
|
||||
{"happy", true},
|
||||
{"name", "Niels"},
|
||||
{"nothing", nullptr},
|
||||
{"answer", {{"everything", 42}}},
|
||||
{"list", {1, 0, 2}},
|
||||
{"object", {{"currency", "USD"}, {"value", 42.99}}}};
|
||||
|
||||
std::cout << "declared JSON object: " << std::setw(2) << json << std::endl;
|
||||
|
||||
|
||||
@@ -1,22 +1,20 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMlinenoiseExample)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME linenoise
|
||||
GIT_TAG 1.0
|
||||
GITHUB_REPOSITORY antirez/linenoise
|
||||
)
|
||||
CPMAddPackage("gh:antirez/linenoise#1.0")
|
||||
|
||||
if(linenoise_ADDED)
|
||||
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()
|
||||
|
||||
# ---- Executable ----
|
||||
|
||||
add_executable(CPMlinenoiseExample "main.cpp")
|
||||
set_target_properties(CPMlinenoiseExample PROPERTIES CXX_STANDARD 17)
|
||||
add_executable(CPMlinenoiseExample main.cpp)
|
||||
target_compile_features(CPMlinenoiseExample PRIVATE cxx_std_17)
|
||||
target_link_libraries(CPMlinenoiseExample linenoise)
|
||||
|
||||
@@ -1,64 +1,64 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "linenoise.h"
|
||||
|
||||
|
||||
void completion(const char *buf, linenoiseCompletions *lc) {
|
||||
if (buf[0] == 'h') {
|
||||
linenoiseAddCompletion(lc,"hello");
|
||||
linenoiseAddCompletion(lc,"hello there");
|
||||
}
|
||||
if (buf[0] == 'h') {
|
||||
linenoiseAddCompletion(lc, "hello");
|
||||
linenoiseAddCompletion(lc, "hello there");
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
char *line;
|
||||
char *prgname = argv[0];
|
||||
char *line;
|
||||
char *prgname = argv[0];
|
||||
|
||||
/* Parse options, with --multiline we enable multi line editing. */
|
||||
while(argc > 1) {
|
||||
argc--;
|
||||
argv++;
|
||||
if (!strcmp(*argv,"--multiline")) {
|
||||
linenoiseSetMultiLine(1);
|
||||
printf("Multi-line mode enabled.\n");
|
||||
} else if (!strcmp(*argv,"--keycodes")) {
|
||||
linenoisePrintKeyCodes();
|
||||
exit(0);
|
||||
} else {
|
||||
fprintf(stderr, "Usage: %s [--multiline] [--keycodes]\n", prgname);
|
||||
exit(1);
|
||||
}
|
||||
/* Parse options, with --multiline we enable multi line editing. */
|
||||
while (argc > 1) {
|
||||
argc--;
|
||||
argv++;
|
||||
if (!strcmp(*argv, "--multiline")) {
|
||||
linenoiseSetMultiLine(1);
|
||||
printf("Multi-line mode enabled.\n");
|
||||
} else if (!strcmp(*argv, "--keycodes")) {
|
||||
linenoisePrintKeyCodes();
|
||||
exit(0);
|
||||
} else {
|
||||
fprintf(stderr, "Usage: %s [--multiline] [--keycodes]\n", prgname);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
/* Set the completion callback. This will be called every time the
|
||||
* user uses the <tab> key. */
|
||||
linenoiseSetCompletionCallback(completion);
|
||||
/* Set the completion callback. This will be called every time the
|
||||
* user uses the <tab> key. */
|
||||
linenoiseSetCompletionCallback(completion);
|
||||
|
||||
/* Load history from file. The history file is just a plain text file
|
||||
* where entries are separated by newlines. */
|
||||
linenoiseHistoryLoad("history.txt"); /* Load the history at startup */
|
||||
/* Load history from file. The history file is just a plain text file
|
||||
* where entries are separated by newlines. */
|
||||
linenoiseHistoryLoad("history.txt"); /* Load the history at startup */
|
||||
|
||||
/* Now this is the main loop of the typical linenoise-based application.
|
||||
* The call to linenoise() will block as long as the user types something
|
||||
* and presses enter.
|
||||
*
|
||||
* The typed string is returned as a malloc() allocated string by
|
||||
* linenoise, so the user needs to free() it. */
|
||||
while((line = linenoise("hello> ")) != NULL) {
|
||||
/* Do something with the string. */
|
||||
if (line[0] != '\0' && line[0] != '/') {
|
||||
printf("echo: '%s'\n", line);
|
||||
linenoiseHistoryAdd(line); /* Add to the history. */
|
||||
linenoiseHistorySave("history.txt"); /* Save the history on disk. */
|
||||
} else if (!strncmp(line,"/historylen",11)) {
|
||||
/* The "/historylen" command will change the history len. */
|
||||
int len = atoi(line+11);
|
||||
linenoiseHistorySetMaxLen(len);
|
||||
} else if (line[0] == '/') {
|
||||
printf("Unreconized command: %s\n", line);
|
||||
}
|
||||
free(line);
|
||||
/* Now this is the main loop of the typical linenoise-based application.
|
||||
* The call to linenoise() will block as long as the user types something
|
||||
* and presses enter.
|
||||
*
|
||||
* The typed string is returned as a malloc() allocated string by
|
||||
* linenoise, so the user needs to free() it. */
|
||||
while ((line = linenoise("hello> ")) != NULL) {
|
||||
/* Do something with the string. */
|
||||
if (line[0] != '\0' && line[0] != '/') {
|
||||
printf("echo: '%s'\n", line);
|
||||
linenoiseHistoryAdd(line); /* Add to the history. */
|
||||
linenoiseHistorySave("history.txt"); /* Save the history on disk. */
|
||||
} else if (!strncmp(line, "/historylen", 11)) {
|
||||
/* The "/historylen" command will change the history len. */
|
||||
int len = atoi(line + 11);
|
||||
linenoiseHistorySetMaxLen(len);
|
||||
} else if (line[0] == '/') {
|
||||
printf("Unreconized command: %s\n", line);
|
||||
}
|
||||
return 0;
|
||||
free(line);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
CPMAddPackage(
|
||||
NAME Glue
|
||||
GIT_REPOSITORY https://github.com/TheLartians/Glue.git
|
||||
VERSION 0.8.2
|
||||
OPTIONS
|
||||
"GLUE_ENABLE_LUA ON"
|
||||
"GLUE_BUILD_LUA ON"
|
||||
)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME LarsParser
|
||||
GIT_REPOSITORY https://github.com/TheLartians/Parser.git
|
||||
VERSION 1.9
|
||||
OPTIONS
|
||||
"LARS_PARSER_BUILD_GLUE_EXTENSION ON"
|
||||
)
|
||||
|
||||
# ---- Create binary ----
|
||||
|
||||
add_executable(parser-lua main.cpp)
|
||||
set_target_properties(parser-lua PROPERTIES CXX_STANDARD 17)
|
||||
target_link_libraries(parser-lua LHC LarsParser Glue)
|
||||
@@ -1,46 +0,0 @@
|
||||
#include <lars/parser/extension.h>
|
||||
#include <glue/lua.h>
|
||||
#include <stdexcept>
|
||||
#include <iostream>
|
||||
|
||||
int main() {
|
||||
auto lua = glue::LuaState();
|
||||
lua.openStandardLibs();
|
||||
|
||||
lua["parser"] = lars::glue::parser();
|
||||
|
||||
lua.run(R"(
|
||||
wordParser = parser.Program.create()
|
||||
|
||||
wordParser:setRule("Whitespace", "[ \t]")
|
||||
wordParser:setSeparatorRule("Whitespace")
|
||||
|
||||
wordParser:setRule("Word", "[a-zA-Z]+")
|
||||
|
||||
wordParser:setRuleWithCallback("Words", "Word*", function(e)
|
||||
local N = e:size()
|
||||
local res = {}
|
||||
for i=0,N-1 do res[#res+1] = e:get(i):string() end
|
||||
return res
|
||||
end)
|
||||
|
||||
wordParser:setStartRule("Words")
|
||||
)");
|
||||
|
||||
lua.run(R"(
|
||||
while true do
|
||||
print("please enter some words or 'quit' to exit");
|
||||
local input = io.read();
|
||||
if input == "quit" then os.exit() end
|
||||
local result
|
||||
ok, err = pcall(function() result = wordParser:run(input) end)
|
||||
if ok then
|
||||
print("you entered " .. #result .. " words!")
|
||||
else
|
||||
print("error: " .. tostring(err))
|
||||
end
|
||||
end
|
||||
)");
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
|
||||
|
||||
# add dependencies
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME LarsParser
|
||||
GIT_REPOSITORY https://github.com/TheLartians/Parser.git
|
||||
VERSION 1.7
|
||||
)
|
||||
|
||||
# add executable
|
||||
add_executable(calculator main.cpp)
|
||||
set_target_properties(calculator PROPERTIES CXX_STANDARD 17)
|
||||
target_link_libraries(calculator LarsParser)
|
||||
@@ -1,57 +0,0 @@
|
||||
#include <iostream>
|
||||
#include <unordered_map>
|
||||
#include <cmath>
|
||||
|
||||
#include <lars/parser/generator.h>
|
||||
|
||||
int main() {
|
||||
using namespace std;
|
||||
using VariableMap = unordered_map<string, float>;
|
||||
|
||||
lars::ParserGenerator<float, VariableMap &> calculator;
|
||||
|
||||
auto &g = calculator;
|
||||
g.setSeparator(g["Whitespace"] << "[\t ]");
|
||||
|
||||
g["Expression"] << "Set | Sum";
|
||||
g["Set" ] << "Name '=' Sum" >> [](auto e, auto &v){ return v[e[0].string()] = e[1].evaluate(v); };
|
||||
g["Sum" ] << "Add | Subtract | Product";
|
||||
g["Product" ] << "Multiply | Divide | Exponent";
|
||||
g["Exponent" ] << "Power | Atomic";
|
||||
g["Atomic" ] << "Number | Brackets | Variable";
|
||||
g["Brackets" ] << "'(' Sum ')'";
|
||||
g["Add" ] << "Sum '+' Product" >> [](auto e, auto &v){ return e[0].evaluate(v) + e[1].evaluate(v); };
|
||||
g["Subtract" ] << "Sum '-' Product" >> [](auto e, auto &v){ return e[0].evaluate(v) - e[1].evaluate(v); };
|
||||
g["Multiply" ] << "Product '*' Exponent" >> [](auto e, auto &v){ return e[0].evaluate(v) * e[1].evaluate(v); };
|
||||
g["Divide" ] << "Product '/' Exponent" >> [](auto e, auto &v){ return e[0].evaluate(v) / e[1].evaluate(v); };
|
||||
g["Power" ] << "Atomic ('^' Exponent)" >> [](auto e, auto &v){ return pow(e[0].evaluate(v), e[1].evaluate(v)); };
|
||||
g["Variable" ] << "Name" >> [](auto e, auto &v){ return v[e[0].string()]; };
|
||||
g["Name" ] << "[a-zA-Z] [a-zA-Z0-9]*";
|
||||
g["Number" ] << "'-'? [0-9]+ ('.' [0-9]+)?" >> [](auto e, auto &){ return stod(e.string()); };
|
||||
|
||||
g.setStart(g["Expression"]);
|
||||
|
||||
cout << "Enter an expression to be evaluated or 'quit' to exit.\n";
|
||||
|
||||
VariableMap variables;
|
||||
|
||||
while (true) {
|
||||
string str;
|
||||
cout << "> ";
|
||||
getline(cin,str);
|
||||
if(str == "q" || str == "quit"){ break; }
|
||||
try {
|
||||
auto result = calculator.run(str, variables);
|
||||
cout << str << " = " << result << endl;
|
||||
} catch (lars::SyntaxError &error) {
|
||||
auto syntax = error.syntax;
|
||||
cout << " ";
|
||||
cout << string(syntax->begin, ' ');
|
||||
cout << string(syntax->length(), '~');
|
||||
cout << "^\n";
|
||||
cout << " " << "Syntax error while parsing " << syntax->rule->name << endl;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -1,24 +1,26 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMRangev3Example)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME range-v3
|
||||
URL https://github.com/ericniebler/range-v3/archive/0.5.0.zip
|
||||
VERSION 0.5.0
|
||||
URL https://github.com/ericniebler/range-v3/archive/0.11.0.zip
|
||||
VERSION 0.11.0
|
||||
# the range-v3 CMakeLists screws with configuration options
|
||||
DOWNLOAD_ONLY True
|
||||
)
|
||||
|
||||
if(range-v3_ADDED)
|
||||
if(range-v3_ADDED)
|
||||
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()
|
||||
|
||||
# ---- Executable ----
|
||||
|
||||
add_executable(CPMRangev3Example "main.cpp")
|
||||
set_target_properties(CPMRangev3Example PROPERTIES CXX_STANDARD 17)
|
||||
add_executable(CPMRangev3Example main.cpp)
|
||||
target_compile_features(CPMRangev3Example PRIVATE cxx_std_17)
|
||||
target_link_libraries(CPMRangev3Example range-v3)
|
||||
|
||||
@@ -18,27 +18,24 @@
|
||||
// vector all_of is_six: false
|
||||
// vector none_of is_six: false
|
||||
|
||||
#include <iostream>
|
||||
#include <range/v3/algorithm/all_of.hpp>
|
||||
#include <range/v3/algorithm/any_of.hpp>
|
||||
#include <range/v3/algorithm/for_each.hpp>
|
||||
#include <range/v3/algorithm/none_of.hpp>
|
||||
#include <range/v3/view/all.hpp>
|
||||
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
using std::cout;
|
||||
|
||||
auto is_six = [](int i) { return i == 6; };
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
std::vector<int> v{6, 2, 3, 4, 5, 6};
|
||||
cout << std::boolalpha;
|
||||
cout << "vector: " << ranges::view::all(v) << '\n';
|
||||
int main() {
|
||||
std::vector<int> v{6, 2, 3, 4, 5, 6};
|
||||
cout << std::boolalpha;
|
||||
cout << "vector: " << ranges::view::all(v) << '\n';
|
||||
|
||||
cout << "vector any_of is_six: " << ranges::any_of(v, is_six) << '\n';
|
||||
cout << "vector all_of is_six: " << ranges::all_of(v, is_six) << '\n';
|
||||
cout << "vector none_of is_six: " << ranges::none_of(v, is_six) << '\n';
|
||||
cout << "vector any_of is_six: " << ranges::any_of(v, is_six) << '\n';
|
||||
cout << "vector all_of is_six: " << ranges::all_of(v, is_six) << '\n';
|
||||
cout << "vector none_of is_six: " << ranges::none_of(v, is_six) << '\n';
|
||||
}
|
||||
//[any_all_none_of]]
|
||||
@@ -1,5 +1,7 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMSimpleMatchExample)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
@@ -13,12 +15,11 @@ CPMAddPackage(
|
||||
|
||||
if(simple_match_ADDED)
|
||||
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()
|
||||
|
||||
# ---- Executable ----
|
||||
|
||||
add_executable(CPMSimpleMatchExample "main.cpp")
|
||||
set_target_properties(CPMSimpleMatchExample PROPERTIES CXX_STANDARD 17)
|
||||
add_executable(CPMSimpleMatchExample main.cpp)
|
||||
target_compile_features(CPMSimpleMatchExample PRIVATE cxx_std_17)
|
||||
target_link_libraries(CPMSimpleMatchExample simple_match)
|
||||
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
#include <iostream>
|
||||
#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::placeholders;
|
||||
|
||||
@@ -12,22 +11,23 @@ int main(int argc, char ** argv){
|
||||
while (true) {
|
||||
std::cout << "> ";
|
||||
std::getline(std::cin, input);
|
||||
if (input == "quit") { break; }
|
||||
if (input == "quit") {
|
||||
break;
|
||||
}
|
||||
int x;
|
||||
try {
|
||||
x = std::stoi(input);
|
||||
} catch(std::invalid_argument &) {
|
||||
} catch (std::invalid_argument&) {
|
||||
std::cout << "invalid input" << std::endl;
|
||||
continue;
|
||||
}
|
||||
|
||||
match(x,
|
||||
1, []() {std::cout << "The answer is one\n"; },
|
||||
2, []() {std::cout << "The answer is two\n"; },
|
||||
_x < 10, [](auto&& a) {std::cout << "The answer " << a << " is less than 10\n"; },
|
||||
10 < _x < 20, [](auto&& a) {std::cout << "The answer " << a << " is between 10 and 20 exclusive\n"; },
|
||||
_, []() {std::cout << "Did not match\n"; }
|
||||
);
|
||||
|
||||
match(
|
||||
x, 1, []() { std::cout << "The answer is one\n"; }, 2,
|
||||
[]() { std::cout << "The answer is two\n"; }, _x < 10,
|
||||
[](auto&& a) { std::cout << "The answer " << a << " is less than 10\n"; }, 10 < _x < 20,
|
||||
[](auto&& a) { std::cout << "The answer " << a << " is between 10 and 20 exclusive\n"; }, _,
|
||||
[]() { std::cout << "Did not match\n"; });
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMSol2Example)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
@@ -11,19 +13,16 @@ CPMAddPackage(
|
||||
DOWNLOAD_ONLY YES
|
||||
)
|
||||
|
||||
if (lua_ADDED)
|
||||
if(lua_ADDED)
|
||||
# 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})
|
||||
|
||||
target_include_directories(lua
|
||||
PUBLIC
|
||||
$<BUILD_INTERFACE:${lua_SOURCE_DIR}>
|
||||
)
|
||||
target_include_directories(lua SYSTEM PUBLIC $<BUILD_INTERFACE:${lua_SOURCE_DIR}>)
|
||||
endif()
|
||||
|
||||
|
||||
CPMAddPackage(
|
||||
NAME sol2
|
||||
URL https://github.com/ThePhD/sol2/archive/v3.0.2.zip
|
||||
@@ -31,15 +30,14 @@ CPMAddPackage(
|
||||
DOWNLOAD_ONLY YES
|
||||
)
|
||||
|
||||
if (sol2_ADDED)
|
||||
if(sol2_ADDED)
|
||||
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)
|
||||
endif()
|
||||
|
||||
# ---- Executable ----
|
||||
|
||||
add_executable(CPMSol2Example "main.cpp")
|
||||
set_target_properties(CPMSol2Example PROPERTIES CXX_STANDARD 17)
|
||||
add_executable(CPMSol2Example main.cpp)
|
||||
target_compile_features(CPMSol2Example PRIVATE cxx_std_17)
|
||||
target_link_libraries(CPMSol2Example sol2)
|
||||
|
||||
|
||||
@@ -1,16 +1,17 @@
|
||||
#include <sol/sol.hpp>
|
||||
#include <cassert>
|
||||
#include <sol/sol.hpp>
|
||||
|
||||
struct vars {
|
||||
int boop = 0;
|
||||
int boop = 0;
|
||||
};
|
||||
|
||||
int main() {
|
||||
sol::state lua;
|
||||
lua.open_libraries( sol::lib::base );
|
||||
lua.new_usertype<vars>("vars", "boop", &vars::boop);
|
||||
lua.script("beep = vars.new()\n"
|
||||
"beep.boop = 1\n"
|
||||
"print('beep boop')");
|
||||
assert(lua.get<vars>("beep").boop == 1);
|
||||
sol::state lua;
|
||||
lua.open_libraries(sol::lib::base);
|
||||
lua.new_usertype<vars>("vars", "boop", &vars::boop);
|
||||
lua.script(
|
||||
"beep = vars.new()\n"
|
||||
"beep.boop = 1\n"
|
||||
"print('beep boop')");
|
||||
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;
|
||||
}
|
||||
@@ -1,25 +1,15 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMYamlExample)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME yaml-cpp
|
||||
GIT_REPOSITORY https://github.com/jbeder/yaml-cpp.git
|
||||
# 0.6.2 uses depricated 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"
|
||||
)
|
||||
CPMAddPackage("gh:jbeder/yaml-cpp#yaml-cpp-0.6.3@0.6.3")
|
||||
|
||||
# ---- Executable ----
|
||||
|
||||
add_executable(CPMYamlExample "main.cpp")
|
||||
set_target_properties(CPMYamlExample PROPERTIES CXX_STANDARD 17)
|
||||
add_executable(CPMYamlExample main.cpp)
|
||||
target_compile_features(CPMYamlExample PRIVATE cxx_std_17)
|
||||
target_link_libraries(CPMYamlExample yaml-cpp)
|
||||
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
#include <yaml-cpp/yaml.h>
|
||||
|
||||
#include <iostream>
|
||||
|
||||
int main(int argc, char ** argv){
|
||||
int main(int argc, char** argv) {
|
||||
if (argc != 2) {
|
||||
std::cout << "usage: " << argv[0] << " <path to yaml file>" << std::endl;
|
||||
return 1;
|
||||
|
||||
Binary file not shown.
BIN
logo/CPM.png
BIN
logo/CPM.png
Binary file not shown.
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 18 KiB |
@@ -1,13 +1,16 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMTests)
|
||||
|
||||
file(GLOB tests "${CMAKE_CURRENT_SOURCE_DIR}/unit/*.cmake")
|
||||
|
||||
enable_testing()
|
||||
|
||||
foreach(test ${tests})
|
||||
message(STATUS "adding test: ${test}")
|
||||
add_test(
|
||||
NAME ${test}
|
||||
COMMAND ${CMAKE_COMMAND} -DCPM_PATH=${CMAKE_CURRENT_SOURCE_DIR}/../cmake -P "${test}"
|
||||
add_test(NAME ${test} COMMAND ${CMAKE_COMMAND} -DCPM_PATH=${CMAKE_CURRENT_SOURCE_DIR}/../cmake -P
|
||||
"${test}"
|
||||
)
|
||||
endforeach()
|
||||
|
||||
add_custom_target(test-verbose COMMAND ${CMAKE_CTEST_COMMAND} -C Debug --verbose)
|
||||
|
||||
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"
|
||||
)
|
||||
2
test/unit/broken_dependency/.gitignore
vendored
Normal file
2
test/unit/broken_dependency/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
/CMakeLists.txt
|
||||
/package-lock.cmake
|
||||
13
test/unit/broken_dependency/CMakeLists.txt.in
Normal file
13
test/unit/broken_dependency/CMakeLists.txt.in
Normal file
@@ -0,0 +1,13 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMTest)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(@CPM_PATH@/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME BrokenDependency
|
||||
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/dependency
|
||||
EXCLUDE_FROM_ALL @EXCLUDE_FROM_ALL@
|
||||
)
|
||||
3
test/unit/broken_dependency/dependency/CMakeLists.txt
Normal file
3
test/unit/broken_dependency/dependency/CMakeLists.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
project(BrokenDependency)
|
||||
|
||||
add_custom_target(error ALL ${CMAKE_COMMAND} -E false)
|
||||
137
test/unit/cache.cmake
Normal file
137
test/unit/cache.cmake
Normal file
@@ -0,0 +1,137 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
include(${CPM_PATH}/testing.cmake)
|
||||
include(CMakePackageConfigHelpers)
|
||||
|
||||
set(CPM_SOURCE_CACHE_DIR "${CMAKE_CURRENT_BINARY_DIR}/CPM")
|
||||
set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/remote_dependency)
|
||||
|
||||
function(clear_cache)
|
||||
message(STATUS "clearing CPM cache")
|
||||
file(REMOVE_RECURSE ${CPM_SOURCE_CACHE_DIR})
|
||||
assert_not_exists("${CPM_SOURCE_CACHE_DIR}")
|
||||
endfunction()
|
||||
|
||||
function(update_cmake_lists)
|
||||
configure_package_config_file(
|
||||
"${CMAKE_CURRENT_LIST_DIR}/remote_dependency/CMakeLists.txt.in"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/remote_dependency/CMakeLists.txt"
|
||||
INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/junk
|
||||
)
|
||||
endfunction()
|
||||
|
||||
function(reset_test)
|
||||
clear_cache()
|
||||
file(REMOVE_RECURSE ${TEST_BUILD_DIR})
|
||||
update_cmake_lists()
|
||||
endfunction()
|
||||
|
||||
set(FIBONACCI_VERSION 1.0)
|
||||
|
||||
# Read CPM_SOURCE_CACHE from arguments
|
||||
|
||||
reset_test()
|
||||
|
||||
execute_process(
|
||||
COMMAND ${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/remote_dependency" "-B${TEST_BUILD_DIR}"
|
||||
"-DCPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}" RESULT_VARIABLE ret
|
||||
)
|
||||
|
||||
assert_equal(${ret} "0")
|
||||
assert_exists("${CPM_SOURCE_CACHE_DIR}/fibonacci")
|
||||
|
||||
file(GLOB FIBONACCI_VERSIONs "${CPM_SOURCE_CACHE_DIR}/fibonacci/*")
|
||||
list(LENGTH FIBONACCI_VERSIONs FIBONACCI_VERSION_count)
|
||||
assert_equal(${FIBONACCI_VERSION_count} "1")
|
||||
|
||||
file(GLOB fibonacci_versions "${CPM_SOURCE_CACHE_DIR}/fibonacci/*")
|
||||
list(LENGTH fibonacci_versions fibonacci_version_count)
|
||||
assert_equal(${fibonacci_version_count} "1")
|
||||
|
||||
# Update dependency and keep CPM_SOURCE_CACHE
|
||||
|
||||
set(FIBONACCI_VERSION 2.0)
|
||||
update_cmake_lists()
|
||||
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} ${TEST_BUILD_DIR} RESULT_VARIABLE ret)
|
||||
|
||||
assert_equal(${ret} "0")
|
||||
|
||||
file(GLOB FIBONACCI_VERSIONs "${CPM_SOURCE_CACHE_DIR}/fibonacci/*")
|
||||
list(LENGTH FIBONACCI_VERSIONs FIBONACCI_VERSION_count)
|
||||
assert_equal(${FIBONACCI_VERSION_count} "2")
|
||||
|
||||
# Clear cache and update
|
||||
|
||||
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(
|
||||
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_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
|
||||
)
|
||||
|
||||
assert_equal(${ret} "0")
|
||||
|
||||
# Overwrite CPM_SOURCE_CACHE with argument
|
||||
|
||||
reset_test()
|
||||
|
||||
execute_process(
|
||||
COMMAND
|
||||
${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
|
||||
)
|
||||
|
||||
assert_equal(${ret} "0")
|
||||
assert_exists("${CPM_SOURCE_CACHE_DIR}/fibonacci")
|
||||
|
||||
# Use NO_CACHE option
|
||||
|
||||
set(FIBONACCI_PACKAGE_ARGS "NO_CACHE YES")
|
||||
set(FIBONACCI_VERSION 1.0)
|
||||
update_cmake_lists()
|
||||
reset_test()
|
||||
|
||||
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")
|
||||
|
||||
# Use commit hash after version
|
||||
|
||||
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,26 +5,25 @@ include(${CPM_PATH}/testing.cmake)
|
||||
|
||||
set(CPM_DRY_RUN ON)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME A
|
||||
GIT_TAG 1.2.3
|
||||
)
|
||||
CPMAddPackage(NAME A GIT_TAG 1.2.3)
|
||||
|
||||
CPM_GET_PACKAGE_VERSION(A VERSION)
|
||||
ASSERT_EQUAL(${VERSION} "1.2.3")
|
||||
CPMAddPackage(NAME A VERSION 1.2.3)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME B
|
||||
GIT_TAG v2.3.1
|
||||
)
|
||||
CPMGetPackageVersion(A VERSION)
|
||||
assert_equal(${VERSION} "1.2.3")
|
||||
|
||||
CPM_GET_PACKAGE_VERSION(B VERSION)
|
||||
ASSERT_EQUAL(${VERSION} "2.3.1")
|
||||
CPMAddPackage(NAME B VERSION 2.4.1)
|
||||
|
||||
CPMAddPackage(NAME B GIT_TAG v2.3.1)
|
||||
|
||||
CPMGetPackageVersion(B VERSION)
|
||||
assert_equal(${VERSION} "2.4.1")
|
||||
|
||||
CPMAddPackage(
|
||||
NAME C
|
||||
GIT_TAG v3.1.2-a
|
||||
VERSION 3.1.2
|
||||
)
|
||||
|
||||
CPM_GET_PACKAGE_VERSION(C VERSION)
|
||||
ASSERT_EQUAL(${VERSION} "3.1.2")
|
||||
CPMGetPackageVersion(C VERSION)
|
||||
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
|
||||
34
test/unit/local_dependency/ModuleCMakeLists.txt.in
Normal file
34
test/unit/local_dependency/ModuleCMakeLists.txt.in
Normal file
@@ -0,0 +1,34 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMTest)
|
||||
|
||||
# ---- Options ----
|
||||
|
||||
option(ENABLE_TEST_COVERAGE "Enable test coverage" OFF)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(@CPM_PATH@/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME @TEST_DEPENDENCY_NAME@
|
||||
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/dependency
|
||||
)
|
||||
|
||||
# ---- check if generated modules override find_package ----
|
||||
|
||||
if (@test_check_find_package@)
|
||||
find_package(@TEST_DEPENDENCY_NAME@ REQUIRED)
|
||||
endif()
|
||||
|
||||
# ---- Call dependency method to validate correct addition of directory ----
|
||||
|
||||
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)
|
||||
33
test/unit/local_dependency/OptionsCMakeLists.txt.in
Normal file
33
test/unit/local_dependency/OptionsCMakeLists.txt.in
Normal file
@@ -0,0 +1,33 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMTest)
|
||||
|
||||
# ---- Options ----
|
||||
|
||||
option(ENABLE_TEST_COVERAGE "Enable test coverage" OFF)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(@CPM_PATH@/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME Dependency
|
||||
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/dependency
|
||||
OPTIONS "DEFINE_ALTERNATIVE_FUNCTION YES"
|
||||
EXCLUDE_FROM_ALL YES
|
||||
)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
alternative_dependency_function()
|
||||
|
||||
# ---- Check parameters ----
|
||||
|
||||
include(@CPM_PATH@/testing.cmake)
|
||||
|
||||
message("DEFINE_ALTERNATIVE_FUNCTION: ${DEFINE_ALTERNATIVE_FUNCTION}")
|
||||
|
||||
# this option is overridden by CPM.cmake
|
||||
ASSERT_NOT_DEFINED(DEFINE_ALTERNATIVE_FUNCTION)
|
||||
# this option is leaked by the dependency
|
||||
ASSERT_EQUAL(${LEAKED_OPTION} "OFF")
|
||||
27
test/unit/local_dependency/OverrideCMakeLists.txt.in
Normal file
27
test/unit/local_dependency/OverrideCMakeLists.txt.in
Normal file
@@ -0,0 +1,27 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMTest)
|
||||
|
||||
# ---- Options ----
|
||||
|
||||
option(ENABLE_TEST_COVERAGE "Enable test coverage" OFF)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(@CPM_PATH@/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME Dependency
|
||||
)
|
||||
|
||||
# ---- Call dependency method to validate correct addition of directory ----
|
||||
|
||||
dependency_function()
|
||||
|
||||
# ---- Check parameters ----
|
||||
|
||||
include(@CPM_PATH@/testing.cmake)
|
||||
|
||||
ASSERT_TRUTHY(Dependency_ADDED)
|
||||
ASSERT_DEFINED(Dependency_SOURCE_DIR)
|
||||
ASSERT_DEFINED(Dependency_BINARY_DIR)
|
||||
20
test/unit/local_dependency/PackageLockCMakeLists.txt.in
Normal file
20
test/unit/local_dependency/PackageLockCMakeLists.txt.in
Normal file
@@ -0,0 +1,20 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMTest)
|
||||
|
||||
# ---- Options ----
|
||||
|
||||
option(ENABLE_TEST_COVERAGE "Enable test coverage" OFF)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(@CPM_PATH@/CPM.cmake)
|
||||
CPMUsePackageLock(package-lock.cmake)
|
||||
|
||||
@PREPARE_CODE@
|
||||
|
||||
CPMGetPackage(Dependency)
|
||||
|
||||
# ---- Call dependency method to validate correct addition of directory ----
|
||||
|
||||
dependency_function()
|
||||
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()
|
||||
14
test/unit/local_dependency/dependency/CMakeLists.txt
Normal file
14
test/unit/local_dependency/dependency/CMakeLists.txt
Normal file
@@ -0,0 +1,14 @@
|
||||
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
|
||||
|
||||
option(DEFINE_ALTERNATIVE_FUNCTION "define the alternative function" OFF)
|
||||
option(LEAKED_OPTION "this option will be leaked to the outer scope" OFF)
|
||||
|
||||
if(NOT DEFINE_ALTERNATIVE_FUNCTION)
|
||||
function(dependency_function)
|
||||
message("called external method")
|
||||
endfunction()
|
||||
else()
|
||||
function(alternative_dependency_function)
|
||||
message("called alternative external method")
|
||||
endfunction()
|
||||
endif()
|
||||
@@ -0,0 +1,3 @@
|
||||
function(inner_dependency_function)
|
||||
message("called inner method")
|
||||
endfunction()
|
||||
28
test/unit/modules.cmake
Normal file
28
test/unit/modules.cmake
Normal file
@@ -0,0 +1,28 @@
|
||||
include(CMakePackageConfigHelpers)
|
||||
include(${CPM_PATH}/testing.cmake)
|
||||
|
||||
set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/modules)
|
||||
|
||||
function(init_project_with_dependency TEST_DEPENDENCY_NAME)
|
||||
configure_package_config_file(
|
||||
"${CMAKE_CURRENT_LIST_DIR}/local_dependency/ModuleCMakeLists.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")
|
||||
endfunction()
|
||||
|
||||
init_project_with_dependency(A)
|
||||
assert_exists(${TEST_BUILD_DIR}/CPM_modules)
|
||||
assert_exists(${TEST_BUILD_DIR}/CPM_modules/FindA.cmake)
|
||||
assert_not_exists(${TEST_BUILD_DIR}/CPM_modules/FindB.cmake)
|
||||
|
||||
init_project_with_dependency(B)
|
||||
assert_not_exists(${TEST_BUILD_DIR}/CPM_modules/FindA.cmake)
|
||||
assert_exists(${TEST_BUILD_DIR}/CPM_modules/FindB.cmake)
|
||||
19
test/unit/options.cmake
Normal file
19
test/unit/options.cmake
Normal file
@@ -0,0 +1,19 @@
|
||||
include(CMakePackageConfigHelpers)
|
||||
include(${CPM_PATH}/testing.cmake)
|
||||
|
||||
set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/source_dir)
|
||||
|
||||
set(TEST_DEPENDENCY_NAME Dependency)
|
||||
|
||||
configure_package_config_file(
|
||||
"${CMAKE_CURRENT_LIST_DIR}/local_dependency/OptionsCMakeLists.txt.in"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/local_dependency/CMakeLists.txt"
|
||||
INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/junk
|
||||
)
|
||||
|
||||
execute_process(
|
||||
COMMAND ${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/local_dependency" "-B${TEST_BUILD_DIR}"
|
||||
RESULT_VARIABLE ret
|
||||
)
|
||||
|
||||
assert_equal(${ret} "0")
|
||||
53
test/unit/package-lock.cmake
Normal file
53
test/unit/package-lock.cmake
Normal file
@@ -0,0 +1,53 @@
|
||||
include(CMakePackageConfigHelpers)
|
||||
include(${CPM_PATH}/testing.cmake)
|
||||
|
||||
set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/package-lock)
|
||||
|
||||
function(configure_with_declare DECLARE_DEPENDENCY)
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} -E rm -rf ${TEST_BUILD_DIR})
|
||||
|
||||
if(DECLARE_DEPENDENCY)
|
||||
set(PREPARE_CODE
|
||||
"CPMDeclarePackage(Dependency
|
||||
NAME Dependency
|
||||
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/local_dependency/dependency
|
||||
)"
|
||||
)
|
||||
else()
|
||||
set(PREPARE_CODE "")
|
||||
endif()
|
||||
|
||||
configure_package_config_file(
|
||||
"${CMAKE_CURRENT_LIST_DIR}/local_dependency/PackageLockCMakeLists.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}
|
||||
-DCPM_INCLUDE_ALL_IN_PACKAGE_LOCK=1 RESULT_VARIABLE ret
|
||||
)
|
||||
|
||||
assert_equal(${ret} "0")
|
||||
endfunction()
|
||||
|
||||
function(update_package_lock)
|
||||
execute_process(
|
||||
COMMAND ${CMAKE_COMMAND} --build ${TEST_BUILD_DIR} --target cpm-update-package-lock
|
||||
RESULT_VARIABLE ret
|
||||
)
|
||||
|
||||
assert_equal(${ret} "0")
|
||||
endfunction()
|
||||
|
||||
execute_process(
|
||||
COMMAND ${CMAKE_COMMAND} -E rm -f ${CMAKE_CURRENT_LIST_DIR}/local_dependency/package-lock.cmake
|
||||
)
|
||||
configure_with_declare(YES)
|
||||
assert_not_exists(${CMAKE_CURRENT_LIST_DIR}/local_dependency/package-lock.cmake)
|
||||
update_package_lock()
|
||||
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})
|
||||
20
test/unit/package-override.cmake
Normal file
20
test/unit/package-override.cmake
Normal file
@@ -0,0 +1,20 @@
|
||||
include(CMakePackageConfigHelpers)
|
||||
include(${CPM_PATH}/testing.cmake)
|
||||
|
||||
set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/project-override)
|
||||
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} -E rm -rf ${TEST_BUILD_DIR})
|
||||
|
||||
configure_package_config_file(
|
||||
"${CMAKE_CURRENT_LIST_DIR}/local_dependency/OverrideCMakeLists.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}
|
||||
-DCPM_Dependency_SOURCE=${CMAKE_CURRENT_LIST_DIR}/local_dependency/dependency
|
||||
RESULT_VARIABLE ret
|
||||
)
|
||||
|
||||
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}"
|
||||
)
|
||||
1
test/unit/remote_dependency/.gitignore
vendored
Normal file
1
test/unit/remote_dependency/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/CMakeLists.txt
|
||||
32
test/unit/remote_dependency/CMakeLists.txt.in
Normal file
32
test/unit/remote_dependency/CMakeLists.txt.in
Normal file
@@ -0,0 +1,32 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMExampleCatch2)
|
||||
|
||||
# ---- Options ----
|
||||
|
||||
option(ENABLE_TEST_COVERAGE "Enable test coverage" OFF)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(@CPM_PATH@/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME fibonacci
|
||||
GIT_REPOSITORY https://github.com/cpm-cmake/testpack-fibonacci.git
|
||||
VERSION @FIBONACCI_VERSION@
|
||||
@FIBONACCI_PACKAGE_ARGS@
|
||||
)
|
||||
|
||||
# ---- Create binary ----
|
||||
|
||||
add_executable(CPMExampleCatch2 main.cpp)
|
||||
target_link_libraries(CPMExampleCatch2 fibonacci)
|
||||
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)
|
||||
10
test/unit/remote_dependency/main.cpp
Normal file
10
test/unit/remote_dependency/main.cpp
Normal file
@@ -0,0 +1,10 @@
|
||||
#define CATCH_CONFIG_MAIN
|
||||
|
||||
#include <fibonacci.h>
|
||||
|
||||
#include <iostream>
|
||||
|
||||
int main() {
|
||||
std::cout << "fib(10) = " << fastFibonacci(10) << std::endl;
|
||||
return 0;
|
||||
}
|
||||
19
test/unit/source_dir.cmake
Normal file
19
test/unit/source_dir.cmake
Normal file
@@ -0,0 +1,19 @@
|
||||
include(CMakePackageConfigHelpers)
|
||||
include(${CPM_PATH}/testing.cmake)
|
||||
|
||||
set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/source_dir)
|
||||
|
||||
set(TEST_DEPENDENCY_NAME Dependency)
|
||||
|
||||
configure_package_config_file(
|
||||
"${CMAKE_CURRENT_LIST_DIR}/local_dependency/ModuleCMakeLists.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")
|
||||
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}/testing.cmake)
|
||||
|
||||
CPM_GET_VERSION_FROM_GIT_TAG("1.2.3" VERSION)
|
||||
ASSERT_EQUAL("1.2.3" ${VERSION})
|
||||
cpm_get_version_from_git_tag("1.2.3" VERSION)
|
||||
assert_equal("1.2.3" ${VERSION})
|
||||
|
||||
CPM_GET_VERSION_FROM_GIT_TAG("v1.2.3" VERSION)
|
||||
ASSERT_EQUAL("1.2.3" ${VERSION})
|
||||
cpm_get_version_from_git_tag("v1.2.3" VERSION)
|
||||
assert_equal("1.2.3" ${VERSION})
|
||||
|
||||
CPM_GET_VERSION_FROM_GIT_TAG("1.2.3-a" VERSION)
|
||||
ASSERT_EQUAL("1.2.3" ${VERSION})
|
||||
cpm_get_version_from_git_tag("1.2.3-a" VERSION)
|
||||
assert_equal("1.2.3" ${VERSION})
|
||||
|
||||
CPM_GET_VERSION_FROM_GIT_TAG("v1.2.3-a" VERSION)
|
||||
ASSERT_EQUAL("1.2.3" ${VERSION})
|
||||
cpm_get_version_from_git_tag("v1.2.3-a" VERSION)
|
||||
assert_equal("1.2.3" ${VERSION})
|
||||
|
||||
Reference in New Issue
Block a user