mirror of
https://github.com/cpm-cmake/CPM.cmake.git
synced 2025-11-17 22:58:14 -05:00
Compare commits
139 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
91ca848fec | ||
|
|
95c5426d25 | ||
|
|
cea81872cf | ||
|
|
01b69aad82 | ||
|
|
775a235880 | ||
|
|
f8d4e959bb | ||
|
|
4c7aa36dff | ||
|
|
3a4516265c | ||
|
|
47bfb554ab | ||
|
|
0a8a65df32 | ||
|
|
a2800dc96c | ||
|
|
7638be873a | ||
|
|
d1a1b70d4a | ||
|
|
4064a45552 | ||
|
|
b1855e9275 | ||
|
|
5191b4c703 | ||
|
|
8625173d8f | ||
|
|
504761fbf2 | ||
|
|
8b92bb46cd | ||
|
|
88278a4f70 | ||
|
|
72552708e6 | ||
|
|
a6bc65a76c | ||
|
|
64f5fe37cd | ||
|
|
25a9158448 | ||
|
|
1e8d8d43c7 | ||
|
|
160a665973 | ||
|
|
3d75ed06a3 | ||
|
|
1e25367c8c | ||
|
|
9d2b5818c5 | ||
|
|
49e7903e19 | ||
|
|
4d3997d408 | ||
|
|
d74bcebfe8 | ||
|
|
db3111e07e | ||
|
|
840e2e2c40 | ||
|
|
4952fd3d48 | ||
|
|
3659fa581c | ||
|
|
4aeb1215bf | ||
|
|
13559c7137 | ||
|
|
e4f1ade459 | ||
|
|
7723e56dab | ||
|
|
8287799e79 | ||
|
|
cd91713d10 | ||
|
|
4967b841ad | ||
|
|
9c2c34f487 | ||
|
|
bd9143bfa0 | ||
|
|
a4f055c7aa | ||
|
|
002cf6b64c | ||
|
|
f13c343859 | ||
|
|
bf5e9ebafb | ||
|
|
275a12f2d8 | ||
|
|
6878cf622b | ||
|
|
4f57bd4b5b | ||
|
|
bf1996b9f4 | ||
|
|
f72944e897 | ||
|
|
79cbebb4f9 | ||
|
|
d3b23be4e2 | ||
|
|
5352247b4d | ||
|
|
798e4e35bf | ||
|
|
7d6297c5c6 | ||
|
|
e0bfe05874 | ||
|
|
530fc8d42f | ||
|
|
a086f637fb | ||
|
|
5203eb6e30 | ||
|
|
7a8599cf34 | ||
|
|
bd3732706a | ||
|
|
84d6e53c65 | ||
|
|
7bbc667df1 | ||
|
|
f5050169b0 | ||
|
|
a7ab78f3bf | ||
|
|
b1ef60175a | ||
|
|
8253393c75 | ||
|
|
f9ba3f2457 | ||
|
|
77e74910bc | ||
|
|
55caef9286 | ||
|
|
f57476ee43 | ||
|
|
db4f2bf7bb | ||
|
|
8d39e34ff2 | ||
|
|
c2a413300e | ||
|
|
5177860756 | ||
|
|
5dad9d4e9d | ||
|
|
539974785e | ||
|
|
e4a0cb4980 | ||
|
|
a8ccc42f43 | ||
|
|
f92ed18514 | ||
|
|
153c196c18 | ||
|
|
d91befd7ce | ||
|
|
978c101c7e | ||
|
|
8da680df9b | ||
|
|
6943b38afb | ||
|
|
cf042cf1ac | ||
|
|
bebea37c4a | ||
|
|
137bda299d | ||
|
|
4d557d128f | ||
|
|
9021499c52 | ||
|
|
9b97b64da2 | ||
|
|
df752ed5d3 | ||
|
|
f00f5517a6 | ||
|
|
a97b32824e | ||
|
|
e558d795f9 | ||
|
|
76748fe542 | ||
|
|
e453671327 | ||
|
|
5192f713d2 | ||
|
|
282b98423a | ||
|
|
2ff0f5f58f | ||
|
|
9343f7c69a | ||
|
|
044edb1fd2 | ||
|
|
07a4d626a1 | ||
|
|
0d529f73cd | ||
|
|
96dba3b03c | ||
|
|
ba256b71c1 | ||
|
|
b3a875e2dd | ||
|
|
a582911527 | ||
|
|
0a07f53d6d | ||
|
|
b81a29b598 | ||
|
|
0adcd87add | ||
|
|
95634c30fd | ||
|
|
bf205f77b4 | ||
|
|
610448d275 | ||
|
|
dd63d9fcdb | ||
|
|
f8899a5912 | ||
|
|
48b84b8cdf | ||
|
|
d3d8a6ab4f | ||
|
|
923265e7ae | ||
|
|
f2ad294ef3 | ||
|
|
3e65078ce7 | ||
|
|
946019a336 | ||
|
|
2d95c66fa4 | ||
|
|
77a118d3ce | ||
|
|
4dee712eef | ||
|
|
3c0d201c76 | ||
|
|
4c22b73ebd | ||
|
|
50aa889be8 | ||
|
|
e4bbd6e215 | ||
|
|
e368fce6c3 | ||
|
|
f8e571e416 | ||
|
|
e565e35397 | ||
|
|
702f413801 | ||
|
|
03b2dd0cb9 | ||
|
|
4badcddc5d |
16
.github/workflows/macos.yml
vendored
Normal file
16
.github/workflows/macos.yml
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
name: MacOS
|
||||
|
||||
on: [push]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: macOS-10.14
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
|
||||
- name: run tests
|
||||
run: |
|
||||
cmake -Htest -Bbuild/test
|
||||
cmake --build build/test --target test-verbose
|
||||
20
.github/workflows/publish.yaml
vendored
Normal file
20
.github/workflows/publish.yaml
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
name: Publish
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- '*'
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Publish CPM.cmake
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Upload CPM.cmake to release
|
||||
uses: svenstaro/upload-release-action@v1-release
|
||||
with:
|
||||
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
file: cmake/CPM.cmake
|
||||
asset_name: CPM.cmake
|
||||
tag: ${{ github.ref }}
|
||||
overwrite: true
|
||||
23
.github/workflows/ubuntu.yml
vendored
Normal file
23
.github/workflows/ubuntu.yml
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
name: Ubuntu
|
||||
|
||||
on: [push]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-18.04
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
|
||||
- name: install updates
|
||||
run: |
|
||||
wget -O cmake.sh https://cmake.org/files/v3.14/cmake-3.14.0-Linux-x86_64.sh
|
||||
sudo sh cmake.sh --skip-license --exclude-subdir --prefix=/usr/local
|
||||
export PATH=/usr/local/bin:$PATH
|
||||
cmake --version
|
||||
|
||||
- name: run tests
|
||||
run: |
|
||||
cmake -Htest -Bbuild/test
|
||||
cmake --build build/test --target test-verbose
|
||||
16
.github/workflows/windows.yml
vendored
Normal file
16
.github/workflows/windows.yml
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
name: Windows
|
||||
|
||||
on: [push]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: windows-2019
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
|
||||
- name: run tests
|
||||
run: |
|
||||
cmake -Htest -Bbuild/test
|
||||
cmake --build build/test --target test-verbose
|
||||
13
.gitignore
vendored
13
.gitignore
vendored
@@ -1,10 +1,3 @@
|
||||
CMakeCache.txt
|
||||
CMakeFiles
|
||||
CMakeScripts
|
||||
Testing
|
||||
Makefile
|
||||
cmake_install.cmake
|
||||
install_manifest.txt
|
||||
compile_commands.json
|
||||
CTestTestfile.cmake
|
||||
build
|
||||
/build*
|
||||
/.vscode
|
||||
*.DS_Store
|
||||
35
.travis.yml
35
.travis.yml
@@ -1,11 +1,13 @@
|
||||
|
||||
language: cpp
|
||||
sudo: require
|
||||
dist: xenial
|
||||
|
||||
common_sources: &all_sources
|
||||
- ubuntu-toolchain-r-test
|
||||
- llvm-toolchain-trusty
|
||||
- llvm-toolchain-trusty-6.0
|
||||
|
||||
python:
|
||||
- 3.7
|
||||
|
||||
matrix:
|
||||
include:
|
||||
@@ -14,7 +16,7 @@ matrix:
|
||||
addons: &gcc8
|
||||
apt:
|
||||
sources: *all_sources
|
||||
packages:
|
||||
packages:
|
||||
- g++-8
|
||||
env:
|
||||
- MATRIX_EVAL="export CC=gcc-8; export CXX=g++-8;"
|
||||
@@ -22,11 +24,11 @@ matrix:
|
||||
- os: linux
|
||||
compiler: clang
|
||||
addons:
|
||||
apt:
|
||||
sources: *all_sources
|
||||
packages:
|
||||
- g++-8
|
||||
- clang-6.0
|
||||
apt:
|
||||
sources: *all_sources
|
||||
packages:
|
||||
- g++-8
|
||||
- clang-6.0
|
||||
env:
|
||||
- MATRIX_EVAL="export CC=clang-6.0; export CXX=clang++-6.0;"
|
||||
|
||||
@@ -34,12 +36,15 @@ 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
|
||||
- sudo sh cmake.sh --skip-license --exclude-subdir --prefix=/usr/local
|
||||
- export PATH=/usr/local/bin:$PATH
|
||||
- cmake --version
|
||||
|
||||
script:
|
||||
- cmake -Htests/simple -Bbuild/simple
|
||||
- cmake --build build/simple
|
||||
- CTEST_OUTPUT_ON_FAILURE=1 cmake --build build/simple --target test
|
||||
- cmake -Htests/complex -Bbuild/complex
|
||||
- cmake --build build/complex
|
||||
- CTEST_OUTPUT_ON_FAILURE=1 cmake --build build/complex --target test
|
||||
|
||||
# unit tests
|
||||
- cmake -Htest -Bbuild/test
|
||||
- cmake --build build/test --target test-verbose
|
||||
# build examples
|
||||
- python3 examples/build_all.py
|
||||
|
||||
280
README.md
280
README.md
@@ -1,43 +1,273 @@
|
||||
[](https://travis-ci.com/TheLartians/CPM)
|
||||
[](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)
|
||||
|
||||
# CPM
|
||||
<p align="center">
|
||||
<img src="./logo/CPM.png" height="100" />
|
||||
</p>
|
||||
|
||||
CPM is a very simple package manager written in Cmake based on the amazing [DownloadProject](https://github.com/Crascit/DownloadProject) script. It is extremely easy to use and drastically simplifies the inclusion of other Cmake-based projects from github.
|
||||
# Setup-free CMake dependency management
|
||||
|
||||
# Usage
|
||||
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.
|
||||
|
||||
To add a new dependency to your project simply add the Projects target name, the git URL and the version. If the git tag for this version does not match the pattern `v$VERSION`, then the exact branch or tag can be specified with the `GIT_TAG` argument.
|
||||
## Manage everything
|
||||
|
||||
Any downloadable project or resource can be added as a version-controlled dependency though CPM, it is not necessary to modify or package anything.
|
||||
Projects using modern CMake are automatically configured and their targets can be used immediately.
|
||||
For everything else, the targets can be created manually after the dependency has been downloaded (see the [snippets](#snippets) below for examples).
|
||||
|
||||
## 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.
|
||||
Afterwards, any targets defined in the dependency can be used directly.
|
||||
`CPMFindPackage` and `CPMAddPackage` take the following named parameters.
|
||||
|
||||
```cmake
|
||||
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
|
||||
|
||||
project(MyParser)
|
||||
|
||||
# add dependencies
|
||||
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME LarsParser
|
||||
VERSION 1.2
|
||||
GIT_REPOSITORY https://github.com/TheLartians/Parser.git
|
||||
GIT_TAG master # optional
|
||||
NAME # The unique name of the dependency (should be the exported target's name)
|
||||
VERSION # The minimum version of the dependency (optional, defaults to 0)
|
||||
OPTIONS # Configuration options passed to the dependency (optional)
|
||||
DOWNLOAD_ONLY # If set, the project is downloaded, but not configured (optional)
|
||||
[...] # Origin parameters forwarded to FetchContent_Declare, see below
|
||||
)
|
||||
```
|
||||
|
||||
The origin may be specified by a `GIT_REPOSITORY`, but other sources, such as direct URLs, are [also supported](https://cmake.org/cmake/help/v3.11/module/ExternalProject.html#external-project-definition).
|
||||
If `GIT_TAG` hasn't been explicitly specified it defaults to `v(VERSION)`, a common convention for git projects.
|
||||
On the other hand, if `VERSION` hasn't been explicitly specified, CPM can automatically identify the version from the git tag in some common cases.
|
||||
`GIT_TAG` can also be set to a specific commit or a branch name such as `master` to always download the most recent version.
|
||||
The optional argument `FIND_PACKAGE_ARGUMENTS` can be specified to a string of parameters that will be passed to `find_package` if enabled (see below).
|
||||
|
||||
After calling `CPMAddPackage` or `CPMFindPackage`, 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).
|
||||
|
||||
## Full CMakeLists Example
|
||||
|
||||
```cmake
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
# create project
|
||||
project(MyProject)
|
||||
|
||||
# add executable
|
||||
set (CMAKE_CXX_STANDARD 17)
|
||||
add_executable(my-parser my-parser.cpp)
|
||||
target_link_libraries(cpm-test LarsParser)
|
||||
add_executable(tests tests.cpp)
|
||||
|
||||
# add dependencies
|
||||
include(cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME Catch2
|
||||
GITHUB_REPOSITORY catchorg/Catch2
|
||||
VERSION 2.5.0
|
||||
)
|
||||
|
||||
# link dependencies
|
||||
target_link_libraries(tests Catch2)
|
||||
```
|
||||
|
||||
# Installation
|
||||
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.
|
||||
|
||||
To add CPM to your current project, copy the scripts in the `cmake` directory into you current project project. The command below will perform this automatically.
|
||||
## 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.
|
||||
|
||||
```bash
|
||||
wget -qO- https://github.com/TheLartians/CPM/releases/download/v0.1/cmake.zip | bsdtar -xvf-
|
||||
mkdir -p cmake
|
||||
wget -O cmake/CPM.cmake https://raw.githubusercontent.com/TheLartians/CPM.cmake/master/cmake/CPM.cmake
|
||||
```
|
||||
|
||||
# Limitations
|
||||
You can also use CMake to download CPM for you. See the [wiki](https://github.com/TheLartians/CPM/wiki/Adding-CPM) for more details.
|
||||
|
||||
- First version used: in diamond dependency graphs (e.g. `A` depends on `C`(v1.1) and `A` depends on `B` depends on `C`(v1.2)) the first added dependency will be used (in this case `C`@1.1).
|
||||
- No possibility not automatically update dependencies. To update a dependency, version numbers or git tags in the cmake scripts must be adapted manually.
|
||||
## Updating CPM
|
||||
|
||||
To update CPM to the newest version, update the script in the project's root directory, for example by running the command above.
|
||||
Dependencies using CPM will automatically use the updated script of the outermost project.
|
||||
|
||||
## Advantages
|
||||
|
||||
- **Small and reusable projects** CPM takes care of all project dependencies, allowing developers to focus on creating small, well-tested 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.
|
||||
- **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.
|
||||
- **Simple source distribution** CPM makes including projects with source files and dependencies easy, reducing the need for monolithic header files or git submodules.
|
||||
|
||||
## Limitations
|
||||
|
||||
- **No pre-built binaries** For every new 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.
|
||||
|
||||
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.
|
||||
|
||||
## Options
|
||||
|
||||
### CPM_SOURCE_CACHE
|
||||
|
||||
To avoid re-downloading dependencies, CPM has an option `CPM_SOURCE_CACHE` that can be passed to CMake as `-DCPM_SOURCE_CACHE=<path to an external download directory>`.
|
||||
This will also allow projects to be configured offline, as long as the dependencies have been added to the cache before.
|
||||
It may also be defined system-wide as an environmental variable, e.g. by exporting `CPM_SOURCE_CACHE` in your `.bashrc` or `.bash_profile`.
|
||||
|
||||
```bash
|
||||
export CPM_SOURCE_CACHE=$HOME/.cache/CPM
|
||||
```
|
||||
|
||||
Note that passing the variable as a configure option to CMake will always override the value set by the environmental variable.
|
||||
|
||||
### CPM_DOWNLOAD_ALL
|
||||
|
||||
If set, CPM will forward all calls to `CPMFindPackage` as `CPMAddPackage`.
|
||||
This is useful to create reproducible builds or to determine if the source parameters have all been set correctly.
|
||||
This can also be set as an environmental variable.
|
||||
|
||||
### CPM_USE_LOCAL_PACKAGES
|
||||
|
||||
CPM can be configured to use `find_package` to search for locally installed dependencies first by setting the CMake option `CPM_USE_LOCAL_PACKAGES`.
|
||||
If the option `CPM_LOCAL_PACKAGES_ONLY` is set, CPM will emit an error if the dependency is not found locally.
|
||||
These options can also be set as environmental variables.
|
||||
|
||||
## 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.
|
||||
|
||||
### [Catch2](https://github.com/catchorg/Catch2)
|
||||
|
||||
```cmake
|
||||
CPMAddPackage(
|
||||
NAME Catch2
|
||||
GITHUB_REPOSITORY catchorg/Catch2
|
||||
VERSION 2.5.0
|
||||
)
|
||||
```
|
||||
|
||||
### [Boost (via boost-cmake)](https://github.com/Orphis/boost-cmake)
|
||||
|
||||
```CMake
|
||||
CPMAddPackage(
|
||||
NAME boost-cmake
|
||||
GITHUB_REPOSITORY Orphis/boost-cmake
|
||||
VERSION 1.67.0
|
||||
)
|
||||
```
|
||||
|
||||
### [cxxopts](https://github.com/jarro2783/cxxopts)
|
||||
|
||||
```cmake
|
||||
CPMAddPackage(
|
||||
NAME cxxopts
|
||||
GITHUB_REPOSITORY jarro2783/cxxopts
|
||||
VERSION 2.2.0
|
||||
OPTIONS
|
||||
"CXXOPTS_BUILD_EXAMPLES Off"
|
||||
"CXXOPTS_BUILD_TESTS Off"
|
||||
)
|
||||
```
|
||||
|
||||
### [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"
|
||||
)
|
||||
```
|
||||
|
||||
### [google/benchmark](https://github.com/google/benchmark)
|
||||
|
||||
```cmake
|
||||
CPMAddPackage(
|
||||
NAME benchmark
|
||||
GITHUB_REPOSITORY google/benchmark
|
||||
VERSION 1.4.1
|
||||
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")
|
||||
endif()
|
||||
```
|
||||
|
||||
### [Lua](https://www.lua.org)
|
||||
|
||||
```cmake
|
||||
CPMAddPackage(
|
||||
NAME lua
|
||||
GIT_REPOSITORY https://github.com/lua/lua.git
|
||||
VERSION 5.3.5
|
||||
DOWNLOAD_ONLY YES
|
||||
)
|
||||
|
||||
if (lua_ADDED)
|
||||
# lua has no CMake support, so we create our own target
|
||||
|
||||
FILE(GLOB lua_sources ${lua_SOURCE_DIR}/*.c)
|
||||
add_library(lua STATIC ${lua_sources})
|
||||
|
||||
target_include_directories(lua
|
||||
PUBLIC
|
||||
$<BUILD_INTERFACE:${lua_SOURCE_DIR}>
|
||||
)
|
||||
endif()
|
||||
```
|
||||
|
||||
For a full example on using CPM to download and configure lua with sol2 see [here](examples/sol2).
|
||||
|
||||
### 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.
|
||||
|
||||
338
cmake/CPM.cmake
338
cmake/CPM.cmake
@@ -1,63 +1,329 @@
|
||||
set(_CPM_Dir "${CMAKE_CURRENT_LIST_DIR}")
|
||||
# TheLartians/CPM - A simple Git dependency manager
|
||||
# =================================================
|
||||
# See https://github.com/TheLartians/CPM for usage and update instructions.
|
||||
#
|
||||
# MIT License
|
||||
# -----------
|
||||
#[[
|
||||
Copyright (c) 2019 Lars Melchior
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
]]
|
||||
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
set(CURRENT_CPM_VERSION 0.17)
|
||||
|
||||
if(CPM_DIRECTORY)
|
||||
if(NOT ${CPM_DIRECTORY} MATCHES ${CMAKE_CURRENT_LIST_DIR})
|
||||
if (${CPM_VERSION} VERSION_LESS ${CURRENT_CPM_VERSION})
|
||||
message(AUTHOR_WARNING "${CPM_INDENT} \
|
||||
A dependency is using a more recent CPM version (${CURRENT_CPM_VERSION}) than the current project (${CPM_VERSION}). \
|
||||
It is recommended to upgrade CPM to the most recent version. \
|
||||
See https://github.com/TheLartians/CPM.cmake for more information."
|
||||
)
|
||||
endif()
|
||||
return()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
option(CPM_USE_LOCAL_PACKAGES "Always try to use `find_package` to get dependencies" $ENV{CPM_USE_LOCAL_PACKAGES})
|
||||
option(CPM_LOCAL_PACKAGES_ONLY "Only use `find_package` to get dependencies" $ENV{CPM_LOCAL_PACKAGES_ONLY})
|
||||
option(CPM_DOWNLOAD_ALL "Always download dependencies from source" $ENV{CPM_DOWNLOAD_ALL})
|
||||
|
||||
set(CPM_VERSION ${CURRENT_CPM_VERSION} CACHE INTERNAL "")
|
||||
set(CPM_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} CACHE INTERNAL "")
|
||||
set(CPM_PACKAGES "" CACHE INTERNAL "")
|
||||
set(CPM_DRY_RUN OFF CACHE INTERNAL "Don't download or configure dependencies (for testing)")
|
||||
|
||||
if(DEFINED ENV{CPM_SOURCE_CACHE})
|
||||
set(CPM_SOURCE_CACHE_DEFAULT $ENV{CPM_SOURCE_CACHE})
|
||||
else()
|
||||
set(CPM_SOURCE_CACHE_DEFAULT OFF)
|
||||
endif()
|
||||
|
||||
set(CPM_SOURCE_CACHE ${CPM_SOURCE_CACHE_DEFAULT} CACHE PATH "Directory to downlaod CPM dependencies")
|
||||
|
||||
include(FetchContent)
|
||||
include(CMakeParseArguments)
|
||||
include(${_CPM_Dir}/DownloadProject.cmake)
|
||||
|
||||
function(CPMHasPackage)
|
||||
|
||||
# Initialize logging prefix
|
||||
if(NOT CPM_INDENT)
|
||||
set(CPM_INDENT "CPM:")
|
||||
endif()
|
||||
|
||||
function(cpm_find_package NAME VERSION)
|
||||
string(REPLACE " " ";" EXTRA_ARGS "${ARGN}")
|
||||
find_package(${NAME} ${VERSION} ${EXTRA_ARGS})
|
||||
if(${CPM_ARGS_NAME}_FOUND)
|
||||
message(STATUS "${CPM_INDENT} using local package ${CPM_ARGS_NAME}@${${CPM_ARGS_NAME}_VERSION}")
|
||||
CPMRegisterPackage(${CPM_ARGS_NAME} "${${CPM_ARGS_NAME}_VERSION}")
|
||||
set(CPM_PACKAGE_FOUND YES PARENT_SCOPE)
|
||||
else()
|
||||
set(CPM_PACKAGE_FOUND NO PARENT_SCOPE)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(CPMAddPackage)
|
||||
set(options QUIET)
|
||||
|
||||
# Find a package locally or fallback to CPMAddPackage
|
||||
function(CPMFindPackage)
|
||||
set(oneValueArgs
|
||||
NAME
|
||||
GIT_REPOSITORY
|
||||
VERSION
|
||||
GIT_TAG
|
||||
BINARY_DIR
|
||||
FIND_PACKAGE_ARGUMENTS
|
||||
)
|
||||
|
||||
set(multiValueArgs "")
|
||||
|
||||
cmake_parse_arguments(CPM_ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
|
||||
|
||||
if (NOT CPM_PACKAGES)
|
||||
set(CPM_PACKAGES "")
|
||||
cmake_parse_arguments(CPM_ARGS "" "${oneValueArgs}" "" ${ARGN})
|
||||
|
||||
if (CPM_DOWNLOAD_ALL)
|
||||
CPMAddPackage(${ARGN})
|
||||
cpm_export_variables()
|
||||
return()
|
||||
endif()
|
||||
|
||||
if (NOT CPM_ARGS_BINARY_DIR)
|
||||
set(CPM_ARGS_BINARY_DIR ${CMAKE_BINARY_DIR}/CPM-projects/${CPM_ARGS_NAME})
|
||||
cpm_find_package(${CPM_ARGS_NAME} "${CPM_ARGS_VERSION}" ${CPM_ARGS_FIND_PACKAGE_ARGUMENTS})
|
||||
|
||||
if(NOT CPM_PACKAGE_FOUND)
|
||||
CPMAddPackage(${ARGN})
|
||||
cpm_export_variables()
|
||||
endif()
|
||||
|
||||
if (NOT CPM_PROJECT_DIR)
|
||||
set(CPM_PROJECT_DIR "${CPM_ARGS_BINARY_DIR}")
|
||||
endfunction()
|
||||
|
||||
# Download and add a package from source
|
||||
function(CPMAddPackage)
|
||||
|
||||
set(oneValueArgs
|
||||
NAME
|
||||
VERSION
|
||||
GIT_TAG
|
||||
DOWNLOAD_ONLY
|
||||
GITHUB_REPOSITORY
|
||||
GITLAB_REPOSITORY
|
||||
SOURCE_DIR
|
||||
DOWNLOAD_COMMAND
|
||||
FIND_PACKAGE_ARGUMENTS
|
||||
)
|
||||
|
||||
set(multiValueArgs
|
||||
OPTIONS
|
||||
)
|
||||
|
||||
cmake_parse_arguments(CPM_ARGS "" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}")
|
||||
|
||||
if(CPM_USE_LOCAL_PACKAGES OR CPM_LOCAL_PACKAGES_ONLY)
|
||||
cpm_find_package(${CPM_ARGS_NAME} "${CPM_ARGS_VERSION}" ${CPM_ARGS_FIND_PACKAGE_ARGUMENTS})
|
||||
|
||||
if(CPM_PACKAGE_FOUND)
|
||||
return()
|
||||
endif()
|
||||
|
||||
if(CPM_LOCAL_PACKAGES_ONLY)
|
||||
message(SEND_ERROR "CPM: ${CPM_ARGS_NAME} not found via find_package(${CPM_ARGS_NAME} ${CPM_ARGS_VERSION})")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (NOT CPM_ARGS_GIT_TAG)
|
||||
if (NOT DEFINED CPM_ARGS_VERSION)
|
||||
if (DEFINED CPM_ARGS_GIT_TAG)
|
||||
cpm_get_version_from_git_tag("${CPM_ARGS_GIT_TAG}" CPM_ARGS_VERSION)
|
||||
endif()
|
||||
if (NOT DEFINED CPM_ARGS_VERSION)
|
||||
set(CPM_ARGS_VERSION 0)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (NOT DEFINED CPM_ARGS_GIT_TAG)
|
||||
set(CPM_ARGS_GIT_TAG v${CPM_ARGS_VERSION})
|
||||
endif()
|
||||
|
||||
SET(CPM_TARGET_CMAKE_FILE "${CPM_PROJECT_DIR}")
|
||||
list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS GIT_TAG ${CPM_ARGS_GIT_TAG})
|
||||
|
||||
if(CPM_ARGS_DOWNLOAD_ONLY)
|
||||
set(DOWNLOAD_ONLY ${CPM_ARGS_DOWNLOAD_ONLY})
|
||||
else()
|
||||
set(DOWNLOAD_ONLY NO)
|
||||
endif()
|
||||
|
||||
if (CPM_ARGS_GITHUB_REPOSITORY)
|
||||
list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS GIT_REPOSITORY "https://github.com/${CPM_ARGS_GITHUB_REPOSITORY}.git")
|
||||
endif()
|
||||
|
||||
if (CPM_ARGS_GITLAB_REPOSITORY)
|
||||
list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS GIT_REPOSITORY "https://gitlab.com/${CPM_ARGS_GITLAB_REPOSITORY}.git")
|
||||
endif()
|
||||
|
||||
if (${CPM_ARGS_NAME} IN_LIST CPM_PACKAGES)
|
||||
message(STATUS "CPM: package ${CPM_ARGS_NAME} already added")
|
||||
CPMGetPackageVersion(${CPM_ARGS_NAME} CPM_PACKAGE_VERSION)
|
||||
if(${CPM_PACKAGE_VERSION} VERSION_LESS ${CPM_ARGS_VERSION})
|
||||
message(WARNING "${CPM_INDENT} requires a newer version of ${CPM_ARGS_NAME} (${CPM_ARGS_VERSION}) than currently included (${CPM_PACKAGE_VERSION}).")
|
||||
endif()
|
||||
if (CPM_ARGS_OPTIONS)
|
||||
foreach(OPTION ${CPM_ARGS_OPTIONS})
|
||||
cpm_parse_option(${OPTION})
|
||||
if(NOT "${${OPTION_KEY}}" STREQUAL ${OPTION_VALUE})
|
||||
message(WARNING "${CPM_INDENT} ignoring package option for ${CPM_ARGS_NAME}: ${OPTION_KEY} = ${OPTION_VALUE} (${${OPTION_KEY}})")
|
||||
endif()
|
||||
endforeach()
|
||||
endif()
|
||||
cpm_fetch_package(${CPM_ARGS_NAME} ${DOWNLOAD_ONLY})
|
||||
cpm_get_fetch_properties(${CPM_ARGS_NAME})
|
||||
SET(${CPM_ARGS_NAME}_SOURCE_DIR "${${CPM_ARGS_NAME}_SOURCE_DIR}")
|
||||
SET(${CPM_ARGS_NAME}_BINARY_DIR "${${CPM_ARGS_NAME}_BINARY_DIR}")
|
||||
SET(${CPM_ARGS_NAME}_ADDED NO)
|
||||
cpm_export_variables()
|
||||
return()
|
||||
endif()
|
||||
|
||||
CPMRegisterPackage(${CPM_ARGS_NAME} ${CPM_ARGS_VERSION})
|
||||
|
||||
if (CPM_ARGS_OPTIONS)
|
||||
foreach(OPTION ${CPM_ARGS_OPTIONS})
|
||||
cpm_parse_option(${OPTION})
|
||||
set(${OPTION_KEY} ${OPTION_VALUE} CACHE INTERNAL "")
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
set(FETCH_CONTENT_DECLARE_EXTRA_OPTS "")
|
||||
|
||||
if (DEFINED CPM_ARGS_GIT_TAG)
|
||||
set(PACKAGE_INFO "${CPM_ARGS_GIT_TAG}")
|
||||
else()
|
||||
message(STATUS "CPM: adding package ${CPM_ARGS_NAME}@${CPM_ARGS_VERSION}")
|
||||
# update package data
|
||||
LIST(APPEND CPM_PACKAGES ${CPM_ARGS_NAME})
|
||||
# save package data
|
||||
set(CPM_PACKAGES "${CPM_PACKAGES}" CACHE INTERNAL "CPM Packages")
|
||||
|
||||
configure_file(
|
||||
"${_CPM_Dir}/CPMProject.CMakeLists.cmake.in"
|
||||
"${CPM_TARGET_CMAKE_FILE}/CMakeLists.txt"
|
||||
@ONLY
|
||||
)
|
||||
set(PACKAGE_INFO "${CPM_ARGS_VERSION}")
|
||||
endif()
|
||||
|
||||
if (NOT TARGET ${CPM_ARGS_NAME})
|
||||
add_subdirectory(${CPM_TARGET_CMAKE_FILE} ${CPM_ARGS_BINARY_DIR})
|
||||
if (DEFINED CPM_ARGS_DOWNLOAD_COMMAND)
|
||||
set(FETCH_CONTENT_DECLARE_EXTRA_OPTS DOWNLOAD_COMMAND ${CPM_ARGS_DOWNLOAD_COMMAND})
|
||||
elseif(DEFINED CPM_ARGS_SOURCE_DIR)
|
||||
set(FETCH_CONTENT_DECLARE_EXTRA_OPTS SOURCE_DIR ${CPM_ARGS_SOURCE_DIR})
|
||||
elseif (CPM_SOURCE_CACHE)
|
||||
string(TOLOWER ${CPM_ARGS_NAME} lower_case_name)
|
||||
set(origin_parameters ${CPM_ARGS_UNPARSED_ARGUMENTS})
|
||||
list(SORT origin_parameters)
|
||||
string(SHA1 origin_hash "${origin_parameters}")
|
||||
set(download_directory ${CPM_SOURCE_CACHE}/${lower_case_name}/${origin_hash})
|
||||
list(APPEND FETCH_CONTENT_DECLARE_EXTRA_OPTS SOURCE_DIR ${download_directory})
|
||||
if (EXISTS ${download_directory})
|
||||
list(APPEND FETCH_CONTENT_DECLARE_EXTRA_OPTS DOWNLOAD_COMMAND ":")
|
||||
set(PACKAGE_INFO "${download_directory}")
|
||||
else()
|
||||
# remove timestamps so CMake will re-download the dependency
|
||||
file(REMOVE_RECURSE ${CMAKE_BINARY_DIR}/_deps/${lower_case_name}-subbuild)
|
||||
set(PACKAGE_INFO "${PACKAGE_INFO} -> ${download_directory}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
cpm_declare_fetch(${CPM_ARGS_NAME} ${CPM_ARGS_VERSION} ${PACKAGE_INFO} "${CPM_ARGS_UNPARSED_ARGUMENTS}" ${FETCH_CONTENT_DECLARE_EXTRA_OPTS})
|
||||
cpm_fetch_package(${CPM_ARGS_NAME} ${DOWNLOAD_ONLY})
|
||||
cpm_get_fetch_properties(${CPM_ARGS_NAME})
|
||||
SET(${CPM_ARGS_NAME}_ADDED YES)
|
||||
cpm_export_variables()
|
||||
endfunction()
|
||||
|
||||
# export variables available to the caller to the parent scope
|
||||
# expects ${CPM_ARGS_NAME} to be set
|
||||
macro(cpm_export_variables)
|
||||
SET(${CPM_ARGS_NAME}_SOURCE_DIR "${${CPM_ARGS_NAME}_SOURCE_DIR}" PARENT_SCOPE)
|
||||
SET(${CPM_ARGS_NAME}_BINARY_DIR "${${CPM_ARGS_NAME}_BINARY_DIR}" PARENT_SCOPE)
|
||||
SET(${CPM_ARGS_NAME}_ADDED "${${CPM_ARGS_NAME}_ADDED}" PARENT_SCOPE)
|
||||
endmacro()
|
||||
|
||||
# declares that a package has been added to CPM
|
||||
function(CPMRegisterPackage PACKAGE VERSION)
|
||||
list(APPEND CPM_PACKAGES ${PACKAGE})
|
||||
set(CPM_PACKAGES ${CPM_PACKAGES} CACHE INTERNAL "")
|
||||
set("CPM_PACKAGE_${PACKAGE}_VERSION" ${VERSION} CACHE INTERNAL "")
|
||||
endfunction()
|
||||
|
||||
# retrieve the current version of the package to ${OUTPUT}
|
||||
function(CPMGetPackageVersion PACKAGE OUTPUT)
|
||||
set(${OUTPUT} "${CPM_PACKAGE_${PACKAGE}_VERSION}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
# declares a package in FetchContent_Declare
|
||||
function (cpm_declare_fetch PACKAGE VERSION INFO)
|
||||
message(STATUS "${CPM_INDENT} adding package ${PACKAGE}@${VERSION} (${INFO})")
|
||||
|
||||
if (${CPM_DRY_RUN})
|
||||
message(STATUS "${CPM_INDENT} package not declared (dry run)")
|
||||
return()
|
||||
endif()
|
||||
|
||||
FetchContent_Declare(
|
||||
${PACKAGE}
|
||||
${ARGN}
|
||||
)
|
||||
endfunction()
|
||||
|
||||
# returns properties for a package previously defined by cpm_declare_fetch
|
||||
function (cpm_get_fetch_properties PACKAGE)
|
||||
if (${CPM_DRY_RUN})
|
||||
return()
|
||||
endif()
|
||||
FetchContent_GetProperties(${PACKAGE})
|
||||
string(TOLOWER ${PACKAGE} lpackage)
|
||||
SET(${PACKAGE}_SOURCE_DIR "${${lpackage}_SOURCE_DIR}" PARENT_SCOPE)
|
||||
SET(${PACKAGE}_BINARY_DIR "${${lpackage}_BINARY_DIR}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
# downloads a previously declared package via FetchContent
|
||||
function (cpm_fetch_package PACKAGE DOWNLOAD_ONLY)
|
||||
|
||||
if (${CPM_DRY_RUN})
|
||||
message(STATUS "${CPM_INDENT} package ${PACKAGE} not fetched (dry run)")
|
||||
return()
|
||||
endif()
|
||||
|
||||
set(CPM_OLD_INDENT "${CPM_INDENT}")
|
||||
set(CPM_INDENT "${CPM_INDENT} ${PACKAGE}:")
|
||||
if(${DOWNLOAD_ONLY})
|
||||
if(NOT "${PACKAGE}_POPULATED")
|
||||
FetchContent_Populate(${PACKAGE})
|
||||
endif()
|
||||
else()
|
||||
FetchContent_MakeAvailable(${PACKAGE})
|
||||
endif()
|
||||
set(CPM_INDENT "${CPM_OLD_INDENT}")
|
||||
endfunction()
|
||||
|
||||
# splits a package option
|
||||
function(cpm_parse_option OPTION)
|
||||
string(REGEX MATCH "^[^ ]+" OPTION_KEY ${OPTION})
|
||||
string(LENGTH ${OPTION} OPTION_LENGTH)
|
||||
string(LENGTH ${OPTION_KEY} OPTION_KEY_LENGTH)
|
||||
if (OPTION_KEY_LENGTH STREQUAL OPTION_LENGTH)
|
||||
# no value for key provided, assume user wants to set option to "ON"
|
||||
set(OPTION_VALUE "ON")
|
||||
else()
|
||||
math(EXPR OPTION_KEY_LENGTH "${OPTION_KEY_LENGTH}+1")
|
||||
string(SUBSTRING ${OPTION} "${OPTION_KEY_LENGTH}" "-1" OPTION_VALUE)
|
||||
endif()
|
||||
set(OPTION_KEY "${OPTION_KEY}" PARENT_SCOPE)
|
||||
set(OPTION_VALUE "${OPTION_VALUE}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
# guesses the package version from a git tag
|
||||
function(cpm_get_version_from_git_tag GIT_TAG RESULT)
|
||||
string(LENGTH ${GIT_TAG} length)
|
||||
if (length EQUAL 40)
|
||||
# GIT_TAG is probably a git hash
|
||||
SET(${RESULT} 0 PARENT_SCOPE)
|
||||
else()
|
||||
string(REGEX MATCH "v?([0123456789.]*).*" _ ${GIT_TAG})
|
||||
SET(${RESULT} ${CMAKE_MATCH_1} PARENT_SCOPE)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
|
||||
|
||||
if(TARGET @CPM_ARGS_NAME@)
|
||||
return()
|
||||
endif()
|
||||
|
||||
find_package(@CPM_ARGS_NAME@ @CPM_ARGS_VERSION@ QUIET)
|
||||
|
||||
if(${PACKAGE_FOUND})
|
||||
set_target_properties(@CPM_ARGS_NAME@
|
||||
PROPERTIES
|
||||
IMPORTED_GLOBAL True
|
||||
)
|
||||
else()
|
||||
|
||||
download_project(
|
||||
PROJ @CPM_ARGS_NAME@
|
||||
GIT_REPOSITORY @CPM_ARGS_GIT_REPOSITORY@
|
||||
GIT_TAG @CPM_ARGS_GIT_TAG@
|
||||
UPDATE_DISCONNECTED 1
|
||||
GIT_SHALLOW 1
|
||||
PREFIX @CPM_ARGS_BINARY_DIR@/dl
|
||||
QUIET
|
||||
)
|
||||
|
||||
add_subdirectory(${@CPM_ARGS_NAME@_SOURCE_DIR} ${@CPM_ARGS_NAME@_BINARY_DIR})
|
||||
endif()
|
||||
@@ -1,17 +0,0 @@
|
||||
# Distributed under the OSI-approved MIT License. See accompanying
|
||||
# file LICENSE or https://github.com/Crascit/DownloadProject for details.
|
||||
|
||||
cmake_minimum_required(VERSION 2.8.2)
|
||||
|
||||
project(${DL_ARGS_PROJ}-download NONE)
|
||||
|
||||
include(ExternalProject)
|
||||
ExternalProject_Add(${DL_ARGS_PROJ}-download
|
||||
${DL_ARGS_UNPARSED_ARGUMENTS}
|
||||
SOURCE_DIR "${DL_ARGS_SOURCE_DIR}"
|
||||
BINARY_DIR "${DL_ARGS_BINARY_DIR}"
|
||||
CONFIGURE_COMMAND ""
|
||||
BUILD_COMMAND ""
|
||||
INSTALL_COMMAND ""
|
||||
TEST_COMMAND ""
|
||||
)
|
||||
@@ -1,182 +0,0 @@
|
||||
# Distributed under the OSI-approved MIT License. See accompanying
|
||||
# file LICENSE or https://github.com/Crascit/DownloadProject for details.
|
||||
#
|
||||
# MODULE: DownloadProject
|
||||
#
|
||||
# PROVIDES:
|
||||
# download_project( PROJ projectName
|
||||
# [PREFIX prefixDir]
|
||||
# [DOWNLOAD_DIR downloadDir]
|
||||
# [SOURCE_DIR srcDir]
|
||||
# [BINARY_DIR binDir]
|
||||
# [QUIET]
|
||||
# ...
|
||||
# )
|
||||
#
|
||||
# Provides the ability to download and unpack a tarball, zip file, git repository,
|
||||
# etc. at configure time (i.e. when the cmake command is run). How the downloaded
|
||||
# and unpacked contents are used is up to the caller, but the motivating case is
|
||||
# to download source code which can then be included directly in the build with
|
||||
# add_subdirectory() after the call to download_project(). Source and build
|
||||
# directories are set up with this in mind.
|
||||
#
|
||||
# The PROJ argument is required. The projectName value will be used to construct
|
||||
# the following variables upon exit (obviously replace projectName with its actual
|
||||
# value):
|
||||
#
|
||||
# projectName_SOURCE_DIR
|
||||
# projectName_BINARY_DIR
|
||||
#
|
||||
# The SOURCE_DIR and BINARY_DIR arguments are optional and would not typically
|
||||
# need to be provided. They can be specified if you want the downloaded source
|
||||
# and build directories to be located in a specific place. The contents of
|
||||
# projectName_SOURCE_DIR and projectName_BINARY_DIR will be populated with the
|
||||
# locations used whether you provide SOURCE_DIR/BINARY_DIR or not.
|
||||
#
|
||||
# The DOWNLOAD_DIR argument does not normally need to be set. It controls the
|
||||
# location of the temporary CMake build used to perform the download.
|
||||
#
|
||||
# The PREFIX argument can be provided to change the base location of the default
|
||||
# values of DOWNLOAD_DIR, SOURCE_DIR and BINARY_DIR. If all of those three arguments
|
||||
# are provided, then PREFIX will have no effect. The default value for PREFIX is
|
||||
# CMAKE_BINARY_DIR.
|
||||
#
|
||||
# The QUIET option can be given if you do not want to show the output associated
|
||||
# with downloading the specified project.
|
||||
#
|
||||
# In addition to the above, any other options are passed through unmodified to
|
||||
# ExternalProject_Add() to perform the actual download, patch and update steps.
|
||||
# The following ExternalProject_Add() options are explicitly prohibited (they
|
||||
# are reserved for use by the download_project() command):
|
||||
#
|
||||
# CONFIGURE_COMMAND
|
||||
# BUILD_COMMAND
|
||||
# INSTALL_COMMAND
|
||||
# TEST_COMMAND
|
||||
#
|
||||
# Only those ExternalProject_Add() arguments which relate to downloading, patching
|
||||
# and updating of the project sources are intended to be used. Also note that at
|
||||
# least one set of download-related arguments are required.
|
||||
#
|
||||
# If using CMake 3.2 or later, the UPDATE_DISCONNECTED option can be used to
|
||||
# prevent a check at the remote end for changes every time CMake is run
|
||||
# after the first successful download. See the documentation of the ExternalProject
|
||||
# module for more information. It is likely you will want to use this option if it
|
||||
# is available to you. Note, however, that the ExternalProject implementation contains
|
||||
# bugs which result in incorrect handling of the UPDATE_DISCONNECTED option when
|
||||
# using the URL download method or when specifying a SOURCE_DIR with no download
|
||||
# method. Fixes for these have been created, the last of which is scheduled for
|
||||
# inclusion in CMake 3.8.0. Details can be found here:
|
||||
#
|
||||
# https://gitlab.kitware.com/cmake/cmake/commit/bdca68388bd57f8302d3c1d83d691034b7ffa70c
|
||||
# https://gitlab.kitware.com/cmake/cmake/issues/16428
|
||||
#
|
||||
# If you experience build errors related to the update step, consider avoiding
|
||||
# the use of UPDATE_DISCONNECTED.
|
||||
#
|
||||
# EXAMPLE USAGE:
|
||||
#
|
||||
# include(DownloadProject)
|
||||
# download_project(PROJ googletest
|
||||
# GIT_REPOSITORY https://github.com/google/googletest.git
|
||||
# GIT_TAG master
|
||||
# UPDATE_DISCONNECTED 1
|
||||
# QUIET
|
||||
# )
|
||||
#
|
||||
# add_subdirectory(${googletest_SOURCE_DIR} ${googletest_BINARY_DIR})
|
||||
#
|
||||
#========================================================================================
|
||||
|
||||
|
||||
set(_DownloadProjectDir "${CMAKE_CURRENT_LIST_DIR}")
|
||||
|
||||
include(CMakeParseArguments)
|
||||
|
||||
function(download_project)
|
||||
|
||||
set(options QUIET)
|
||||
set(oneValueArgs
|
||||
PROJ
|
||||
PREFIX
|
||||
DOWNLOAD_DIR
|
||||
SOURCE_DIR
|
||||
BINARY_DIR
|
||||
# Prevent the following from being passed through
|
||||
CONFIGURE_COMMAND
|
||||
BUILD_COMMAND
|
||||
INSTALL_COMMAND
|
||||
TEST_COMMAND
|
||||
)
|
||||
set(multiValueArgs "")
|
||||
|
||||
cmake_parse_arguments(DL_ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
|
||||
|
||||
# Hide output if requested
|
||||
if (DL_ARGS_QUIET)
|
||||
set(OUTPUT_QUIET "OUTPUT_QUIET")
|
||||
else()
|
||||
unset(OUTPUT_QUIET)
|
||||
message(STATUS "Downloading/updating ${DL_ARGS_PROJ}")
|
||||
endif()
|
||||
|
||||
# Set up where we will put our temporary CMakeLists.txt file and also
|
||||
# the base point below which the default source and binary dirs will be.
|
||||
# The prefix must always be an absolute path.
|
||||
if (NOT DL_ARGS_PREFIX)
|
||||
set(DL_ARGS_PREFIX "${CMAKE_BINARY_DIR}")
|
||||
else()
|
||||
get_filename_component(DL_ARGS_PREFIX "${DL_ARGS_PREFIX}" ABSOLUTE
|
||||
BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}")
|
||||
endif()
|
||||
if (NOT DL_ARGS_DOWNLOAD_DIR)
|
||||
set(DL_ARGS_DOWNLOAD_DIR "${DL_ARGS_PREFIX}/${DL_ARGS_PROJ}-download")
|
||||
endif()
|
||||
|
||||
# Ensure the caller can know where to find the source and build directories
|
||||
if (NOT DL_ARGS_SOURCE_DIR)
|
||||
set(DL_ARGS_SOURCE_DIR "${DL_ARGS_PREFIX}/${DL_ARGS_PROJ}-src")
|
||||
endif()
|
||||
if (NOT DL_ARGS_BINARY_DIR)
|
||||
set(DL_ARGS_BINARY_DIR "${DL_ARGS_PREFIX}/${DL_ARGS_PROJ}-build")
|
||||
endif()
|
||||
set(${DL_ARGS_PROJ}_SOURCE_DIR "${DL_ARGS_SOURCE_DIR}" PARENT_SCOPE)
|
||||
set(${DL_ARGS_PROJ}_BINARY_DIR "${DL_ARGS_BINARY_DIR}" PARENT_SCOPE)
|
||||
|
||||
# The way that CLion manages multiple configurations, it causes a copy of
|
||||
# the CMakeCache.txt to be copied across due to it not expecting there to
|
||||
# be a project within a project. This causes the hard-coded paths in the
|
||||
# cache to be copied and builds to fail. To mitigate this, we simply
|
||||
# remove the cache if it exists before we configure the new project. It
|
||||
# is safe to do so because it will be re-generated. Since this is only
|
||||
# executed at the configure step, it should not cause additional builds or
|
||||
# downloads.
|
||||
file(REMOVE "${DL_ARGS_DOWNLOAD_DIR}/CMakeCache.txt")
|
||||
|
||||
# Create and build a separate CMake project to carry out the download.
|
||||
# If we've already previously done these steps, they will not cause
|
||||
# anything to be updated, so extra rebuilds of the project won't occur.
|
||||
# Make sure to pass through CMAKE_MAKE_PROGRAM in case the main project
|
||||
# has this set to something not findable on the PATH.
|
||||
configure_file("${_DownloadProjectDir}/DownloadProject.CMakeLists.cmake.in"
|
||||
"${DL_ARGS_DOWNLOAD_DIR}/CMakeLists.txt")
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}"
|
||||
-D "CMAKE_MAKE_PROGRAM:FILE=${CMAKE_MAKE_PROGRAM}"
|
||||
.
|
||||
RESULT_VARIABLE result
|
||||
${OUTPUT_QUIET}
|
||||
WORKING_DIRECTORY "${DL_ARGS_DOWNLOAD_DIR}"
|
||||
)
|
||||
if(result)
|
||||
message(FATAL_ERROR "CMake step for ${DL_ARGS_PROJ} failed: ${result}")
|
||||
endif()
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} --build .
|
||||
RESULT_VARIABLE result
|
||||
${OUTPUT_QUIET}
|
||||
WORKING_DIRECTORY "${DL_ARGS_DOWNLOAD_DIR}"
|
||||
)
|
||||
if(result)
|
||||
message(FATAL_ERROR "Build step for ${DL_ARGS_PROJ} failed: ${result}")
|
||||
endif()
|
||||
|
||||
endfunction()
|
||||
22
cmake/testing.cmake
Normal file
22
cmake/testing.cmake
Normal file
@@ -0,0 +1,22 @@
|
||||
|
||||
function(ASSERT_EQUAL)
|
||||
if (NOT ARGC EQUAL 2)
|
||||
message(FATAL_ERROR "assertion failed: invalid argument count: ${ARGC}")
|
||||
endif()
|
||||
|
||||
if (NOT ${ARGV0} STREQUAL ${ARGV1})
|
||||
message(FATAL_ERROR "assertion failed: '${ARGV0}' != '${ARGV1}'")
|
||||
else()
|
||||
message(STATUS "test passed: '${ARGV0}' == '${ARGV1}'")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(ASSERT_EMPTY)
|
||||
if (NOT ARGC EQUAL 0)
|
||||
message(FATAL_ERROR "assertion failed: input ${ARGC} not empty: '${ARGV}'")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(ASSERTION_FAILED)
|
||||
message(FATAL_ERROR "assertion failed: ${ARGN}")
|
||||
endfunction()
|
||||
32
examples/benchmark/CMakeLists.txt
Normal file
32
examples/benchmark/CMakeLists.txt
Normal file
@@ -0,0 +1,32 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMExampleBenchmark)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME fibonacci
|
||||
GIT_REPOSITORY https://github.com/TheLartians/Fibonacci.git
|
||||
VERSION 2.0
|
||||
)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME benchmark
|
||||
GITHUB_REPOSITORY google/benchmark
|
||||
VERSION 1.5.0
|
||||
OPTIONS
|
||||
"BENCHMARK_ENABLE_TESTING Off"
|
||||
)
|
||||
|
||||
if (benchmark_ADDED)
|
||||
# patch google benchmark target
|
||||
set_target_properties(benchmark PROPERTIES CXX_STANDARD 17)
|
||||
endif()
|
||||
|
||||
# ---- Executable ----
|
||||
|
||||
add_executable(CPMExampleBenchmark "main.cpp")
|
||||
set_target_properties(CPMExampleBenchmark PROPERTIES CXX_STANDARD 17)
|
||||
target_link_libraries(CPMExampleBenchmark fibonacci benchmark)
|
||||
36
examples/benchmark/main.cpp
Normal file
36
examples/benchmark/main.cpp
Normal file
@@ -0,0 +1,36 @@
|
||||
#include <benchmark/benchmark.h>
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
#include <random>
|
||||
|
||||
#include <fibonacci.h>
|
||||
|
||||
|
||||
std::vector<unsigned> createTestNumbers(){
|
||||
std::vector<unsigned> v;
|
||||
for (int i=0;i<25;++i) v.emplace_back(i);
|
||||
std::random_device rd;
|
||||
std::mt19937 g(rd());
|
||||
std::shuffle(v.begin(), v.end(), g);
|
||||
return v;
|
||||
}
|
||||
|
||||
void fibonacci(benchmark::State& state) {
|
||||
auto numbers = createTestNumbers();
|
||||
for (auto _ : state) {
|
||||
for (auto v: numbers) benchmark::DoNotOptimize(fibonacci(v));
|
||||
}
|
||||
}
|
||||
|
||||
BENCHMARK(fibonacci);
|
||||
|
||||
void fastFibonacci(benchmark::State& state) {
|
||||
auto numbers = createTestNumbers();
|
||||
for (auto _ : state) {
|
||||
for (auto v: numbers) benchmark::DoNotOptimize(fastFibonacci(v));
|
||||
}
|
||||
}
|
||||
|
||||
BENCHMARK(fastFibonacci);
|
||||
|
||||
BENCHMARK_MAIN();
|
||||
21
examples/boost/CMakeLists.txt
Normal file
21
examples/boost/CMakeLists.txt
Normal file
@@ -0,0 +1,21 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMExampleBoost)
|
||||
|
||||
# ---- Create binary ----
|
||||
|
||||
add_executable(CPMExampleBoost main.cpp)
|
||||
set_target_properties(CPMExampleBoost PROPERTIES CXX_STANDARD 17)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMFindPackage(
|
||||
NAME Boost
|
||||
GITHUB_REPOSITORY Orphis/boost-cmake
|
||||
VERSION 1.67.0
|
||||
FIND_PACKAGE_ARGUMENTS "COMPONENTS system"
|
||||
)
|
||||
|
||||
target_link_libraries(CPMExampleBoost PRIVATE Boost::system pthread)
|
||||
30
examples/boost/main.cpp
Normal file
30
examples/boost/main.cpp
Normal file
@@ -0,0 +1,30 @@
|
||||
//
|
||||
// timer.cpp
|
||||
// ~~~~~~~~~
|
||||
//
|
||||
// Copyright (c) 2003-2016 Christopher M. Kohlhoff (chris at kohlhoff dot com)
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||
// 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>
|
||||
|
||||
void print(const boost::system::error_code& /*e*/)
|
||||
{
|
||||
std::cout << "Hello, world!" << std::endl;
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
boost::asio::io_service io;
|
||||
|
||||
boost::asio::deadline_timer t(io, boost::posix_time::seconds(1));
|
||||
t.async_wait(&print);
|
||||
|
||||
io.run();
|
||||
|
||||
return 0;
|
||||
}
|
||||
29
examples/build_all.py
Executable file
29
examples/build_all.py
Executable file
@@ -0,0 +1,29 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
from pathlib import Path
|
||||
from subprocess import PIPE, run
|
||||
|
||||
examples = [
|
||||
x for x in Path(__file__).parent.iterdir() if x.is_dir() and (x / 'CMakeLists.txt').exists()
|
||||
]
|
||||
|
||||
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 '))
|
||||
exit(result.returncode)
|
||||
return result.stdout
|
||||
|
||||
print('')
|
||||
for example in examples:
|
||||
print("running example %s" % example.name)
|
||||
print("================" + ('=' * len(example.name)))
|
||||
project = Path(".") / 'build' / example.name
|
||||
configure = runCommand('cmake -H%s -B%s' % (example, project))
|
||||
print(' ' + '\n '.join([line for line in configure.split('\n') if 'CPM:' in line]))
|
||||
build = runCommand('cmake --build %s -j4' % (project))
|
||||
print(' ' + '\n '.join([line for line in build.split('\n') if 'Built target' in line]))
|
||||
print('')
|
||||
41
examples/catch2/CMakeLists.txt
Normal file
41
examples/catch2/CMakeLists.txt
Normal file
@@ -0,0 +1,41 @@
|
||||
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
|
||||
)
|
||||
|
||||
# ---- 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")
|
||||
|
||||
# ---- 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()
|
||||
20
examples/catch2/main.cpp
Normal file
20
examples/catch2/main.cpp
Normal file
@@ -0,0 +1,20 @@
|
||||
#define CATCH_CONFIG_MAIN
|
||||
|
||||
#include <catch2/catch.hpp>
|
||||
#include <fibonacci.h>
|
||||
|
||||
TEST_CASE("fibonacci"){
|
||||
REQUIRE(fibonacci(0) == 0);
|
||||
REQUIRE(fibonacci(1) == 1);
|
||||
REQUIRE(fibonacci(2) == 1);
|
||||
REQUIRE(fibonacci(3) == 2);
|
||||
REQUIRE(fibonacci(4) == 3);
|
||||
REQUIRE(fibonacci(5) == 5);
|
||||
REQUIRE(fibonacci(13) == 233);
|
||||
}
|
||||
|
||||
TEST_CASE("fastFibonacci"){
|
||||
for (unsigned i=0; i<25; ++i){
|
||||
REQUIRE(fibonacci(i) == fastFibonacci(i));
|
||||
}
|
||||
}
|
||||
22
examples/cereal/CMakeLists.txt
Normal file
22
examples/cereal/CMakeLists.txt
Normal file
@@ -0,0 +1,22 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMExampleCereal)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME cereal
|
||||
VERSION 1.2.2
|
||||
GITHUB_REPOSITORY USCiLab/cereal
|
||||
OPTIONS
|
||||
"SKIP_PORTABILITY_TEST ON"
|
||||
"JUST_INSTALL_CEREAL ON"
|
||||
)
|
||||
|
||||
# ---- Create binary ----
|
||||
|
||||
add_executable(CPMExampleCereal main.cpp)
|
||||
target_link_libraries(CPMExampleCereal cereal )
|
||||
set_target_properties(CPMExampleCereal PROPERTIES CXX_STANDARD 17)
|
||||
34
examples/cereal/main.cpp
Normal file
34
examples/cereal/main.cpp
Normal file
@@ -0,0 +1,34 @@
|
||||
#define CATCH_CONFIG_MAIN
|
||||
|
||||
#include <cereal/cereal.hpp>
|
||||
#include <cereal/archives/json.hpp>
|
||||
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
|
||||
struct player_data
|
||||
{
|
||||
int id{-1};
|
||||
std::string name{};
|
||||
};
|
||||
|
||||
template<typename Archive>
|
||||
void serialize(Archive& archive, player_data const &data)
|
||||
{
|
||||
archive(
|
||||
cereal::make_nvp("id", data.id),
|
||||
cereal::make_nvp("name", data.name)
|
||||
);
|
||||
}
|
||||
|
||||
int main(int argc, char const *argv[])
|
||||
{
|
||||
player_data player{3, "Gamer One"};
|
||||
std::ostringstream oss;
|
||||
cereal::JSONOutputArchive output(oss);
|
||||
output(cereal::make_nvp("player_data", player));
|
||||
|
||||
std::cout << oss.str() << std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
26
examples/cxxopts/CMakeLists.txt
Normal file
26
examples/cxxopts/CMakeLists.txt
Normal file
@@ -0,0 +1,26 @@
|
||||
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"
|
||||
)
|
||||
|
||||
# ---- 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")
|
||||
23
examples/cxxopts/main.cpp
Normal file
23
examples/cxxopts/main.cpp
Normal file
@@ -0,0 +1,23 @@
|
||||
#include <cxxopts.hpp>
|
||||
#include <iostream>
|
||||
|
||||
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>());
|
||||
|
||||
auto result = options.parse(argc, argv);
|
||||
|
||||
if (result["help"].as<bool>()) {
|
||||
std::cout << options.help() << std::endl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (auto arg: result.arguments()) {
|
||||
std::cout << "option: " << arg.key() << ": " << arg.value() << std::endl;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
41
examples/doctest/CMakeLists.txt
Normal file
41
examples/doctest/CMakeLists.txt
Normal file
@@ -0,0 +1,41 @@
|
||||
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
|
||||
)
|
||||
|
||||
# ---- 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")
|
||||
|
||||
# ---- 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()
|
||||
20
examples/doctest/main.cpp
Normal file
20
examples/doctest/main.cpp
Normal file
@@ -0,0 +1,20 @@
|
||||
#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
|
||||
|
||||
#include <doctest/doctest.h>
|
||||
#include <fibonacci.h>
|
||||
|
||||
TEST_CASE("fibonacci"){
|
||||
CHECK(fibonacci(0) == 0);
|
||||
CHECK(fibonacci(1) == 1);
|
||||
CHECK(fibonacci(2) == 1);
|
||||
CHECK(fibonacci(3) == 2);
|
||||
CHECK(fibonacci(4) == 3);
|
||||
CHECK(fibonacci(5) == 5);
|
||||
CHECK(fibonacci(13) == 233);
|
||||
}
|
||||
|
||||
TEST_CASE("fastfibonacci"){
|
||||
for (unsigned i=0; i<25; ++i){
|
||||
CHECK(fibonacci(i) == fastFibonacci(i));
|
||||
}
|
||||
}
|
||||
26
examples/entt/CMakeLists.txt
Normal file
26
examples/entt/CMakeLists.txt
Normal file
@@ -0,0 +1,26 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMEnTTExample)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME EnTT
|
||||
VERSION 3.1.1
|
||||
GITHUB_REPOSITORY skypjack/entt
|
||||
# EnTT's CMakeLists screws with configuration options
|
||||
DOWNLOAD_ONLY True
|
||||
)
|
||||
|
||||
if (EnTT_ADDED)
|
||||
add_library(EnTT INTERFACE)
|
||||
target_include_directories(EnTT INTERFACE ${EnTT_SOURCE_DIR}/src)
|
||||
endif()
|
||||
|
||||
# ---- Executable ----
|
||||
|
||||
add_executable(CPMEnTTExample "main.cpp")
|
||||
set_target_properties(CPMEnTTExample PROPERTIES CXX_STANDARD 17)
|
||||
target_link_libraries(CPMEnTTExample EnTT)
|
||||
54
examples/entt/main.cpp
Normal file
54
examples/entt/main.cpp
Normal file
@@ -0,0 +1,54 @@
|
||||
#include <entt/entt.hpp>
|
||||
#include <cstdint>
|
||||
|
||||
struct position {
|
||||
float x;
|
||||
float y;
|
||||
};
|
||||
|
||||
struct velocity {
|
||||
float dx;
|
||||
float dy;
|
||||
};
|
||||
|
||||
void update(entt::registry ®istry) {
|
||||
auto view = registry.view<position, velocity>();
|
||||
|
||||
for(auto entity: view) {
|
||||
// gets only the components that are going to be used ...
|
||||
|
||||
auto &vel = view.get<velocity>(entity);
|
||||
|
||||
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 ...
|
||||
|
||||
pos.x += vel.dx * dt;
|
||||
pos.y += vel.dy * dt;
|
||||
|
||||
// ...
|
||||
});
|
||||
}
|
||||
|
||||
int main() {
|
||||
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); }
|
||||
}
|
||||
|
||||
update(dt, registry);
|
||||
update(registry);
|
||||
|
||||
// ...
|
||||
}
|
||||
19
examples/fmt/CMakeLists.txt
Normal file
19
examples/fmt/CMakeLists.txt
Normal file
@@ -0,0 +1,19 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMJSONExample)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME fmt
|
||||
GIT_TAG 6.1.2
|
||||
GITHUB_REPOSITORY fmtlib/fmt
|
||||
)
|
||||
|
||||
# ---- Executable ----
|
||||
|
||||
add_executable(CPMFmtExample "main.cpp")
|
||||
set_target_properties(CPMFmtExample PROPERTIES CXX_STANDARD 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;
|
||||
}
|
||||
45
examples/gtest/CMakeLists.txt
Normal file
45
examples/gtest/CMakeLists.txt
Normal file
@@ -0,0 +1,45 @@
|
||||
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(
|
||||
NAME googletest
|
||||
GITHUB_REPOSITORY google/googletest
|
||||
GIT_TAG release-1.8.1
|
||||
VERSION 1.8.1
|
||||
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)
|
||||
|
||||
# ---- 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()
|
||||
13
examples/gtest/main.cpp
Normal file
13
examples/gtest/main.cpp
Normal file
@@ -0,0 +1,13 @@
|
||||
#include <gtest/gtest.h>
|
||||
#include <fibonacci.h>
|
||||
|
||||
TEST(FibonacciTests, BasicChecks)
|
||||
{
|
||||
ASSERT_TRUE(fibonacci(0) == 0);
|
||||
ASSERT_TRUE(fibonacci(1) == 1);
|
||||
ASSERT_TRUE(fibonacci(2) == 1);
|
||||
ASSERT_TRUE(fibonacci(3) == 2);
|
||||
ASSERT_TRUE(fibonacci(4) == 3);
|
||||
ASSERT_TRUE(fibonacci(5) == 5);
|
||||
ASSERT_TRUE(fibonacci(13) == 233);
|
||||
}
|
||||
26
examples/json/CMakeLists.txt
Normal file
26
examples/json/CMakeLists.txt
Normal file
@@ -0,0 +1,26 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMJSONExample)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME nlohmann_json
|
||||
VERSION 3.6.1
|
||||
# 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()
|
||||
|
||||
# ---- Executable ----
|
||||
|
||||
add_executable(CPMJSONExample "main.cpp")
|
||||
set_target_properties(CPMJSONExample PROPERTIES CXX_STANDARD 17)
|
||||
target_link_libraries(CPMJSONExample nlohmann_json)
|
||||
25
examples/json/main.cpp
Normal file
25
examples/json/main.cpp
Normal file
@@ -0,0 +1,25 @@
|
||||
#include <nlohmann/json.hpp>
|
||||
#include <iostream>
|
||||
#include <iomanip>
|
||||
|
||||
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;
|
||||
|
||||
return 0;
|
||||
}
|
||||
24
examples/linenoise/CMakeLists.txt
Normal file
24
examples/linenoise/CMakeLists.txt
Normal file
@@ -0,0 +1,24 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMlinenoiseExample)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME linenoise
|
||||
GIT_TAG 1.0
|
||||
GITHUB_REPOSITORY antirez/linenoise
|
||||
)
|
||||
|
||||
if(linenoise_ADDED)
|
||||
add_library(linenoise ${linenoise_SOURCE_DIR}/linenoise.c)
|
||||
target_include_directories(linenoise PUBLIC ${linenoise_SOURCE_DIR})
|
||||
endif()
|
||||
|
||||
# ---- Executable ----
|
||||
|
||||
add_executable(CPMlinenoiseExample "main.cpp")
|
||||
set_target_properties(CPMlinenoiseExample PROPERTIES CXX_STANDARD 17)
|
||||
target_link_libraries(CPMlinenoiseExample linenoise)
|
||||
64
examples/linenoise/main.cpp
Normal file
64
examples/linenoise/main.cpp
Normal file
@@ -0,0 +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");
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
/* 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 */
|
||||
|
||||
/* 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);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
26
examples/range-v3/CMakeLists.txt
Normal file
26
examples/range-v3/CMakeLists.txt
Normal file
@@ -0,0 +1,26 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMRangev3Example)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME range-v3
|
||||
URL https://github.com/ericniebler/range-v3/archive/0.5.0.zip
|
||||
VERSION 0.5.0
|
||||
# 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()
|
||||
|
||||
# ---- Executable ----
|
||||
|
||||
add_executable(CPMRangev3Example "main.cpp")
|
||||
set_target_properties(CPMRangev3Example PROPERTIES CXX_STANDARD 17)
|
||||
target_link_libraries(CPMRangev3Example range-v3)
|
||||
44
examples/range-v3/main.cpp
Normal file
44
examples/range-v3/main.cpp
Normal file
@@ -0,0 +1,44 @@
|
||||
// Range v3 library
|
||||
//
|
||||
// Copyright Jeff Garland 2017
|
||||
//
|
||||
// Use, modification and distribution is subject to the
|
||||
// Boost Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
//
|
||||
// Project home: https://github.com/ericniebler/range-v3
|
||||
//
|
||||
|
||||
//[any_all_none_of]]
|
||||
// Demonstrates any_of, all_of, none_of
|
||||
// output
|
||||
// vector: [6,2,3,4,5,6]
|
||||
// vector any_of is_six: true
|
||||
// vector all_of is_six: false
|
||||
// vector none_of is_six: false
|
||||
|
||||
#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';
|
||||
|
||||
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]]
|
||||
26
examples/simple_match/CMakeLists.txt
Normal file
26
examples/simple_match/CMakeLists.txt
Normal file
@@ -0,0 +1,26 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMSimpleMatchExample)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME simple_match
|
||||
GIT_REPOSITORY https://github.com/jbandela/simple_match.git
|
||||
GIT_TAG a3ab17f3d98db302de68ad85ed399a42ae41889e
|
||||
DOWNLOAD_ONLY True
|
||||
)
|
||||
|
||||
if(simple_match_ADDED)
|
||||
add_library(simple_match INTERFACE IMPORTED)
|
||||
target_include_directories(simple_match INTERFACE "${simple_match_SOURCE_DIR}/include")
|
||||
endif()
|
||||
|
||||
# ---- Executable ----
|
||||
|
||||
add_executable(CPMSimpleMatchExample "main.cpp")
|
||||
set_target_properties(CPMSimpleMatchExample PROPERTIES CXX_STANDARD 17)
|
||||
target_link_libraries(CPMSimpleMatchExample simple_match)
|
||||
|
||||
34
examples/simple_match/main.cpp
Normal file
34
examples/simple_match/main.cpp
Normal file
@@ -0,0 +1,34 @@
|
||||
#include <simple_match/simple_match.hpp>
|
||||
|
||||
#include <iostream>
|
||||
|
||||
int main(int argc, char ** argv){
|
||||
using namespace simple_match;
|
||||
using namespace simple_match::placeholders;
|
||||
|
||||
std::string input;
|
||||
std::cout << "please enter a number or 'quit' to exit" << std::endl;
|
||||
|
||||
while (true) {
|
||||
std::cout << "> ";
|
||||
std::getline(std::cin, input);
|
||||
if (input == "quit") { break; }
|
||||
int x;
|
||||
try {
|
||||
x = std::stoi(input);
|
||||
} 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"; }
|
||||
);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
47
examples/sol2/CMakeLists.txt
Normal file
47
examples/sol2/CMakeLists.txt
Normal file
@@ -0,0 +1,47 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMSol2Example)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME lua
|
||||
GIT_REPOSITORY https://github.com/lua/lua.git
|
||||
VERSION 5.3.5
|
||||
DOWNLOAD_ONLY YES
|
||||
)
|
||||
|
||||
if (lua_ADDED)
|
||||
# lua has no CMakeLists, so we create our own target
|
||||
|
||||
FILE(GLOB lua_sources ${lua_SOURCE_DIR}/*.c)
|
||||
add_library(lua STATIC ${lua_sources})
|
||||
|
||||
target_include_directories(lua
|
||||
PUBLIC
|
||||
$<BUILD_INTERFACE:${lua_SOURCE_DIR}>
|
||||
)
|
||||
endif()
|
||||
|
||||
|
||||
CPMAddPackage(
|
||||
NAME sol2
|
||||
URL https://github.com/ThePhD/sol2/archive/v3.0.2.zip
|
||||
VERSION 3.0.2
|
||||
DOWNLOAD_ONLY YES
|
||||
)
|
||||
|
||||
if (sol2_ADDED)
|
||||
add_library(sol2 INTERFACE IMPORTED)
|
||||
target_include_directories(sol2 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)
|
||||
target_link_libraries(CPMSol2Example sol2)
|
||||
|
||||
16
examples/sol2/main.cpp
Normal file
16
examples/sol2/main.cpp
Normal file
@@ -0,0 +1,16 @@
|
||||
#include <sol/sol.hpp>
|
||||
#include <cassert>
|
||||
|
||||
struct vars {
|
||||
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);
|
||||
}
|
||||
27
examples/yaml/CMakeLists.txt
Normal file
27
examples/yaml/CMakeLists.txt
Normal file
@@ -0,0 +1,27 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMYamlExample)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME yaml-cpp
|
||||
GIT_REPOSITORY https://github.com/jbeder/yaml-cpp.git
|
||||
# 0.6.2 uses deprecated CMake syntax
|
||||
VERSION 0.6.3
|
||||
# 0.6.3 is not released yet, so use the most recent commit
|
||||
GIT_TAG 012269756149ae99745b6dafefd415843d7420bb
|
||||
OPTIONS
|
||||
"YAML_CPP_BUILD_TESTS Off"
|
||||
"YAML_CPP_BUILD_CONTRIB Off"
|
||||
"YAML_CPP_BUILD_TOOLS Off"
|
||||
)
|
||||
|
||||
# ---- Executable ----
|
||||
|
||||
add_executable(CPMYamlExample "main.cpp")
|
||||
set_target_properties(CPMYamlExample PROPERTIES CXX_STANDARD 17)
|
||||
target_link_libraries(CPMYamlExample yaml-cpp)
|
||||
|
||||
14
examples/yaml/main.cpp
Normal file
14
examples/yaml/main.cpp
Normal file
@@ -0,0 +1,14 @@
|
||||
#include <yaml-cpp/yaml.h>
|
||||
#include <iostream>
|
||||
|
||||
int main(int argc, char ** argv){
|
||||
if (argc != 2) {
|
||||
std::cout << "usage: " << argv[0] << " <path to yaml file>" << std::endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
YAML::Node config = YAML::LoadFile(argv[1]);
|
||||
std::cout << "Parsed YAML:\n" << config << std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
21
examples/yaml/monsters.yaml
Normal file
21
examples/yaml/monsters.yaml
Normal file
@@ -0,0 +1,21 @@
|
||||
- name: Ogre
|
||||
position: [0, 5, 0]
|
||||
powers:
|
||||
- name: Club
|
||||
damage: 10
|
||||
- name: Fist
|
||||
damage: 8
|
||||
- name: Dragon
|
||||
position: [1, 0, 10]
|
||||
powers:
|
||||
- name: Fire Breath
|
||||
damage: 25
|
||||
- name: Claws
|
||||
damage: 15
|
||||
- name: Wizard
|
||||
position: [5, -3, 0]
|
||||
powers:
|
||||
- name: Acid Rain
|
||||
damage: 50
|
||||
- name: Staff
|
||||
damage: 3
|
||||
BIN
logo/CPM.afdesign
Normal file
BIN
logo/CPM.afdesign
Normal file
Binary file not shown.
BIN
logo/CPM.png
Normal file
BIN
logo/CPM.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 18 KiB |
17
test/CMakeLists.txt
Normal file
17
test/CMakeLists.txt
Normal file
@@ -0,0 +1,17 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMTests)
|
||||
|
||||
file(GLOB tests "${CMAKE_CURRENT_SOURCE_DIR}/unit/*.cmake")
|
||||
|
||||
enable_testing()
|
||||
|
||||
foreach(test ${tests})
|
||||
message(STATUS "adding test: ${test}")
|
||||
add_test(
|
||||
NAME ${test}
|
||||
COMMAND ${CMAKE_COMMAND} -DCPM_PATH=${CMAKE_CURRENT_SOURCE_DIR}/../cmake -P "${test}"
|
||||
)
|
||||
endforeach()
|
||||
|
||||
add_custom_target(test-verbose COMMAND ${CMAKE_CTEST_COMMAND} -C Debug --verbose)
|
||||
121
test/unit/cache.cmake
Normal file
121
test/unit/cache.cmake
Normal file
@@ -0,0 +1,121 @@
|
||||
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)
|
||||
|
||||
function(clear_cache)
|
||||
FILE(REMOVE_RECURSE ${CPM_SOURCE_CACHE_DIR})
|
||||
|
||||
if (EXISTS "${CPM_SOURCE_CACHE_DIR}")
|
||||
ASSERTION_FAILED("cache not cleared")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(update_cmake_lists)
|
||||
configure_package_config_file(
|
||||
"${CMAKE_CURRENT_LIST_DIR}/cache/CMakeLists.txt.in"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/cache/CMakeLists.txt"
|
||||
INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/junk
|
||||
)
|
||||
endfunction()
|
||||
|
||||
function(reset_test)
|
||||
clear_cache()
|
||||
FILE(REMOVE_RECURSE ${TEST_BUILD_DIR})
|
||||
update_cmake_lists()
|
||||
endfunction()
|
||||
|
||||
set(FIBONACCI_VERSION 1.0)
|
||||
|
||||
## Read CPM_SOURCE_CACHE from arguments
|
||||
|
||||
reset_test()
|
||||
|
||||
execute_process(
|
||||
COMMAND
|
||||
${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/cache" "-B${TEST_BUILD_DIR}" "-DCPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}"
|
||||
RESULT_VARIABLE ret
|
||||
)
|
||||
|
||||
ASSERT_EQUAL(${ret} "0")
|
||||
|
||||
if (NOT EXISTS "${CPM_SOURCE_CACHE_DIR}/fibonacci")
|
||||
ASSERTION_FAILED("fibonacci not in cache")
|
||||
endif()
|
||||
|
||||
FILE(GLOB FIBONACCI_VERSIONs "${CPM_SOURCE_CACHE_DIR}/fibonacci/*")
|
||||
list(LENGTH FIBONACCI_VERSIONs FIBONACCI_VERSION_count)
|
||||
ASSERT_EQUAL(${FIBONACCI_VERSION_count} "1")
|
||||
|
||||
FILE(GLOB fibonacci_versions "${CPM_SOURCE_CACHE_DIR}/fibonacci/*")
|
||||
list(LENGTH fibonacci_versions fibonacci_version_count)
|
||||
ASSERT_EQUAL(${fibonacci_version_count} "1")
|
||||
|
||||
## Update dependency and keep CPM_SOURCE_CACHE
|
||||
|
||||
set(FIBONACCI_VERSION 2.0)
|
||||
update_cmake_lists()
|
||||
|
||||
execute_process(
|
||||
COMMAND
|
||||
${CMAKE_COMMAND} ${TEST_BUILD_DIR}
|
||||
RESULT_VARIABLE ret
|
||||
)
|
||||
|
||||
ASSERT_EQUAL(${ret} "0")
|
||||
|
||||
FILE(GLOB FIBONACCI_VERSIONs "${CPM_SOURCE_CACHE_DIR}/fibonacci/*")
|
||||
list(LENGTH FIBONACCI_VERSIONs FIBONACCI_VERSION_count)
|
||||
ASSERT_EQUAL(${FIBONACCI_VERSION_count} "2")
|
||||
|
||||
## Clear cache and update
|
||||
|
||||
clear_cache()
|
||||
|
||||
execute_process(
|
||||
COMMAND
|
||||
${CMAKE_COMMAND} ${TEST_BUILD_DIR}
|
||||
RESULT_VARIABLE ret
|
||||
)
|
||||
|
||||
ASSERT_EQUAL(${ret} "0")
|
||||
|
||||
if (NOT EXISTS "${CPM_SOURCE_CACHE_DIR}/fibonacci")
|
||||
ASSERTION_FAILED("fibonacci not in cache")
|
||||
endif()
|
||||
|
||||
## 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}"
|
||||
RESULT_VARIABLE ret
|
||||
)
|
||||
|
||||
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
|
||||
|
||||
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}"
|
||||
RESULT_VARIABLE ret
|
||||
)
|
||||
|
||||
ASSERT_EQUAL(${ret} "0")
|
||||
|
||||
if (NOT EXISTS "${CPM_SOURCE_CACHE_DIR}/fibonacci")
|
||||
ASSERTION_FAILED("fibonacci not in cache")
|
||||
endif()
|
||||
1
test/unit/cache/.gitignore
vendored
Normal file
1
test/unit/cache/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/CMakeLists.txt
|
||||
23
test/unit/cache/CMakeLists.txt.in
vendored
Normal file
23
test/unit/cache/CMakeLists.txt.in
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMExampleCatch2)
|
||||
|
||||
# ---- Options ----
|
||||
|
||||
option(ENABLE_TEST_COVERAGE "Enable test coverage" OFF)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(@CPM_PATH@/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME fibonacci
|
||||
GIT_REPOSITORY https://github.com/TheLartians/Fibonacci.git
|
||||
VERSION @FIBONACCI_VERSION@
|
||||
)
|
||||
|
||||
# ---- Create binary ----
|
||||
|
||||
add_executable(CPMExampleCatch2 main.cpp)
|
||||
target_link_libraries(CPMExampleCatch2 fibonacci)
|
||||
set_target_properties(CPMExampleCatch2 PROPERTIES CXX_STANDARD 17 COMPILE_FLAGS "-Wall -pedantic -Wextra -Werror")
|
||||
9
test/unit/cache/main.cpp
vendored
Normal file
9
test/unit/cache/main.cpp
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
#define CATCH_CONFIG_MAIN
|
||||
|
||||
#include <fibonacci.h>
|
||||
#include <iostream>
|
||||
|
||||
int main(){
|
||||
std::cout << "fib(10) = " << fastFibonacci(10) << std::endl;
|
||||
return 0;
|
||||
}
|
||||
41
test/unit/dependency_properties.cmake
Normal file
41
test/unit/dependency_properties.cmake
Normal file
@@ -0,0 +1,41 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
include(${CPM_PATH}/CPM.cmake)
|
||||
include(${CPM_PATH}/testing.cmake)
|
||||
|
||||
set(CPM_DRY_RUN ON)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME A
|
||||
GIT_TAG 1.2.3
|
||||
)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME A
|
||||
VERSION 1.2.3
|
||||
)
|
||||
|
||||
CPMGetPackageVersion(A VERSION)
|
||||
ASSERT_EQUAL(${VERSION} "1.2.3")
|
||||
|
||||
CPMAddPackage(
|
||||
NAME B
|
||||
VERSION 2.4.1
|
||||
)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME B
|
||||
GIT_TAG v2.3.1
|
||||
)
|
||||
|
||||
CPMGetPackageVersion(B VERSION)
|
||||
ASSERT_EQUAL(${VERSION} "2.4.1")
|
||||
|
||||
CPMAddPackage(
|
||||
NAME C
|
||||
GIT_TAG v3.1.2-a
|
||||
VERSION 3.1.2
|
||||
)
|
||||
|
||||
CPMGetPackageVersion(C VERSION)
|
||||
ASSERT_EQUAL(${VERSION} "3.1.2")
|
||||
19
test/unit/source_dir.cmake
Normal file
19
test/unit/source_dir.cmake
Normal file
@@ -0,0 +1,19 @@
|
||||
|
||||
include(CMakePackageConfigHelpers)
|
||||
include(${CPM_PATH}/testing.cmake)
|
||||
|
||||
set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/source_dir)
|
||||
|
||||
configure_package_config_file(
|
||||
"${CMAKE_CURRENT_LIST_DIR}/source_dir/CMakeLists.txt.in"
|
||||
"${CMAKE_CURRENT_LIST_DIR}/source_dir/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}"
|
||||
RESULT_VARIABLE ret
|
||||
)
|
||||
|
||||
ASSERT_EQUAL(${ret} "0")
|
||||
1
test/unit/source_dir/.gitignore
vendored
Normal file
1
test/unit/source_dir/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/CMakeLists.txt
|
||||
20
test/unit/source_dir/CMakeLists.txt.in
Normal file
20
test/unit/source_dir/CMakeLists.txt.in
Normal file
@@ -0,0 +1,20 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMExampleCatch2)
|
||||
|
||||
# ---- Options ----
|
||||
|
||||
option(ENABLE_TEST_COVERAGE "Enable test coverage" OFF)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(@CPM_PATH@/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME Dependency
|
||||
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/dependency
|
||||
)
|
||||
|
||||
# ---- Call dependency method to validate correct addition of directory ----
|
||||
|
||||
dependency_function()
|
||||
4
test/unit/source_dir/dependency/CMakeLists.txt
Normal file
4
test/unit/source_dir/dependency/CMakeLists.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
|
||||
function(dependency_function)
|
||||
message("called external method")
|
||||
endfunction()
|
||||
16
test/unit/version_from_git_tag.cmake
Normal file
16
test/unit/version_from_git_tag.cmake
Normal file
@@ -0,0 +1,16 @@
|
||||
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("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("v1.2.3-a" VERSION)
|
||||
ASSERT_EQUAL("1.2.3" ${VERSION})
|
||||
@@ -1,41 +0,0 @@
|
||||
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
|
||||
|
||||
project(CPMTest)
|
||||
|
||||
include(${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME LHC
|
||||
GIT_REPOSITORY https://github.com/TheLartians/LHC.git
|
||||
VERSION 0.3
|
||||
)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME LarsEvent
|
||||
GIT_REPOSITORY https://github.com/TheLartians/Event.git
|
||||
VERSION 1.0
|
||||
GIT_TAG master
|
||||
)
|
||||
|
||||
# Add project that depends on previous project
|
||||
CPMAddPackage(
|
||||
NAME LarsParser
|
||||
GIT_REPOSITORY https://github.com/TheLartians/Parser.git
|
||||
VERSION 1.3
|
||||
)
|
||||
|
||||
# add project twice
|
||||
CPMAddPackage(
|
||||
NAME LHC
|
||||
GIT_REPOSITORY https://github.com/TheLartians/LHC.git
|
||||
VERSION 0.3
|
||||
)
|
||||
|
||||
# add executable
|
||||
set (CMAKE_CXX_STANDARD 17)
|
||||
add_executable(cpm-test test.cpp)
|
||||
target_link_libraries(cpm-test LHC LarsEvent LarsParser)
|
||||
|
||||
# tests
|
||||
enable_testing()
|
||||
add_test(cpm-test cpm-test)
|
||||
@@ -1,32 +0,0 @@
|
||||
#include <lars/parser_generator.h>
|
||||
#include <lars/event.h>
|
||||
|
||||
int main() {
|
||||
// Define the return value
|
||||
int result = 1;
|
||||
|
||||
// Define grammar and evaluation rules
|
||||
lars::ParserGenerator<float> g;
|
||||
g.setSeparator(g["Whitespace"] << "[\t ]");
|
||||
g["Sum" ] << "Add | Subtract | Product";
|
||||
g["Product" ] << "Multiply | Divide | Atomic";
|
||||
g["Atomic" ] << "Number | '(' Sum ')'";
|
||||
g["Add" ] << "Sum '+' Product" >> [](auto e){ return e[0].evaluate() + e[1].evaluate(); };
|
||||
g["Subtract"] << "Sum '-' Product" >> [](auto e){ return e[0].evaluate() - e[1].evaluate(); };
|
||||
g["Multiply"] << "Product '*' Atomic" >> [](auto e){ return e[0].evaluate() * e[1].evaluate(); };
|
||||
g["Divide" ] << "Product '/' Atomic" >> [](auto e){ return e[0].evaluate() / e[1].evaluate(); };
|
||||
g["Number" ] << "'-'? [0-9]+ ('.' [0-9]+)?" >> [](auto e){ return stof(e.string()); };
|
||||
g.setStart(g["Sum"]);
|
||||
|
||||
// Execute a string
|
||||
|
||||
// create an event
|
||||
lars::Event<float> onResult;
|
||||
onResult.connect([&](float v){ result = !(int(v) == 5); });
|
||||
|
||||
// emit the result of a parsed string
|
||||
onResult.notify(g.run("1 + 2 * (3+4)/2 - 3"));
|
||||
|
||||
// return the result
|
||||
return result;
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
|
||||
|
||||
project(CPMTest)
|
||||
|
||||
# add dependencies
|
||||
include(${CMAKE_CURRENT_SOURCE_DIR}/../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME LarsParser
|
||||
GIT_REPOSITORY https://github.com/TheLartians/Parser.git
|
||||
VERSION 1.3
|
||||
)
|
||||
|
||||
# add executable
|
||||
set (CMAKE_CXX_STANDARD 17)
|
||||
add_executable(cpm-test test.cpp)
|
||||
target_link_libraries(cpm-test LarsParser)
|
||||
|
||||
# tests
|
||||
enable_testing()
|
||||
add_test(cpm-test cpm-test)
|
||||
@@ -1,27 +0,0 @@
|
||||
#include <lars/parser_generator.h>
|
||||
|
||||
int main() {
|
||||
lars::ParserGenerator<float> g;
|
||||
|
||||
// Define grammar and evaluation rules
|
||||
g.setSeparator(g["Whitespace"] << "[\t ]");
|
||||
g["Sum" ] << "Add | Subtract | Product";
|
||||
g["Product" ] << "Multiply | Divide | Atomic";
|
||||
g["Atomic" ] << "Number | '(' Sum ')'";
|
||||
g["Add" ] << "Sum '+' Product" >> [](auto e){ return e[0].evaluate() + e[1].evaluate(); };
|
||||
g["Subtract"] << "Sum '-' Product" >> [](auto e){ return e[0].evaluate() - e[1].evaluate(); };
|
||||
g["Multiply"] << "Product '*' Atomic" >> [](auto e){ return e[0].evaluate() * e[1].evaluate(); };
|
||||
g["Divide" ] << "Product '/' Atomic" >> [](auto e){ return e[0].evaluate() / e[1].evaluate(); };
|
||||
g["Number" ] << "'-'? [0-9]+ ('.' [0-9]+)?" >> [](auto e){ return stof(e.string()); };
|
||||
g.setStart(g["Sum"]);
|
||||
|
||||
// Execute a string
|
||||
float result = g.run("1 + 2 * (3+4)/2 - 3");
|
||||
|
||||
// validate result
|
||||
if (result == 5) {
|
||||
return 0;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user