Compare commits

..

139 Commits

Author SHA1 Message Date
Lars Melchior
91ca848fec add github action to publish cpm on release 2020-03-16 20:15:34 +01:00
Lars Melchior
95c5426d25 remove code artifact from previous PR (#101) 2020-03-16 20:09:15 +01:00
Lars Melchior
cea81872cf Add fmt example and document version from git tag (#100)
* add VERSION_PREFIX argument

* add fmt example

* add VERSION_PREFIX note to readme

* rollback, add info about determining version from git tag

* rollback version
2020-03-16 20:00:30 +01:00
Lars Melchior
01b69aad82 add support for SOURCE_DIR argument (#97)
* add support for SOURCE_DIR argument

* simplify code

* add test

* update comment
2020-02-25 13:29:21 +01:00
Lars Melchior
775a235880 default to "ON" for options without explicit value definition (#96)
* default to "ON" for options without explicit value definition

* increment CPM version

* compare the correct lengths
2020-02-06 11:50:55 +01:00
Lars Melchior
f8d4e959bb abort when nested (bugfix) (#94)
* abort when nested (bugfix)

* update error message

* update error message
2019-10-25 20:52:22 +02:00
Lars Melchior
4c7aa36dff Update README.md 2019-10-25 16:01:47 +02:00
Lars Melchior
3a4516265c Add GitHub workflows (#93)
* add mac workflow

* rename and add windows and ubuntu workflows

* update tests

* update tests

* update travis
2019-10-24 18:14:58 +02:00
Lars Melchior
47bfb554ab reorganise source and add CPMFindPackage (#92)
* reorganise source and add CPMFindPackage

* add consistent find_package behaviour

* document CPMFindPackage

* reset examples to CPMAddPackage unless tested

* update version

* update README.md

* Update README.md
2019-10-24 15:42:25 +02:00
Lars Melchior
0a8a65df32 Update README.md (#90) 2019-10-19 15:45:19 +02:00
Lars Melchior
a2800dc96c Update for new repo name (old URLs are still valid) (#89)
* Update for new repo name (old URL is still valid)

* Update README.md
2019-10-18 11:53:36 +02:00
Lars Melchior
7638be873a Add Ccache.cmake link (#88) 2019-10-14 17:12:33 +02:00
Lars Melchior
d1a1b70d4a update readme (#87) 2019-10-14 12:55:47 +02:00
Lars Melchior
4064a45552 Add CPM_SOURCE_CACHE environmental variable support and keep existing sources (#83)
* read CPM_SOURCE_CACHE from environment

* update readme

* cleanup

* add cache tests
2019-10-10 20:13:10 +02:00
Paul T
b1855e9275 Feature/cereal example (#85)
* Added GTest (googletest) Example

The examples tests the Fibonacci library similar to the doctest example.

* Add Example for the cereal library.

* Update examples/cereal/CMakeLists.txt

Co-Authored-By: Lars Melchior <TheLartians@users.noreply.github.com>

* Remove Test Coverage Code

* Remove Test Coverage Option
2019-10-09 15:30:59 +02:00
Paul T
5191b4c703 Added GTest (googletest) Example (#84)
* Added GTest (googletest) Example

The examples tests the Fibonacci library similar to the doctest example.

* Update examples/gtest/CMakeLists.txt

Co-Authored-By: Lars Melchior <TheLartians@users.noreply.github.com>
2019-10-09 14:50:27 +02:00
Lars Melchior
8625173d8f add CPM_SOURCE_ROOT option (#81)
* add CPM_SOURCE_ROOT option

* update version and readme
2019-10-07 16:34:07 +02:00
Lars Melchior
504761fbf2 add EnTT example (#78) 2019-09-06 11:52:18 +02:00
Lars Melchior
8b92bb46cd Add more readme links to the wiki (#77)
* Add readme link to snippets

* Update README.md
2019-08-16 11:12:11 +02:00
Paul T
88278a4f70 Add Blurb on Including CPM (#76)
* Add Blurb on Including CPM

Added demo cmake code to auto download CPM from github.

* Remove Section in favor of including a link to a wiki page.
2019-08-15 19:34:21 +02:00
Lars Melchior
72552708e6 add linenoise (#74) 2019-07-31 13:25:58 +02:00
Lars Melchior
a6bc65a76c add cxxopts example and update lua (#73)
* add cxxopts example

* use new tags for lua

* update readme

* update readme

* update lua

* typo
2019-07-24 11:48:50 +02:00
Lars Melchior
64f5fe37cd Update README.md (#71) 2019-07-01 20:44:51 +02:00
Lars Melchior
25a9158448 Add boost example (#70)
* add unit tests

* added boost

* cleanup

* add pthread

* Update README.md
2019-07-01 20:30:21 +02:00
Lars Melchior
1e8d8d43c7 typos (#68) 2019-06-29 19:23:38 +02:00
Lars Melchior
160a665973 remove unused argument (#67) 2019-06-27 13:06:52 +02:00
Lars Melchior
3d75ed06a3 add unit tests and determine version from GIT_TAG (#66)
* add unit tests

* determine package version from git tag. closes #54.

* update readme

* bugfix

* update example

* update gitignore
2019-06-22 13:31:32 +02:00
Lars Melchior
1e25367c8c add sol2 example (#65)
* add sol2 example

* Update README.md

* Update README.md
2019-05-25 14:14:31 +02:00
Lars Melchior
9d2b5818c5 Update README.md (#64)
* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md
2019-05-24 16:34:05 +02:00
Lars Melchior
49e7903e19 Update README.md (#62) 2019-05-23 14:35:45 +02:00
Lars Melchior
4d3997d408 update logo (#61)
* update logo

* update

* update

* update

* update

* update
2019-05-23 14:17:41 +02:00
Lars Melchior
d74bcebfe8 Update README.md (#60) 2019-05-23 13:26:53 +02:00
Lars Melchior
db3111e07e update logo (#59)
* update logo

* convert to png
2019-05-23 12:47:55 +02:00
Lars Melchior
840e2e2c40 Update README.md (#58) 2019-05-23 12:25:10 +02:00
Lars Melchior
4952fd3d48 Update range v3 (#56)
* update range-v3 example as the projects CMakeLists messes up the configuration

* add comment

* add range-v3 snipplet back
2019-05-23 12:25:00 +02:00
Lars Melchior
3659fa581c Add logo (#57)
* add logo

* Update README.md

* Update README.md
2019-05-23 12:08:46 +02:00
Lars Melchior
4aeb1215bf Update README.md 2019-05-22 18:33:41 +02:00
Lars Melchior
13559c7137 Add range-v3 example (#55)
* add range-v3 example

* update Readme

* Update README.md

* Update README.md

* Update README.md
2019-05-22 14:21:54 +02:00
Lars Melchior
e4f1ade459 Update README.md 2019-05-22 10:46:48 +02:00
Lars Melchior
7723e56dab Update README.md 2019-05-22 01:32:41 +02:00
Lars Melchior
8287799e79 Update README.md 2019-05-22 01:18:07 +02:00
Lars Melchior
cd91713d10 Update README.md 2019-05-22 00:16:11 +02:00
Lars Melchior
4967b841ad Update CPM.cmake 2019-05-20 17:54:08 +02:00
Lars Melchior
9c2c34f487 Update CPM.cmake 2019-05-20 17:53:37 +02:00
Lars Melchior
bd9143bfa0 Update README.md 2019-05-20 14:52:46 +02:00
Lars Melchior
a4f055c7aa Add url shortcuts (#53)
* add github and gitlab shortcut, closes #52

* update version

* update examples and readme
2019-05-20 13:33:01 +02:00
Lars Melchior
002cf6b64c print version warning in main CPM 2019-05-20 13:03:45 +02:00
Lars Melchior
f13c343859 Update README.md 2019-05-20 11:34:35 +02:00
Lars Melchior
bf5e9ebafb Add DEPENDENCY_ADDED property (#50)
* add DEPENDENCY_ADDED property

* update examples

* Update README.md

* Update README.md

* Update CPM.cmake

* Update README.md
2019-05-20 01:52:55 +02:00
Lars Melchior
275a12f2d8 Update README.md 2019-05-19 21:48:31 +02:00
Lars Melchior
6878cf622b Update README.md 2019-05-19 21:48:11 +02:00
Lars Melchior
4f57bd4b5b Update README.md 2019-05-19 20:41:19 +02:00
Lars Melchior
bf1996b9f4 Update README.md 2019-05-19 20:39:40 +02:00
Lars Melchior
f72944e897 Update README.md 2019-05-19 20:15:30 +02:00
Lars Melchior
79cbebb4f9 Update README.md 2019-05-19 20:14:23 +02:00
Lars Melchior
d3b23be4e2 Update README.md 2019-05-19 20:04:44 +02:00
Lars Melchior
5352247b4d Update README.md 2019-05-19 19:38:32 +02:00
Lars Melchior
798e4e35bf Update README.md 2019-05-19 19:30:55 +02:00
Lars Melchior
7d6297c5c6 Update CMakeLists.txt 2019-05-19 19:04:27 +02:00
Lars Melchior
e0bfe05874 update examples 2019-05-19 19:03:56 +02:00
Lars Melchior
530fc8d42f Update README.md 2019-05-19 19:02:33 +02:00
Lars Melchior
a086f637fb Update README.md 2019-05-19 15:08:34 +02:00
Lars Melchior
5203eb6e30 Update README.md 2019-05-17 18:44:42 +02:00
Lars Melchior
7a8599cf34 Update README.md 2019-05-17 18:43:52 +02:00
Lars Melchior
bd3732706a Update README.md 2019-05-17 18:42:24 +02:00
Lars Melchior
84d6e53c65 Update README.md 2019-05-17 18:42:05 +02:00
Lars Melchior
7bbc667df1 add imported flag (#48) 2019-05-17 18:21:36 +02:00
Lars Melchior
f5050169b0 Update README.md 2019-05-17 18:15:08 +02:00
Lars Melchior
a7ab78f3bf Update README.md 2019-05-17 18:13:37 +02:00
Lars Melchior
b1ef60175a New examples (#47)
* simplify yaml build

* add simple_match
2019-05-17 18:07:31 +02:00
Lars Melchior
8253393c75 add yaml example 2019-05-17 17:32:52 +02:00
Lars Melchior
f9ba3f2457 Update README.md 2019-05-17 15:58:02 +02:00
Lars Melchior
77e74910bc Update README.md 2019-05-17 15:14:47 +02:00
Lars Melchior
55caef9286 Update README.md 2019-05-17 15:13:54 +02:00
Lars Melchior
f57476ee43 Update README.md 2019-05-17 14:50:27 +02:00
Lars Melchior
db4f2bf7bb Update README.md 2019-05-17 14:47:35 +02:00
Lars Melchior
8d39e34ff2 v0.9 (#46)
* always get properties

* update examples

* update travis

* add doctest example

* update example runner
2019-05-17 14:46:54 +02:00
Lars Melchior
c2a413300e Update README.md 2019-05-11 15:44:22 +02:00
Lars Melchior
5177860756 Update README.md 2019-05-11 15:12:06 +02:00
Lars Melchior
5dad9d4e9d update examples (#45) 2019-05-10 16:20:53 +02:00
Lars Melchior
539974785e Update README.md 2019-05-10 16:03:46 +02:00
Lars Melchior
e4a0cb4980 Update README.md 2019-05-10 13:10:48 +02:00
Lars Melchior
a8ccc42f43 Update README.md 2019-05-10 12:03:09 +02:00
Lars Melchior
f92ed18514 Update README.md 2019-05-10 09:56:57 +02:00
Lars Melchior
153c196c18 Update README.md 2019-05-10 09:56:34 +02:00
Lars Melchior
d91befd7ce Update README.md 2019-05-10 09:55:48 +02:00
Lars Melchior
978c101c7e Update README.md 2019-05-09 13:50:10 +02:00
Lars Melchior
8da680df9b Update README.md 2019-05-09 13:45:44 +02:00
Lars Melchior
6943b38afb Update README.md 2019-05-09 13:36:23 +02:00
Lars Melchior
cf042cf1ac Update README.md 2019-05-09 13:31:18 +02:00
Lars Melchior
bebea37c4a Update CPM.cmake 2019-05-09 13:29:12 +02:00
Lars Melchior
137bda299d Update CPM.cmake (#44)
* Update CPM.cmake

* Update CPM.cmake
2019-05-08 21:36:51 +02:00
Lars Melchior
4d557d128f Update README.md 2019-05-06 10:21:58 +02:00
Lars Melchior
9021499c52 Update CPM.cmake 2019-05-05 11:47:28 +02:00
Lars Melchior
9b97b64da2 Correct version output 2019-05-04 10:39:39 +02:00
Lars Melchior
df752ed5d3 Update CPM.cmake 2019-05-04 10:32:20 +02:00
Lars Melchior
f00f5517a6 Update CPM.cmake (#43)
- Increase Version to 0.8
- Add version check
- Add DOWNLOAD_ONLY option
2019-05-04 10:23:02 +02:00
Lars Melchior
a97b32824e bugfix (#42) 2019-04-28 12:17:30 +02:00
Lars Melchior
e558d795f9 Update CPM.cmake (#41) 2019-04-26 15:44:36 +02:00
Lars Melchior
76748fe542 remove Codacy badge (does not support CMake) (#40) 2019-04-24 13:10:18 +02:00
Lars Melchior
e453671327 Update README.md (#39)
* Update README.md

* Update README.md
2019-04-24 12:47:15 +02:00
Lars Melchior
5192f713d2 Default to remote packages (#38)
* Update CPM.cmake

* Update CPM.cmake

* Update README.md
2019-04-22 20:01:41 +02:00
Lars Melchior
282b98423a Update README.md (#37) 2019-04-22 19:22:23 +02:00
Lars Melchior
2ff0f5f58f Update README.md (#36) 2019-04-20 18:20:01 +02:00
Lars Melchior
9343f7c69a Update README.md (#35) 2019-04-20 12:33:24 +02:00
Lars Melchior
044edb1fd2 add origin comment (#34)
* Update CPM.cmake

* Update CPM.cmake

* add licence to script

* Update CPM.cmake

* Update CPM.cmake
2019-04-18 14:21:45 +02:00
Lars Melchior
07a4d626a1 Remove debug log (#33) 2019-04-18 13:54:43 +02:00
Lars Melchior
0d529f73cd use set_target_properties (#32) 2019-04-18 12:47:22 +02:00
Lars Melchior
96dba3b03c Update README.md (#31) 2019-04-18 12:43:54 +02:00
Lars Melchior
ba256b71c1 Update README.md (#30)
* Update README.md

* Update README.md
2019-04-18 12:35:17 +02:00
Lars Melchior
b3a875e2dd use CPM_LOCAL_PACKAGES_ONLY again (#29) 2019-04-17 22:05:59 +02:00
Lars Melchior
a582911527 Update README.md (#28) 2019-04-17 15:35:00 +02:00
Lars Melchior
0a07f53d6d Update README.md (#27) 2019-04-17 15:24:29 +02:00
Lars Melchior
b81a29b598 Update README.md (#26)
* Update README.md

* Update README.md

* Update README.md

* Update README.md
2019-04-17 15:10:48 +02:00
Lars Melchior
0adcd87add Update README.md (#25)
* Update README.md

* Update README.md

* Update README.md
2019-04-17 13:58:29 +02:00
Lars Melchior
95634c30fd only download if no options are provided (#24) 2019-04-17 13:36:08 +02:00
Lars Melchior
bf205f77b4 Update README.md (#23) 2019-04-17 13:25:48 +02:00
Lars Melchior
610448d275 Update README.md (#22) 2019-04-17 13:11:16 +02:00
Lars Melchior
dd63d9fcdb Dev (#21)
* better debug output

* update example

* update readme
2019-04-17 13:01:56 +02:00
Lars Melchior
f8899a5912 Update README.md (#19)
* Update README.md

* Update README.md

* Update README.md
2019-04-17 12:52:42 +02:00
Lars Melchior
48b84b8cdf rename examples test.cpp -> main.cpp (#20) 2019-04-16 19:57:05 +02:00
Lars Melchior
d3d8a6ab4f rename tests -> examples (#18) 2019-04-15 17:54:53 +02:00
Lars Melchior
923265e7ae Update README.md (#17) 2019-04-15 14:42:17 +02:00
Lars Melchior
f2ad294ef3 only use add_package when VERSION is present (#16) 2019-04-15 14:22:43 +02:00
Lars Melchior
3e65078ce7 Update README.md (#15)
* Update README.md

* Update README.md
2019-04-15 14:06:21 +02:00
Lars Melchior
946019a336 update LarsParser in examples and Readme (#14) 2019-04-14 15:33:57 +02:00
Lars Melchior
2d95c66fa4 add package options (#13)
* add package options

* update tests

* update Glue package
2019-04-14 14:49:35 +02:00
Lars Melchior
77a118d3ce Update test.cpp (#12) 2019-04-14 11:29:07 +02:00
Lars Melchior
4dee712eef Update README.md (#11) 2019-04-11 11:35:59 +02:00
Lars Melchior
3c0d201c76 return when package has been added before (#10) 2019-04-11 11:21:04 +02:00
Lars Melchior
4c22b73ebd Use FetchContent (#9)
* remove CPM_RESET in favor of CPM_OFFLINE

* Use FetchContent

* update travis

* update travis

* update travis

* update travis

* update travis
2019-04-11 10:13:28 +02:00
Lars Melchior
50aa889be8 Update README.md (#7)
* Update README.md

* Update README.md (#8)
2019-04-10 17:54:43 +02:00
Lars Melchior
e4bbd6e215 remove CPM_RESET in favor of CPM_OFFLINE (#6)
* remove CPM_RESET in favor of CPM_OFFLINE

* Update README.md (#5)

* Update README.md

* Update README.md

* Update README.md
2019-04-10 16:43:57 +02:00
Lars Melchior
e368fce6c3 Add CPM_RESET (#4)
* added CPM_RESET option

* update readme

* Update README.md
2019-04-09 20:01:27 +02:00
Lars Melchior
f8e571e416 Merge pull request #3 from TheLartians/dev
update parser version
2019-04-09 18:04:44 +02:00
Lars Melchior
e565e35397 Merge branch 'master' into dev 2019-04-09 17:30:48 +02:00
Lars Melchior
702f413801 update Parser lib 2019-04-09 17:30:18 +02:00
Lars Melchior
03b2dd0cb9 Merge pull request #2 from TheLartians/dev
update readme
2019-04-09 17:19:53 +02:00
Lars Melchior
4badcddc5d update readme 2019-04-09 17:10:44 +02:00
61 changed files with 1881 additions and 433 deletions

16
.github/workflows/macos.yml vendored Normal file
View 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
View 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
View 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
View 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
View File

@@ -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

View File

@@ -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
View File

@@ -1,43 +1,273 @@
[![Build Status](https://travis-ci.com/TheLartians/CPM.svg?branch=master)](https://travis-ci.com/TheLartians/CPM)
[![Build Status](https://travis-ci.com/TheLartians/CPM.cmake.svg?branch=master)](https://travis-ci.com/TheLartians/CPM.cmake)
[![Actions Status](https://github.com/TheLartians/CPM.cmake/workflows/MacOS/badge.svg)](https://github.com/TheLartians/CPM.cmake/actions)
[![Actions Status](https://github.com/TheLartians/CPM.cmake/workflows/Windows/badge.svg)](https://github.com/TheLartians/CPM.cmake/actions)
[![Actions Status](https://github.com/TheLartians/CPM.cmake/workflows/Ubuntu/badge.svg)](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.

View File

@@ -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()

View File

@@ -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()

View File

@@ -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 ""
)

View File

@@ -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
View 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()

View 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)

View 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();

View 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
View 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
View 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('')

View 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
View 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));
}
}

View 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
View 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;
}

View 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
View 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;
}

View 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
View 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));
}
}

View 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
View 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 &registry) {
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 &registry) {
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);
// ...
}

View 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
View File

@@ -0,0 +1,6 @@
#include <fmt/format.h>
int main(){
fmt::print("Hello, {}!\n", "world");
return 0;
}

View 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
View 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);
}

View 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
View 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;
}

View 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)

View 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;
}

View 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)

View 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]]

View 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)

View 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;
}

View 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
View 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);
}

View 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
View 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;
}

View 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

Binary file not shown.

BIN
logo/CPM.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

17
test/CMakeLists.txt Normal file
View 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
View 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
View File

@@ -0,0 +1 @@
/CMakeLists.txt

23
test/unit/cache/CMakeLists.txt.in vendored Normal file
View 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
View 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;
}

View 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")

View 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
View File

@@ -0,0 +1 @@
/CMakeLists.txt

View 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()

View File

@@ -0,0 +1,4 @@
function(dependency_function)
message("called external method")
endfunction()

View 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})

View File

@@ -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)

View File

@@ -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;
}

View File

@@ -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)

View File

@@ -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;
}
}