mirror of
https://github.com/cpm-cmake/CPM.cmake.git
synced 2025-11-17 22:58:14 -05:00
Compare commits
70 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
91585e3864 | ||
|
|
9675d46517 | ||
|
|
7078e8286a | ||
|
|
6a0277f16e | ||
|
|
4502bf1e04 | ||
|
|
dd3ba9792c | ||
|
|
de5551e42c | ||
|
|
7644c3a40f | ||
|
|
310efb9b17 | ||
|
|
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 |
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'
|
||||
...
|
||||
73
.cmake-format
Normal file
73
.cmake-format
Normal file
@@ -0,0 +1,73 @@
|
||||
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
|
||||
SOURCE_SUBDIR: 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
|
||||
10
.github/workflows/macos.yml
vendored
10
.github/workflows/macos.yml
vendored
@@ -1,11 +1,17 @@
|
||||
name: MacOS
|
||||
|
||||
on: [push]
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: macOS-10.14
|
||||
runs-on: macos-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
|
||||
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
|
||||
10
.github/workflows/ubuntu.yml
vendored
10
.github/workflows/ubuntu.yml
vendored
@@ -1,11 +1,17 @@
|
||||
name: Ubuntu
|
||||
|
||||
on: [push]
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-18.04
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
|
||||
10
.github/workflows/windows.yml
vendored
10
.github/workflows/windows.yml
vendored
@@ -1,11 +1,17 @@
|
||||
name: Windows
|
||||
|
||||
on: [push]
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: windows-2019
|
||||
runs-on: windows-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,3 +1,4 @@
|
||||
build/
|
||||
/build*
|
||||
/.vscode
|
||||
*.DS_Store
|
||||
*.DS_Store
|
||||
|
||||
@@ -36,8 +36,7 @@ before_install:
|
||||
# Update compilers
|
||||
- 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://github.com/Kitware/CMake/releases/download/v3.20.3/cmake-3.20.3-linux-x86_64.sh
|
||||
- sudo sh cmake.sh --skip-license --exclude-subdir --prefix=/usr/local
|
||||
- export PATH=/usr/local/bin:$PATH
|
||||
- cmake --version
|
||||
|
||||
283
README.md
283
README.md
@@ -1,16 +1,18 @@
|
||||
[](https://travis-ci.com/TheLartians/CPM.cmake)
|
||||
[](https://github.com/TheLartians/CPM.cmake/actions)
|
||||
[](https://github.com/TheLartians/CPM.cmake/actions)
|
||||
[](https://github.com/TheLartians/CPM.cmake/actions)
|
||||
[](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.cmake is a CMake script that adds dependency management capabilities to CMake.
|
||||
It's built as a thin wrapper around CMake's [FetchContent](https://cmake.org/cmake/help/latest/module/FetchContent.html) module that adds version control, caching and a simple API.
|
||||
It's built as a thin wrapper around CMake's [FetchContent](https://cmake.org/cmake/help/latest/module/FetchContent.html) module that adds version control, caching, a simple API [and more](#comparison-to-pure-fetchcontent--externalproject).
|
||||
|
||||
## Manage everything
|
||||
|
||||
@@ -18,11 +20,16 @@ Any downloadable project or resource can be added as a version-controlled depend
|
||||
Projects using modern CMake are automatically configured and their targets can be used immediately.
|
||||
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
|
||||
|
||||
After `CPM.cmake` has been [added](#adding-cpm) to your project, the function `CPMAddPackage` or `CPMFindPackage` can be used to fetch and configure a dependency.
|
||||
After `CPM.cmake` has been [added](#adding-cpm) to your project, the function `CPMAddPackage` can be used to fetch and configure a dependency.
|
||||
Afterwards, any targets defined in the dependency can be used directly.
|
||||
`CPMFindPackage` and `CPMAddPackage` take the following named parameters.
|
||||
`CPMAddPackage` takes the following named parameters.
|
||||
|
||||
```cmake
|
||||
CPMAddPackage(
|
||||
@@ -36,17 +43,44 @@ CPMAddPackage(
|
||||
|
||||
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 always download the most recent version.
|
||||
The optional argument `FIND_PACKAGE_ARGUMENTS` can be specified to a string of parameters that will be passed to `find_package` if enabled (see below).
|
||||
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`, however this isn't recommended, as such packages will only be updated when the cache is cleared.
|
||||
|
||||
After calling `CPMAddPackage` or `CPMFindPackage`, the following variables are defined in the local scope, where `<dependency>` is the name of the dependency.
|
||||
If an additional optional parameter `EXCLUDE_FROM_ALL` is set to a truthy value, then any targets defined inside the dependency won't be built by default. See the [CMake docs](https://cmake.org/cmake/help/latest/prop_tgt/EXCLUDE_FROM_ALL.html) for details.
|
||||
|
||||
A single-argument compact syntax is also supported:
|
||||
|
||||
```cmake
|
||||
# A git package from a given uri with a version
|
||||
CPMAddPackage("uri@version")
|
||||
# A git package from a given uri with a git tag or commit hash
|
||||
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 converted to `https://gitlab.com/user/name.git`. If the URI is of the form `bb:user/name`, it is interpreted as a [Bitbucket](https://bitbucket.org/) URI and converted to `https://bitbucket.org/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`.
|
||||
|
||||
The difference between `CPMFindPackage` and `CPMAddPackage` is that `CPMFindPackage` will try to find a local dependency via CMake's `find_package` and fallback to `CPMAddPackage` if the dependency is not found.
|
||||
This behaviour can be also modified globally via [CPM options](#options).
|
||||
For using CPM.cmake projects with external package managers, such as conan or vcpkg, setting the variable [`CPM_USE_LOCAL_PACKAGES`](#options) will make CPM.cmake try to add a package through `find_package` first, and add it from source if it doesn't succeed.
|
||||
|
||||
In rare cases, this behaviour may be desirable by default. The function `CPMFindPackage` will try to find a local dependency via CMake's `find_package` and fallback to `CPMAddPackage`, if the dependency is not found.
|
||||
|
||||
## Full CMakeLists Example
|
||||
|
||||
@@ -61,29 +95,25 @@ add_executable(tests tests.cpp)
|
||||
|
||||
# add dependencies
|
||||
include(cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME Catch2
|
||||
GITHUB_REPOSITORY catchorg/Catch2
|
||||
VERSION 2.5.0
|
||||
)
|
||||
CPMAddPackage("gh:catchorg/Catch2@2.5.0")
|
||||
|
||||
# link dependencies
|
||||
target_link_libraries(tests Catch2)
|
||||
```
|
||||
|
||||
See the [examples directory](https://github.com/TheLartians/CPM/tree/master/examples) for complete examples with source code or the [wiki](https://github.com/TheLartians/CPM/wiki/More-Snippets) for example snippets.
|
||||
See the [examples directory](https://github.com/cpm-cmake/CPM.cmake/tree/master/examples) for complete examples with source code and check [below](#snippets) or in the [wiki](https://github.com/cpm-cmake/CPM.cmake/wiki/More-Snippets) for example snippets.
|
||||
|
||||
## Adding CPM
|
||||
|
||||
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.cmake/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
|
||||
|
||||
@@ -94,7 +124,7 @@ Dependencies using CPM will automatically use the updated script of the outermos
|
||||
|
||||
- **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.
|
||||
- **Reproducable builds** By versioning dependencies via git commits or tags it is ensured that a project will always be buildable.
|
||||
- **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** Simply add all external sources as a dependency.
|
||||
@@ -102,14 +132,40 @@ Dependencies using CPM will automatically use the updated script of the outermos
|
||||
|
||||
## Limitations
|
||||
|
||||
- **No pre-built binaries** For every new build directory, all dependencies are initially downloaded and built from scratch. To avoid extra downloads it is recommend to set the [`CPM_SOURCE_CACHE`](#CPM_SOURCE_CACHE) environmental variable. Using a caching compiler such as [ccahe](https://github.com/TheLartians/Ccache.cmake) can drastically reduce build time.
|
||||
- **Dependent on good CMakeLists** Many libraries do not have CMakeLists that work well for subprojects. Luckily this is slowly changing, however, until then, some manual configuration may be required (see the snippets [below](#snippets) for examples). For best practices on preparing projects for CPM, see the [wiki](https://github.com/TheLartians/CPM/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 a warning. This can be resolved by adding a new version of the dependency in the outermost project.
|
||||
- **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 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 emit 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_CACHE
|
||||
@@ -124,6 +180,8 @@ export CPM_SOURCE_CACHE=$HOME/.cache/CPM
|
||||
|
||||
Note that passing the variable as a configure option to CMake will always override the value set by the environmental variable.
|
||||
|
||||
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`.
|
||||
@@ -136,58 +194,121 @@ CPM can be configured to use `find_package` to search for locally installed depe
|
||||
If the option `CPM_LOCAL_PACKAGES_ONLY` is set, CPM will emit an error if the dependency is not found locally.
|
||||
These options can also be set as environmental variables.
|
||||
|
||||
In the case that `find_package` requires additional arguments, the parameter `FIND_PACKAGE_ARGUMENTS` may be specified in the `CPMAddPackage` call. The value of this parameter will be forwarded to `find_package`.
|
||||
|
||||
## Local package override
|
||||
|
||||
Library developers are often in the situation where they work on a locally checked out dependency at the same time as on a consumer project.
|
||||
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
|
||||
# boost-cmake currently doesn't tag versions, so we use the according boost version
|
||||
CPMAddPackage("gh:Orphis/boost-cmake#7f97a08b64bd5d2e53e932ddf80c40544cf45edf@1.71.0")
|
||||
```
|
||||
|
||||
### [Yaml-cpp](https://github.com/jbeder/yaml-cpp)
|
||||
|
||||
```CMake
|
||||
# as the tag is in an unusual format, we need to explicitly specify the version
|
||||
CPMAddPackage("gh:jbeder/yaml-cpp#yaml-cpp-0.6.3@0.6.3")
|
||||
```
|
||||
|
||||
### [Range-v3](https://github.com/ericniebler/range-v3)
|
||||
|
||||
```Cmake
|
||||
CPMAddPackage("gh:ericniebler/range-v3#0.11.0")
|
||||
```
|
||||
|
||||
### [nlohmann/json](https://github.com/nlohmann/json)
|
||||
|
||||
```cmake
|
||||
CPMAddPackage(
|
||||
NAME boost-cmake
|
||||
GITHUB_REPOSITORY Orphis/boost-cmake
|
||||
VERSION 1.67.0
|
||||
NAME nlohmann_json
|
||||
VERSION 3.9.1
|
||||
OPTIONS
|
||||
"JSON_BuildTests OFF"
|
||||
)
|
||||
```
|
||||
|
||||
### [cxxopts](https://github.com/jarro2783/cxxopts)
|
||||
|
||||
```cmake
|
||||
# the install option has to be explicitly set to allow installation
|
||||
CPMAddPackage(
|
||||
NAME cxxopts
|
||||
GITHUB_REPOSITORY jarro2783/cxxopts
|
||||
VERSION 2.2.0
|
||||
OPTIONS
|
||||
"CXXOPTS_BUILD_EXAMPLES Off"
|
||||
"CXXOPTS_BUILD_TESTS Off"
|
||||
)
|
||||
```
|
||||
|
||||
### [Yaml-cpp](https://github.com/jbeder/yaml-cpp)
|
||||
|
||||
```CMake
|
||||
CPMAddPackage(
|
||||
NAME yaml-cpp
|
||||
GITHUB_REPOSITORY jbeder/yaml-cpp
|
||||
# 0.6.2 uses deprecated CMake syntax
|
||||
VERSION 0.6.3
|
||||
# 0.6.3 is not released yet, so use a recent commit
|
||||
GIT_TAG 012269756149ae99745b6dafefd415843d7420bb
|
||||
OPTIONS
|
||||
"YAML_CPP_BUILD_TESTS Off"
|
||||
"YAML_CPP_BUILD_CONTRIB Off"
|
||||
"YAML_CPP_BUILD_TOOLS Off"
|
||||
VERSION 2.2.1
|
||||
OPTIONS "CXXOPTS_BUILD_EXAMPLES NO" "CXXOPTS_BUILD_TESTS NO" "CXXOPTS_ENABLE_INSTALL YES"
|
||||
)
|
||||
```
|
||||
|
||||
@@ -197,48 +318,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)
|
||||
endif()
|
||||
```
|
||||
|
||||
### [nlohmann/json](https://github.com/nlohmann/json)
|
||||
|
||||
```cmake
|
||||
CPMAddPackage(
|
||||
NAME nlohmann_json
|
||||
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
|
||||
)
|
||||
|
||||
if (nlohmann_json_ADDED)
|
||||
add_library(nlohmann_json INTERFACE IMPORTED)
|
||||
target_include_directories(nlohmann_json INTERFACE ${nlohmann_json_SOURCE_DIR})
|
||||
endif()
|
||||
```
|
||||
|
||||
### [Range-v3](https://github.com/ericniebler/range-v3)
|
||||
|
||||
```Cmake
|
||||
CPMAddPackage(
|
||||
NAME range-v3
|
||||
URL https://github.com/ericniebler/range-v3/archive/0.5.0.zip
|
||||
VERSION 0.5.0
|
||||
# the range-v3 CMakeLists screws with configuration options
|
||||
DOWNLOAD_ONLY True
|
||||
)
|
||||
|
||||
if(range-v3_ADDED)
|
||||
add_library(range-v3 INTERFACE IMPORTED)
|
||||
target_include_directories(range-v3 INTERFACE "${range-v3_SOURCE_DIR}/include")
|
||||
if(benchmark_ADDED)
|
||||
# enable c++11 to avoid compilation errors
|
||||
set_target_properties(benchmark PROPERTIES CXX_STANDARD 11)
|
||||
endif()
|
||||
```
|
||||
|
||||
@@ -256,6 +342,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
|
||||
@@ -269,4 +356,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 and check out the [wiki](https://github.com/TheLartians/CPM/wiki/More-Snippets) for many more example snippets.
|
||||
See the [examples directory](https://github.com/cpm-cmake/CPM.cmake/tree/master/examples) for full examples with source code and check out the [wiki](https://github.com/cpm-cmake/CPM.cmake/wiki/More-Snippets) for many more example snippets.
|
||||
|
||||
884
cmake/CPM.cmake
884
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,22 +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} STREQUAL ${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)
|
||||
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()
|
||||
|
||||
7
examples/TestingFramework/CMakeLists.txt
Normal file
7
examples/TestingFramework/CMakeLists.txt
Normal file
@@ -0,0 +1,7 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMTestingFrameworkExample)
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
CPMAddPackage("bb:HEMRND/TestingFramework@0.4.1")
|
||||
add_test_suites(TESTS SomeTest)
|
||||
19
examples/TestingFramework/SomeTest.cpp
Normal file
19
examples/TestingFramework/SomeTest.cpp
Normal file
@@ -0,0 +1,19 @@
|
||||
#include <HEM/TestingFramework.hpp>
|
||||
|
||||
using namespace fakeit;
|
||||
|
||||
class ITest {
|
||||
public:
|
||||
virtual int getInt() = 0;
|
||||
};
|
||||
|
||||
TEST_CASE("Testing Framework Test") {
|
||||
constexpr int someIntValue = 123456;
|
||||
|
||||
Mock<ITest> testMock;
|
||||
When(Method(testMock, getInt)).Return(someIntValue);
|
||||
|
||||
int readValue = testMock.get().getInt();
|
||||
|
||||
REQUIRE(readValue == someIntValue);
|
||||
}
|
||||
63
examples/asio-standalone/CMakeLists.txt
Normal file
63
examples/asio-standalone/CMakeLists.txt
Normal file
@@ -0,0 +1,63 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMExampleASIOStandalone)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
find_package(Threads REQUIRED)
|
||||
|
||||
CPMAddPackage("gh:chriskohlhoff/asio#asio-1-18-1@1.18.1")
|
||||
|
||||
# ASIO doesn't use CMake, we have to configure it manually. Extra notes for using on Windows:
|
||||
#
|
||||
# 1) If _WIN32_WINNT is not set, ASIO assumes _WIN32_WINNT=0x0501, i.e. Windows XP target, which is
|
||||
# definitely not the platform which most users target.
|
||||
#
|
||||
# 2) WIN32_LEAN_AND_MEAN is defined to make Winsock2 work.
|
||||
if(asio_ADDED)
|
||||
add_library(asio INTERFACE)
|
||||
|
||||
target_include_directories(asio SYSTEM INTERFACE ${asio_SOURCE_DIR}/asio/include)
|
||||
|
||||
target_compile_definitions(asio INTERFACE ASIO_STANDALONE ASIO_NO_DEPRECATED)
|
||||
|
||||
target_link_libraries(asio INTERFACE Threads::Threads)
|
||||
|
||||
if(WIN32)
|
||||
# macro see @ https://stackoverflow.com/a/40217291/1746503
|
||||
macro(get_win32_winnt version)
|
||||
if(CMAKE_SYSTEM_VERSION)
|
||||
set(ver ${CMAKE_SYSTEM_VERSION})
|
||||
string(REGEX MATCH "^([0-9]+).([0-9])" ver ${ver})
|
||||
string(REGEX MATCH "^([0-9]+)" verMajor ${ver})
|
||||
# Check for Windows 10, b/c we'll need to convert to hex 'A'.
|
||||
if("${verMajor}" MATCHES "10")
|
||||
set(verMajor "A")
|
||||
string(REGEX REPLACE "^([0-9]+)" ${verMajor} ver ${ver})
|
||||
endif("${verMajor}" MATCHES "10")
|
||||
# Remove all remaining '.' characters.
|
||||
string(REPLACE "." "" ver ${ver})
|
||||
# Prepend each digit with a zero.
|
||||
string(REGEX REPLACE "([0-9A-Z])" "0\\1" ver ${ver})
|
||||
set(${version} "0x${ver}")
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
if(NOT DEFINED _WIN32_WINNT)
|
||||
get_win32_winnt(ver)
|
||||
set(_WIN32_WINNT ${ver})
|
||||
endif()
|
||||
|
||||
message(STATUS "Set _WIN32_WINNET=${_WIN32_WINNT}")
|
||||
|
||||
target_compile_definitions(asio INTERFACE _WIN32_WINNT=${_WIN32_WINNT} WIN32_LEAN_AND_MEAN)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# ---- Executable ----
|
||||
|
||||
add_executable(CPMExampleASIOStandalone main.cpp)
|
||||
target_link_libraries(CPMExampleASIOStandalone asio)
|
||||
target_compile_features(CPMExampleASIOStandalone PRIVATE cxx_std_11)
|
||||
93
examples/asio-standalone/main.cpp
Normal file
93
examples/asio-standalone/main.cpp
Normal file
@@ -0,0 +1,93 @@
|
||||
//
|
||||
// async_tcp_echo_server.cpp
|
||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
//
|
||||
// Copyright (c) 2003-2020 Christopher M. Kohlhoff (chris at kohlhoff dot com)
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0.
|
||||
// (See http://www.boost.org/LICENSE_1_0.txt)
|
||||
//
|
||||
|
||||
#include <cstdlib>
|
||||
#include <iostream>
|
||||
#include <memory>
|
||||
#include <utility>
|
||||
|
||||
#include "asio.hpp"
|
||||
|
||||
// An asynchronous tcp echo server.
|
||||
// See https://think-async.com/Asio/asio-1.16.1/src/examples/cpp11/echo/async_tcp_echo_server.cpp
|
||||
|
||||
using asio::ip::tcp;
|
||||
|
||||
class session : public std::enable_shared_from_this<session> {
|
||||
public:
|
||||
session(tcp::socket socket) : socket_(std::move(socket)) {}
|
||||
|
||||
void start() { do_read(); }
|
||||
|
||||
private:
|
||||
void do_read() {
|
||||
auto self(shared_from_this());
|
||||
socket_.async_read_some(asio::buffer(data_, max_length),
|
||||
[this, self](std::error_code ec, std::size_t length) {
|
||||
if (!ec) {
|
||||
do_write(length);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void do_write(std::size_t length) {
|
||||
auto self(shared_from_this());
|
||||
asio::async_write(socket_, asio::buffer(data_, length),
|
||||
[this, self](std::error_code ec, std::size_t /*length*/) {
|
||||
if (!ec) {
|
||||
do_read();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
tcp::socket socket_;
|
||||
enum { max_length = 1024 };
|
||||
char data_[max_length];
|
||||
};
|
||||
|
||||
class server {
|
||||
public:
|
||||
server(asio::io_context& io_context, short port)
|
||||
: acceptor_(io_context, tcp::endpoint(tcp::v4(), port)) {
|
||||
do_accept();
|
||||
}
|
||||
|
||||
private:
|
||||
void do_accept() {
|
||||
acceptor_.async_accept([this](std::error_code ec, tcp::socket socket) {
|
||||
if (!ec) {
|
||||
std::make_shared<session>(std::move(socket))->start();
|
||||
}
|
||||
|
||||
do_accept();
|
||||
});
|
||||
}
|
||||
|
||||
tcp::acceptor acceptor_;
|
||||
};
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
try {
|
||||
if (argc != 2) {
|
||||
std::cerr << "Usage: async_tcp_echo_server <port>\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
asio::io_context io_context;
|
||||
|
||||
server s(io_context, std::atoi(argv[1]));
|
||||
|
||||
io_context.run();
|
||||
} catch (std::exception& e) {
|
||||
std::cerr << "Exception: " << e.what() << "\n";
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -6,27 +6,22 @@ project(CPMExampleBenchmark)
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME fibonacci
|
||||
GIT_REPOSITORY https://github.com/TheLartians/Fibonacci.git
|
||||
VERSION 2.0
|
||||
)
|
||||
CPMAddPackage("gh:cpm-cmake/testpack-fibonacci@2.0")
|
||||
|
||||
CPMAddPackage(
|
||||
NAME benchmark
|
||||
GITHUB_REPOSITORY google/benchmark
|
||||
VERSION 1.5.0
|
||||
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,14 +1,13 @@
|
||||
#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);
|
||||
@@ -18,7 +17,7 @@ std::vector<unsigned> createTestNumbers(){
|
||||
void fibonacci(benchmark::State& state) {
|
||||
auto numbers = createTestNumbers();
|
||||
for (auto _ : state) {
|
||||
for (auto v: numbers) benchmark::DoNotOptimize(fibonacci(v));
|
||||
for (auto v : numbers) benchmark::DoNotOptimize(fibonacci(v));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,7 +26,7 @@ BENCHMARK(fibonacci);
|
||||
void fastFibonacci(benchmark::State& state) {
|
||||
auto numbers = createTestNumbers();
|
||||
for (auto _ : state) {
|
||||
for (auto v: numbers) benchmark::DoNotOptimize(fastFibonacci(v));
|
||||
for (auto v : numbers) benchmark::DoNotOptimize(fastFibonacci(v));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -5,17 +5,15 @@ 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)
|
||||
|
||||
CPMFindPackage(
|
||||
NAME Boost
|
||||
GITHUB_REPOSITORY Orphis/boost-cmake
|
||||
VERSION 1.67.0
|
||||
FIND_PACKAGE_ARGUMENTS "COMPONENTS system"
|
||||
)
|
||||
# boost-cmake currently doesn't tag versions, so we use the according boost version
|
||||
CPMAddPackage("gh:Orphis/boost-cmake#7f97a08b64bd5d2e53e932ddf80c40544cf45edf@1.71.0")
|
||||
|
||||
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));
|
||||
|
||||
8
examples/build_all.py
Normal file → Executable file
8
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,14 +11,16 @@ 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)
|
||||
@@ -24,6 +28,6 @@ for example in examples:
|
||||
project = Path(".") / 'build' / example.name
|
||||
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('')
|
||||
|
||||
@@ -2,40 +2,20 @@ cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMExampleCatch2)
|
||||
|
||||
# ---- Options ----
|
||||
|
||||
option(ENABLE_TEST_COVERAGE "Enable test coverage" OFF)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME fibonacci
|
||||
GIT_REPOSITORY https://github.com/TheLartians/Fibonacci.git
|
||||
VERSION 2.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,9 +1,10 @@
|
||||
#define CATCH_CONFIG_MAIN
|
||||
|
||||
#include <catch2/catch.hpp>
|
||||
#include <fibonacci.h>
|
||||
|
||||
TEST_CASE("fibonacci"){
|
||||
#include <catch2/catch.hpp>
|
||||
|
||||
TEST_CASE("fibonacci") {
|
||||
REQUIRE(fibonacci(0) == 0);
|
||||
REQUIRE(fibonacci(1) == 1);
|
||||
REQUIRE(fibonacci(2) == 1);
|
||||
@@ -13,8 +14,8 @@ TEST_CASE("fibonacci"){
|
||||
REQUIRE(fibonacci(13) == 233);
|
||||
}
|
||||
|
||||
TEST_CASE("fastFibonacci"){
|
||||
for (unsigned i=0; i<25; ++i){
|
||||
TEST_CASE("fastFibonacci") {
|
||||
for (unsigned i = 0; i < 25; ++i) {
|
||||
REQUIRE(fibonacci(i) == fastFibonacci(i));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,15 +8,13 @@ include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME cereal
|
||||
VERSION 1.2.2
|
||||
VERSION 1.3.0
|
||||
GITHUB_REPOSITORY USCiLab/cereal
|
||||
OPTIONS
|
||||
"SKIP_PORTABILITY_TEST ON"
|
||||
"JUST_INSTALL_CEREAL ON"
|
||||
OPTIONS "SKIP_PORTABILITY_TEST ON" "JUST_INSTALL_CEREAL ON"
|
||||
)
|
||||
|
||||
# ---- Create binary ----
|
||||
|
||||
add_executable(CPMExampleCereal main.cpp)
|
||||
target_link_libraries(CPMExampleCereal cereal )
|
||||
set_target_properties(CPMExampleCereal PROPERTIES CXX_STANDARD 17)
|
||||
target_link_libraries(CPMExampleCereal cereal)
|
||||
target_compile_features(CPMExampleCereal PRIVATE cxx_std_17)
|
||||
|
||||
@@ -1,28 +1,20 @@
|
||||
#define CATCH_CONFIG_MAIN
|
||||
|
||||
#include <cereal/cereal.hpp>
|
||||
#include <cereal/archives/json.hpp>
|
||||
|
||||
#include <string>
|
||||
#include <cereal/cereal.hpp>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
|
||||
struct player_data
|
||||
{
|
||||
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)
|
||||
);
|
||||
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[])
|
||||
{
|
||||
int main(int argc, char const *argv[]) {
|
||||
player_data player{3, "Gamer One"};
|
||||
std::ostringstream oss;
|
||||
cereal::JSONOutputArchive output(oss);
|
||||
|
||||
@@ -2,25 +2,14 @@ cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMExampleCXXOpts)
|
||||
|
||||
# ---- Options ----
|
||||
|
||||
option(ENABLE_TEST_COVERAGE "Enable test coverage" OFF)
|
||||
|
||||
# ---- 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;
|
||||
}
|
||||
|
||||
|
||||
@@ -2,40 +2,20 @@ cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMExampleDoctest)
|
||||
|
||||
# ---- Options ----
|
||||
|
||||
option(ENABLE_TEST_COVERAGE "Enable test coverage" OFF)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME fibonacci
|
||||
GIT_REPOSITORY https://github.com/TheLartians/Fibonacci.git
|
||||
VERSION 2.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,7 +3,7 @@
|
||||
#include <doctest/doctest.h>
|
||||
#include <fibonacci.h>
|
||||
|
||||
TEST_CASE("fibonacci"){
|
||||
TEST_CASE("fibonacci") {
|
||||
CHECK(fibonacci(0) == 0);
|
||||
CHECK(fibonacci(1) == 1);
|
||||
CHECK(fibonacci(2) == 1);
|
||||
@@ -13,8 +13,8 @@ TEST_CASE("fibonacci"){
|
||||
CHECK(fibonacci(13) == 233);
|
||||
}
|
||||
|
||||
TEST_CASE("fastfibonacci"){
|
||||
for (unsigned i=0; i<25; ++i){
|
||||
TEST_CASE("fastfibonacci") {
|
||||
for (unsigned i = 0; i < 25; ++i) {
|
||||
CHECK(fibonacci(i) == fastFibonacci(i));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,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;
|
||||
}
|
||||
@@ -2,44 +2,27 @@ cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMExampleGtest)
|
||||
|
||||
# ---- Options ----
|
||||
|
||||
option(ENABLE_TEST_COVERAGE "Enable test coverage" OFF)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME fibonacci
|
||||
GIT_REPOSITORY https://github.com/TheLartians/Fibonacci.git
|
||||
VERSION 2.0
|
||||
)
|
||||
CPMAddPackage("gh:cpm-cmake/testpack-fibonacci@2.0")
|
||||
|
||||
CPMAddPackage(
|
||||
NAME googletest
|
||||
GITHUB_REPOSITORY google/googletest
|
||||
GIT_TAG release-1.8.1
|
||||
VERSION 1.8.1
|
||||
OPTIONS
|
||||
"INSTALL_GTEST OFF"
|
||||
"gtest_force_shared_crt"
|
||||
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)
|
||||
set_target_properties(CPMExampleGtest PROPERTIES CXX_STANDARD 17)
|
||||
target_compile_features(CPMExampleGtest PRIVATE cxx_std_17)
|
||||
|
||||
# ---- Enable testing ----
|
||||
|
||||
enable_testing()
|
||||
enable_testing()
|
||||
add_test(CPMExampleGtest CPMExampleGtest)
|
||||
|
||||
# ---- Add code coverage ----
|
||||
|
||||
if (${ENABLE_TEST_COVERAGE})
|
||||
set_target_properties(CPMExampleGtest PROPERTIES CXX_STANDARD 17 COMPILE_FLAGS "-O0 -g -fprofile-arcs -ftest-coverage --coverage")
|
||||
target_link_options(CPMExampleGtest PUBLIC "--coverage")
|
||||
endif()
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
#include <gtest/gtest.h>
|
||||
#include <fibonacci.h>
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
TEST(FibonacciTests, BasicChecks)
|
||||
{
|
||||
TEST(FibonacciTests, BasicChecks) {
|
||||
ASSERT_TRUE(fibonacci(0) == 0);
|
||||
ASSERT_TRUE(fibonacci(1) == 1);
|
||||
ASSERT_TRUE(fibonacci(2) == 1);
|
||||
|
||||
@@ -5,22 +5,10 @@ project(CPMJSONExample)
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME nlohmann_json
|
||||
VERSION 3.6.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
|
||||
)
|
||||
|
||||
if(nlohmann_json_ADDED)
|
||||
add_library(nlohmann_json INTERFACE)
|
||||
target_include_directories(nlohmann_json INTERFACE ${nlohmann_json_SOURCE_DIR})
|
||||
endif()
|
||||
CPMAddPackage("gh:nlohmann/json@3.9.1")
|
||||
|
||||
# ---- Executable ----
|
||||
|
||||
add_executable(CPMJSONExample "main.cpp")
|
||||
set_target_properties(CPMJSONExample PROPERTIES CXX_STANDARD 17)
|
||||
target_link_libraries(CPMJSONExample nlohmann_json)
|
||||
add_executable(CPMJSONExample main.cpp)
|
||||
target_compile_features(CPMJSONExample PRIVATE cxx_std_17)
|
||||
target_link_libraries(CPMJSONExample nlohmann_json::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;
|
||||
|
||||
|
||||
@@ -6,19 +6,15 @@ project(CPMlinenoiseExample)
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -6,21 +6,10 @@ project(CPMRangev3Example)
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME range-v3
|
||||
URL https://github.com/ericniebler/range-v3/archive/0.5.0.zip
|
||||
VERSION 0.5.0
|
||||
# the range-v3 CMakeLists screws with configuration options
|
||||
DOWNLOAD_ONLY True
|
||||
)
|
||||
|
||||
if(range-v3_ADDED)
|
||||
add_library(range-v3 INTERFACE IMPORTED)
|
||||
target_include_directories(range-v3 INTERFACE "${range-v3_SOURCE_DIR}/include")
|
||||
endif()
|
||||
CPMAddPackage("gh:ericniebler/range-v3#0.11.0")
|
||||
|
||||
# ---- 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::views::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]]
|
||||
@@ -15,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;
|
||||
|
||||
@@ -13,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
|
||||
@@ -33,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;
|
||||
}
|
||||
@@ -6,22 +6,10 @@ project(CPMYamlExample)
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME yaml-cpp
|
||||
GIT_REPOSITORY https://github.com/jbeder/yaml-cpp.git
|
||||
# 0.6.2 uses deprecated CMake syntax
|
||||
VERSION 0.6.3
|
||||
# 0.6.3 is not released yet, so use the most recent commit
|
||||
GIT_TAG 012269756149ae99745b6dafefd415843d7420bb
|
||||
OPTIONS
|
||||
"YAML_CPP_BUILD_TESTS Off"
|
||||
"YAML_CPP_BUILD_CONTRIB Off"
|
||||
"YAML_CPP_BUILD_TOOLS Off"
|
||||
)
|
||||
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;
|
||||
|
||||
@@ -8,9 +8,8 @@ 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()
|
||||
|
||||
|
||||
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)
|
||||
@@ -3,119 +3,135 @@ 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}/cache)
|
||||
set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/remote_dependency)
|
||||
|
||||
function(clear_cache)
|
||||
FILE(REMOVE_RECURSE ${CPM_SOURCE_CACHE_DIR})
|
||||
|
||||
if (EXISTS "${CPM_SOURCE_CACHE_DIR}")
|
||||
ASSERTION_FAILED("cache not cleared")
|
||||
endif()
|
||||
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}/cache/CMakeLists.txt.in"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/cache/CMakeLists.txt"
|
||||
"${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})
|
||||
file(REMOVE_RECURSE ${TEST_BUILD_DIR})
|
||||
update_cmake_lists()
|
||||
endfunction()
|
||||
|
||||
set(FIBONACCI_VERSION 1.0)
|
||||
|
||||
## Read CPM_SOURCE_CACHE from arguments
|
||||
# Read CPM_SOURCE_CACHE from arguments
|
||||
|
||||
reset_test()
|
||||
|
||||
execute_process(
|
||||
COMMAND
|
||||
${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/cache" "-B${TEST_BUILD_DIR}" "-DCPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}"
|
||||
RESULT_VARIABLE ret
|
||||
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_equal(${ret} "0")
|
||||
assert_exists("${CPM_SOURCE_CACHE_DIR}/fibonacci")
|
||||
|
||||
if (NOT EXISTS "${CPM_SOURCE_CACHE_DIR}/fibonacci")
|
||||
ASSERTION_FAILED("fibonacci not in cache")
|
||||
endif()
|
||||
|
||||
FILE(GLOB FIBONACCI_VERSIONs "${CPM_SOURCE_CACHE_DIR}/fibonacci/*")
|
||||
file(GLOB FIBONACCI_VERSIONs "${CPM_SOURCE_CACHE_DIR}/fibonacci/*")
|
||||
list(LENGTH FIBONACCI_VERSIONs FIBONACCI_VERSION_count)
|
||||
ASSERT_EQUAL(${FIBONACCI_VERSION_count} "1")
|
||||
assert_equal(${FIBONACCI_VERSION_count} "1")
|
||||
|
||||
FILE(GLOB fibonacci_versions "${CPM_SOURCE_CACHE_DIR}/fibonacci/*")
|
||||
file(GLOB fibonacci_versions "${CPM_SOURCE_CACHE_DIR}/fibonacci/*")
|
||||
list(LENGTH fibonacci_versions fibonacci_version_count)
|
||||
ASSERT_EQUAL(${fibonacci_version_count} "1")
|
||||
assert_equal(${fibonacci_version_count} "1")
|
||||
|
||||
## Update dependency and keep CPM_SOURCE_CACHE
|
||||
# Update dependency and keep CPM_SOURCE_CACHE
|
||||
|
||||
set(FIBONACCI_VERSION 2.0)
|
||||
update_cmake_lists()
|
||||
|
||||
execute_process(
|
||||
COMMAND
|
||||
${CMAKE_COMMAND} ${TEST_BUILD_DIR}
|
||||
RESULT_VARIABLE ret
|
||||
)
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} ${TEST_BUILD_DIR} RESULT_VARIABLE ret)
|
||||
|
||||
ASSERT_EQUAL(${ret} "0")
|
||||
assert_equal(${ret} "0")
|
||||
|
||||
FILE(GLOB FIBONACCI_VERSIONs "${CPM_SOURCE_CACHE_DIR}/fibonacci/*")
|
||||
file(GLOB FIBONACCI_VERSIONs "${CPM_SOURCE_CACHE_DIR}/fibonacci/*")
|
||||
list(LENGTH FIBONACCI_VERSIONs FIBONACCI_VERSION_count)
|
||||
ASSERT_EQUAL(${FIBONACCI_VERSION_count} "2")
|
||||
assert_equal(${FIBONACCI_VERSION_count} "2")
|
||||
|
||||
## Clear cache and update
|
||||
# Clear cache and update
|
||||
|
||||
clear_cache()
|
||||
|
||||
execute_process(
|
||||
COMMAND
|
||||
${CMAKE_COMMAND} ${TEST_BUILD_DIR}
|
||||
RESULT_VARIABLE ret
|
||||
)
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} ${TEST_BUILD_DIR} RESULT_VARIABLE ret)
|
||||
|
||||
ASSERT_EQUAL(${ret} "0")
|
||||
assert_equal(${ret} "0")
|
||||
assert_exists("${CPM_SOURCE_CACHE_DIR}/fibonacci")
|
||||
|
||||
if (NOT EXISTS "${CPM_SOURCE_CACHE_DIR}/fibonacci")
|
||||
ASSERTION_FAILED("fibonacci not in cache")
|
||||
endif()
|
||||
|
||||
## Read CPM_SOURCE_CACHE from environment
|
||||
# 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}/cache" "-B${TEST_BUILD_DIR}"
|
||||
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")
|
||||
assert_equal(${ret} "0")
|
||||
|
||||
if (NOT EXISTS "${CPM_SOURCE_CACHE_DIR}/fibonacci")
|
||||
ASSERTION_FAILED("fibonacci not in cache")
|
||||
endif()
|
||||
|
||||
## Overwrite CPM_SOURCE_CACHE with argument
|
||||
# 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}/cache" "-B${TEST_BUILD_DIR}" "-DCPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}"
|
||||
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_equal(${ret} "0")
|
||||
assert_exists("${CPM_SOURCE_CACHE_DIR}/fibonacci")
|
||||
|
||||
if (NOT EXISTS "${CPM_SOURCE_CACHE_DIR}/fibonacci")
|
||||
ASSERTION_FAILED("fibonacci not in cache")
|
||||
endif()
|
||||
# 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,31 +5,19 @@ 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)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME A
|
||||
VERSION 1.2.3
|
||||
)
|
||||
CPMAddPackage(NAME A VERSION 1.2.3)
|
||||
|
||||
CPMGetPackageVersion(A VERSION)
|
||||
ASSERT_EQUAL(${VERSION} "1.2.3")
|
||||
assert_equal(${VERSION} "1.2.3")
|
||||
|
||||
CPMAddPackage(
|
||||
NAME B
|
||||
VERSION 2.4.1
|
||||
)
|
||||
CPMAddPackage(NAME B VERSION 2.4.1)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME B
|
||||
GIT_TAG v2.3.1
|
||||
)
|
||||
CPMAddPackage(NAME B GIT_TAG v2.3.1)
|
||||
|
||||
CPMGetPackageVersion(B VERSION)
|
||||
ASSERT_EQUAL(${VERSION} "2.4.1")
|
||||
assert_equal(${VERSION} "2.4.1")
|
||||
|
||||
CPMAddPackage(
|
||||
NAME C
|
||||
@@ -38,4 +26,4 @@ CPMAddPackage(
|
||||
)
|
||||
|
||||
CPMGetPackageVersion(C VERSION)
|
||||
ASSERT_EQUAL(${VERSION} "3.1.2")
|
||||
assert_equal(${VERSION} "3.1.2")
|
||||
|
||||
35
test/unit/exclude_from_all.cmake
Normal file
35
test/unit/exclude_from_all.cmake
Normal file
@@ -0,0 +1,35 @@
|
||||
include(CMakePackageConfigHelpers)
|
||||
include(${CPM_PATH}/testing.cmake)
|
||||
|
||||
set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/exclude_from_all)
|
||||
|
||||
function(init_project EXCLUDE_FROM_ALL)
|
||||
configure_package_config_file(
|
||||
"${CMAKE_CURRENT_LIST_DIR}/broken_dependency/CMakeLists.txt.in"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/broken_dependency/CMakeLists.txt"
|
||||
INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/junk
|
||||
)
|
||||
|
||||
execute_process(
|
||||
COMMAND ${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/broken_dependency" "-B${TEST_BUILD_DIR}"
|
||||
RESULT_VARIABLE ret
|
||||
)
|
||||
|
||||
assert_equal(${ret} "0")
|
||||
endfunction()
|
||||
|
||||
function(build_project expected_success)
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} "--build" "${TEST_BUILD_DIR}" RESULT_VARIABLE ret)
|
||||
|
||||
if(expected_success)
|
||||
assert_equal(${ret} 0)
|
||||
else()
|
||||
assert_not_equal(${ret} 0)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
init_project(FALSE)
|
||||
build_project(FALSE)
|
||||
|
||||
init_project(TRUE)
|
||||
build_project(TRUE)
|
||||
22
test/unit/is_git_tag_commit_hash.cmake
Normal file
22
test/unit/is_git_tag_commit_hash.cmake
Normal file
@@ -0,0 +1,22 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
include(${CPM_PATH}/CPM.cmake)
|
||||
include(${CPM_PATH}/testing.cmake)
|
||||
|
||||
cpm_is_git_tag_commit_hash("v1.2.3" RESULT)
|
||||
assert_equal("0" ${RESULT})
|
||||
|
||||
cpm_is_git_tag_commit_hash("asio-1-12-1" RESULT)
|
||||
assert_equal("0" ${RESULT})
|
||||
|
||||
cpm_is_git_tag_commit_hash("513039e3cba83284cec71287fd829865b9f423bc" RESULT)
|
||||
assert_equal("1" ${RESULT})
|
||||
|
||||
cpm_is_git_tag_commit_hash("513039E3CBA83284CEC71287FD829865B9F423BC" RESULT)
|
||||
assert_equal("1" ${RESULT})
|
||||
|
||||
cpm_is_git_tag_commit_hash("513039E" RESULT)
|
||||
assert_equal("1" ${RESULT})
|
||||
|
||||
cpm_is_git_tag_commit_hash("513039E3CBA8" RESULT)
|
||||
assert_equal("1" ${RESULT})
|
||||
2
test/unit/local_dependency/.gitignore
vendored
Normal file
2
test/unit/local_dependency/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
/CMakeLists.txt
|
||||
/package-lock.cmake
|
||||
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)
|
||||
@@ -1,6 +1,6 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMExampleCatch2)
|
||||
project(CPMTest)
|
||||
|
||||
# ---- Options ----
|
||||
|
||||
@@ -9,11 +9,11 @@ option(ENABLE_TEST_COVERAGE "Enable test coverage" OFF)
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(@CPM_PATH@/CPM.cmake)
|
||||
CPMUsePackageLock(package-lock.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME Dependency
|
||||
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/dependency
|
||||
)
|
||||
@PREPARE_CODE@
|
||||
|
||||
CPMGetPackage(Dependency)
|
||||
|
||||
# ---- Call dependency method to validate correct addition of directory ----
|
||||
|
||||
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)
|
||||
71
test/unit/parse_add_package_single_arg.cmake
Normal file
71
test/unit/parse_add_package_single_arg.cmake
Normal file
@@ -0,0 +1,71 @@
|
||||
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("bb:foo/bar" args)
|
||||
assert_equal("BITBUCKET_REPOSITORY;foo/bar" "${args}")
|
||||
|
||||
cpm_parse_add_package_single_arg("bb:foo/Bar" args)
|
||||
assert_equal("BITBUCKET_REPOSITORY;foo/Bar" "${args}")
|
||||
|
||||
cpm_parse_add_package_single_arg("https://github.com/cpm-cmake/CPM.cmake.git@0.30.5" args)
|
||||
assert_equal("GIT_REPOSITORY;https://github.com/cpm-cmake/CPM.cmake.git;VERSION;0.30.5" "${args}")
|
||||
|
||||
cpm_parse_add_package_single_arg("git@host.xz:user/pkg.git@0.1.2" args)
|
||||
assert_equal("GIT_REPOSITORY;git@host.xz:user/pkg.git;VERSION;0.1.2" "${args}")
|
||||
|
||||
cpm_parse_add_package_single_arg("git@host.xz:user/pkg.git@0.1.2#rc" args)
|
||||
assert_equal("GIT_REPOSITORY;git@host.xz:user/pkg.git;VERSION;0.1.2;GIT_TAG;rc" "${args}")
|
||||
|
||||
cpm_parse_add_package_single_arg(
|
||||
"ssh://user@host.xz:123/path/to/pkg.git#fragment@1.2.3#branch" args
|
||||
)
|
||||
assert_equal(
|
||||
"GIT_REPOSITORY;ssh://user@host.xz:123/path/to/pkg.git#fragment;VERSION;1.2.3;GIT_TAG;branch"
|
||||
"${args}"
|
||||
)
|
||||
|
||||
cpm_parse_add_package_single_arg("https://example.org/foo.tar.gz" args)
|
||||
assert_equal("URL;https://example.org/foo.tar.gz" "${args}")
|
||||
|
||||
cpm_parse_add_package_single_arg("https://example.org/foo.tar.gz#baadf00d@1.2.0" args)
|
||||
assert_equal("URL;https://example.org/foo.tar.gz;URL_HASH;baadf00d;VERSION;1.2.0" "${args}")
|
||||
|
||||
cpm_parse_add_package_single_arg("https://example.org/foo.tar.gz#MD5=baadf00d" args)
|
||||
assert_equal("URL;https://example.org/foo.tar.gz;URL_HASH;MD5=baadf00d" "${args}")
|
||||
|
||||
cpm_parse_add_package_single_arg("https://example.org/Foo.zip#SHA3_512=1337" args)
|
||||
assert_equal("URL;https://example.org/Foo.zip;URL_HASH;SHA3_512=1337" "${args}")
|
||||
|
||||
cpm_parse_add_package_single_arg("ftp://user:pass@server/pathname.zip#fragment#0ddb411@0" args)
|
||||
assert_equal(
|
||||
"URL;ftp://user:pass@server/pathname.zip#fragment;URL_HASH;0ddb411;VERSION;0" "${args}"
|
||||
)
|
||||
@@ -12,8 +12,9 @@ include(@CPM_PATH@/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME fibonacci
|
||||
GIT_REPOSITORY https://github.com/TheLartians/Fibonacci.git
|
||||
GIT_REPOSITORY https://github.com/cpm-cmake/testpack-fibonacci.git
|
||||
VERSION @FIBONACCI_VERSION@
|
||||
@FIBONACCI_PACKAGE_ARGS@
|
||||
)
|
||||
|
||||
# ---- Create binary ----
|
||||
@@ -21,3 +22,11 @@ CPMAddPackage(
|
||||
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)
|
||||
@@ -1,9 +1,10 @@
|
||||
#define CATCH_CONFIG_MAIN
|
||||
|
||||
#include <fibonacci.h>
|
||||
|
||||
#include <iostream>
|
||||
|
||||
int main(){
|
||||
int main() {
|
||||
std::cout << "fib(10) = " << fastFibonacci(10) << std::endl;
|
||||
return 0;
|
||||
}
|
||||
@@ -1,19 +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}/source_dir/CMakeLists.txt.in"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/source_dir/CMakeLists.txt"
|
||||
"${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}/source_dir" "-B${TEST_BUILD_DIR}"
|
||||
COMMAND ${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/local_dependency" "-B${TEST_BUILD_DIR}"
|
||||
RESULT_VARIABLE ret
|
||||
)
|
||||
|
||||
ASSERT_EQUAL(${ret} "0")
|
||||
assert_equal(${ret} "0")
|
||||
|
||||
1
test/unit/source_dir/.gitignore
vendored
1
test/unit/source_dir/.gitignore
vendored
@@ -1 +0,0 @@
|
||||
/CMakeLists.txt
|
||||
@@ -1,4 +0,0 @@
|
||||
|
||||
function(dependency_function)
|
||||
message("called external method")
|
||||
endfunction()
|
||||
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