mirror of
https://github.com/cpm-cmake/CPM.cmake.git
synced 2025-06-26 00:00:14 -04:00
Compare commits
124 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
d9364ce284 | ||
|
d7614381ab | ||
|
97023e8b97 | ||
|
0f231080d9 | ||
|
33efd5f5d2 | ||
|
4b3a60fb32 | ||
|
cd28d445ae | ||
|
2a9e203320 | ||
|
22381df399 | ||
|
c3807eb774 | ||
|
9ddfe1b6a8 | ||
|
0bc73f41ce | ||
|
8b67fe2344 | ||
|
d416d9b22c | ||
|
76ca48690b | ||
|
0370507fed | ||
|
c0855c9543 | ||
|
7e81149c1e | ||
|
0e450ef450 | ||
|
a8144f511d | ||
|
3c25130ffa | ||
|
369f1316f6 | ||
|
a9c8c6fe1b | ||
|
2fa48378e2 | ||
|
4276c79d28 | ||
|
ee6d879a50 | ||
|
d6d5d0d5ab | ||
|
16c6a3b0af | ||
|
52ee7c9d53 | ||
|
699c7a0038 | ||
|
daf9d766c6 | ||
|
439bfcf134 | ||
|
02ecc4608a | ||
|
4608688d85 | ||
|
cda03b434e | ||
|
ee556fc555 | ||
|
1b59cb6b16 | ||
|
a02a9601da | ||
|
af3f1ca814 | ||
|
b9b512a869 | ||
|
e23bd4c0c3 | ||
|
5f3005ab7c | ||
|
12daf366c7 | ||
|
0938e8fde7 | ||
|
09b056ae20 | ||
|
d34d2a8730 | ||
|
6fc2170d5d | ||
|
1184a6e6e7 | ||
|
c53417bd65 | ||
|
50e9b9edb8 | ||
|
03705fcce1 | ||
|
f00ccd89c4 | ||
|
1f4909ca44 | ||
|
4d33686a50 | ||
|
984251f46c | ||
|
63d0de7114 | ||
|
65c760a840 | ||
|
b5e60e72e8 | ||
|
10bf25a811 | ||
|
18b6cbf233 | ||
|
698741ff7c | ||
|
1f09de0d9b | ||
|
b224ce280d | ||
|
49af958fb4 | ||
|
90c763532a | ||
|
4605d32f0e | ||
|
ede60451a9 | ||
|
5961f9f9fb | ||
|
69e9ff3766 | ||
|
3fee69c894 | ||
|
a575ab57b7 | ||
|
ca421f0e0c | ||
|
005f202655 | ||
|
865648e7bd | ||
|
33bdbae902 | ||
|
9d3fad01d4 | ||
|
11c7ec8afa | ||
|
4f7af69925 | ||
|
c58e98a0a0 | ||
|
a27c66a3ea | ||
|
5cb7398a24 | ||
|
262f1e0602 | ||
|
7cbef3efc8 | ||
|
939123d1b4 | ||
|
22078d5e0d | ||
|
96c268827b | ||
|
dad37fbe4e | ||
|
fed5f8e8a2 | ||
|
d65613e860 | ||
|
718ea71759 | ||
|
6491382204 | ||
|
634800c619 | ||
|
f552da96bd | ||
|
ea6a8eb895 | ||
|
a5c22bf6e8 | ||
|
c5cb85b2f1 | ||
|
91585e3864 | ||
|
9675d46517 | ||
|
7078e8286a | ||
|
6a0277f16e | ||
|
4502bf1e04 | ||
|
dd3ba9792c | ||
|
de5551e42c | ||
|
7644c3a40f | ||
|
310efb9b17 | ||
|
4fad2eac0a | ||
|
ee08119642 | ||
|
259f1be8e2 | ||
|
32b063eba5 | ||
|
d64d816585 | ||
|
8e8dcc9a8d | ||
|
8afc2af4f9 | ||
|
a3d1048ad6 | ||
|
492e762591 | ||
|
3f6cbe7383 | ||
|
4aadac1972 | ||
|
4cbf443363 | ||
|
2744b87f07 | ||
|
fd539b8ff3 | ||
|
02d57a1601 | ||
|
5f614e5eb6 | ||
|
1f5cb903e5 | ||
|
7000572bbe | ||
|
fe8d15ba82 |
@ -1,71 +1,5 @@
|
|||||||
|
include: ["cmake/.cmake-format-additional_commands-cpm"]
|
||||||
format:
|
format:
|
||||||
tab_size: 2
|
tab_size: 2
|
||||||
line_width: 100
|
line_width: 100
|
||||||
dangle_parens: true
|
dangle_parens: true
|
||||||
|
|
||||||
parse:
|
|
||||||
additional_commands:
|
|
||||||
cpmaddpackage:
|
|
||||||
pargs:
|
|
||||||
nargs: '*'
|
|
||||||
flags: []
|
|
||||||
spelling: CPMAddPackage
|
|
||||||
kwargs: &cpmaddpackagekwargs
|
|
||||||
NAME: 1
|
|
||||||
FORCE: 1
|
|
||||||
VERSION: 1
|
|
||||||
GIT_TAG: 1
|
|
||||||
DOWNLOAD_ONLY: 1
|
|
||||||
GITHUB_REPOSITORY: 1
|
|
||||||
GITLAB_REPOSITORY: 1
|
|
||||||
GIT_REPOSITORY: 1
|
|
||||||
SVN_REPOSITORY: 1
|
|
||||||
SVN_REVISION: 1
|
|
||||||
SOURCE_DIR: 1
|
|
||||||
DOWNLOAD_COMMAND: 1
|
|
||||||
FIND_PACKAGE_ARGUMENTS: 1
|
|
||||||
NO_CACHE: 1
|
|
||||||
GIT_SHALLOW: 1
|
|
||||||
URL: 1
|
|
||||||
URL_HASH: 1
|
|
||||||
URL_MD5: 1
|
|
||||||
DOWNLOAD_NAME: 1
|
|
||||||
DOWNLOAD_NO_EXTRACT: 1
|
|
||||||
HTTP_USERNAME: 1
|
|
||||||
HTTP_PASSWORD: 1
|
|
||||||
OPTIONS: +
|
|
||||||
cpmfindpackage:
|
|
||||||
pargs:
|
|
||||||
nargs: '*'
|
|
||||||
flags: []
|
|
||||||
spelling: CPMFindPackage
|
|
||||||
kwargs: *cpmaddpackagekwargs
|
|
||||||
cpmdeclarepackage:
|
|
||||||
pargs:
|
|
||||||
nargs: '*'
|
|
||||||
flags: []
|
|
||||||
spelling: CPMDeclarePackage
|
|
||||||
kwargs: *cpmaddpackagekwargs
|
|
||||||
packageproject:
|
|
||||||
pargs:
|
|
||||||
nargs: '*'
|
|
||||||
flags: []
|
|
||||||
spelling: packageProject
|
|
||||||
kwargs:
|
|
||||||
NAME: 1
|
|
||||||
VERSION: 1
|
|
||||||
INCLUDE_DIR: 1
|
|
||||||
INCLUDE_DESTINATION: 1
|
|
||||||
BINARY_DIR: 1
|
|
||||||
COMPATIBILITY: 1
|
|
||||||
VERSION_HEADER: 1
|
|
||||||
DEPENDENCIES: +
|
|
||||||
cpmusepackagelock:
|
|
||||||
pargs: 1
|
|
||||||
spelling: CPMUsePackageLock
|
|
||||||
cpmregisterpackage:
|
|
||||||
pargs: 1
|
|
||||||
spelling: CPMRegisterPackage
|
|
||||||
cpmgetpackageversion:
|
|
||||||
pargs: 2
|
|
||||||
spelling: CPMGetPackageVersion
|
|
||||||
|
3
.git_archival.txt
Normal file
3
.git_archival.txt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
node: $Format:%H$
|
||||||
|
node-date: $Format:%cI$
|
||||||
|
describe-name: $Format:%(describe:tags=true,match=?[0-9.]*)$
|
1
.gitattributes
vendored
Normal file
1
.gitattributes
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
.git_archival.txt export-subst
|
30
.github/workflows/examples.yaml
vendored
Normal file
30
.github/workflows/examples.yaml
vendored
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
name: Examples
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
gcc:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: build all
|
||||||
|
env:
|
||||||
|
CC: gcc
|
||||||
|
CXX: g++
|
||||||
|
run: python3 examples/build_all.py
|
||||||
|
|
||||||
|
clang:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
- name: build all
|
||||||
|
env:
|
||||||
|
CC: clang
|
||||||
|
CXX: clang++
|
||||||
|
run: python3 examples/build_all.py
|
22
.github/workflows/macos.yml
vendored
22
.github/workflows/macos.yml
vendored
@ -1,22 +0,0 @@
|
|||||||
name: MacOS
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
|
|
||||||
runs-on: macos-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v1
|
|
||||||
|
|
||||||
- name: run tests
|
|
||||||
run: |
|
|
||||||
cmake -Htest -Bbuild/test
|
|
||||||
cmake --build build/test --target test-verbose
|
|
7
.github/workflows/publish.yaml
vendored
7
.github/workflows/publish.yaml
vendored
@ -10,13 +10,14 @@ jobs:
|
|||||||
name: Publish CPM.cmake
|
name: Publish CPM.cmake
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Set CPM version by tag
|
- name: Set CPM version by tag
|
||||||
run: |
|
run: |
|
||||||
mkdir dist
|
mkdir dist
|
||||||
sed "s/1.0.0-development-version/${GITHUB_REF/refs\/tags\/v}/g" cmake/CPM.cmake > dist/CPM.cmake
|
sed -e "s/1.0.0-development-version/${GITHUB_REF/refs\/tags\/v}/g" cmake/CPM.cmake > dist/CPM.cmake
|
||||||
sed "s/1.0.0-development-version/${GITHUB_REF/refs\/tags\/v}/g" cmake/get_cpm.cmake > dist/get_cpm.cmake
|
sed -e "s/1.0.0-development-version/${GITHUB_REF/refs\/tags\/v}/g" \
|
||||||
|
-e "s/CPM_HASH_SUM_PLACEHOLDER/$(sha256sum dist/CPM.cmake | cut -d' ' -f1)/" cmake/get_cpm.cmake > dist/get_cpm.cmake
|
||||||
|
|
||||||
- name: Upload CPM.cmake to release
|
- name: Upload CPM.cmake to release
|
||||||
uses: svenstaro/upload-release-action@v1-release
|
uses: svenstaro/upload-release-action@v1-release
|
||||||
|
31
.github/workflows/style.yaml
vendored
Normal file
31
.github/workflows/style.yaml
vendored
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
name: Style
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
style:
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Setup cmake
|
||||||
|
uses: jwlawson/actions-setup-cmake@v1.13
|
||||||
|
with:
|
||||||
|
cmake-version: '3.27.x'
|
||||||
|
|
||||||
|
- name: Install format dependencies
|
||||||
|
run: pip3 install clang-format==14.0.6 cmake_format==0.6.11 pyyaml
|
||||||
|
|
||||||
|
- name: configure
|
||||||
|
run: cmake -Stest/style -Bbuild/style
|
||||||
|
|
||||||
|
- name: check style
|
||||||
|
run: cmake --build build/style --target check-format
|
28
.github/workflows/style.yml
vendored
28
.github/workflows/style.yml
vendored
@ -1,28 +0,0 @@
|
|||||||
name: Style
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
style:
|
|
||||||
|
|
||||||
runs-on: macos-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v1
|
|
||||||
|
|
||||||
- name: Install format dependencies
|
|
||||||
run: |
|
|
||||||
brew install clang-format
|
|
||||||
pip3 install cmake_format==0.6.11 pyyaml
|
|
||||||
|
|
||||||
- name: configure
|
|
||||||
run: cmake -Htest/style -Bbuild/style
|
|
||||||
|
|
||||||
- name: check style
|
|
||||||
run: cmake --build build/style --target check-format
|
|
48
.github/workflows/test.yaml
vendored
Normal file
48
.github/workflows/test.yaml
vendored
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
name: Test
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
tests:
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
# windows-latest is windows-2019 which carries a pretty old version of ruby (2.5)
|
||||||
|
# we need at least ruby 2.7 for the tests
|
||||||
|
# instead of dealing with installing a modern version of ruby on 2019, we'll just use windows-2022 here
|
||||||
|
os: [ubuntu-latest, windows-2022, macos-latest]
|
||||||
|
# we want to ensure compatibility with a recent CMake version as well as the lowest officially supported
|
||||||
|
# legacy version that we define as the default version of the second-latest Ubuntu LTS release currently available
|
||||||
|
cmake_version: ['3.16.3', '3.27.5', '3.30.0']
|
||||||
|
exclude:
|
||||||
|
# there seems to be an issue with CMake 3.16 not finding a C++ compiler on windows-2022
|
||||||
|
- os: windows-2022
|
||||||
|
cmake_version: '3.16.3'
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: clone
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Setup cmake
|
||||||
|
uses: jwlawson/actions-setup-cmake@v1.13
|
||||||
|
with:
|
||||||
|
cmake-version: ${{ matrix.cmake_version }}
|
||||||
|
|
||||||
|
- name: unit tests
|
||||||
|
run: |
|
||||||
|
cmake -Stest -Bbuild/test
|
||||||
|
cmake --build build/test --target test-verbose
|
||||||
|
env:
|
||||||
|
CMAKE_VERSION: ${{ matrix.cmake_version }}
|
||||||
|
|
||||||
|
- name: integration tests
|
||||||
|
run: ruby test/integration/runner.rb
|
||||||
|
env:
|
||||||
|
CPM_INTEGRATION_TEST_DIR: ./build/integration
|
||||||
|
CMAKE_VERSION: ${{ matrix.cmake_version }}
|
29
.github/workflows/ubuntu.yml
vendored
29
.github/workflows/ubuntu.yml
vendored
@ -1,29 +0,0 @@
|
|||||||
name: Ubuntu
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v1
|
|
||||||
|
|
||||||
- name: install updates
|
|
||||||
run: |
|
|
||||||
wget -O cmake.sh https://cmake.org/files/v3.14/cmake-3.14.0-Linux-x86_64.sh
|
|
||||||
sudo sh cmake.sh --skip-license --exclude-subdir --prefix=/usr/local
|
|
||||||
export PATH=/usr/local/bin:$PATH
|
|
||||||
cmake --version
|
|
||||||
|
|
||||||
- name: run tests
|
|
||||||
run: |
|
|
||||||
cmake -Htest -Bbuild/test
|
|
||||||
cmake --build build/test --target test-verbose
|
|
22
.github/workflows/windows.yml
vendored
22
.github/workflows/windows.yml
vendored
@ -1,22 +0,0 @@
|
|||||||
name: Windows
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
|
|
||||||
runs-on: windows-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v1
|
|
||||||
|
|
||||||
- name: run tests
|
|
||||||
run: |
|
|
||||||
cmake -Htest -Bbuild/test
|
|
||||||
cmake --build build/test --target test-verbose
|
|
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,3 +1,4 @@
|
|||||||
|
build/
|
||||||
/build*
|
/build*
|
||||||
/.vscode
|
/.vscode
|
||||||
*.DS_Store
|
*.DS_Store
|
||||||
|
50
.travis.yml
50
.travis.yml
@ -1,50 +0,0 @@
|
|||||||
language: cpp
|
|
||||||
sudo: require
|
|
||||||
dist: xenial
|
|
||||||
|
|
||||||
common_sources: &all_sources
|
|
||||||
- ubuntu-toolchain-r-test
|
|
||||||
- llvm-toolchain-trusty
|
|
||||||
|
|
||||||
python:
|
|
||||||
- 3.7
|
|
||||||
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- os: linux
|
|
||||||
compiler: gcc
|
|
||||||
addons: &gcc8
|
|
||||||
apt:
|
|
||||||
sources: *all_sources
|
|
||||||
packages:
|
|
||||||
- g++-8
|
|
||||||
env:
|
|
||||||
- MATRIX_EVAL="export CC=gcc-8; export CXX=g++-8;"
|
|
||||||
|
|
||||||
- os: linux
|
|
||||||
compiler: clang
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
sources: *all_sources
|
|
||||||
packages:
|
|
||||||
- g++-8
|
|
||||||
- clang-6.0
|
|
||||||
env:
|
|
||||||
- MATRIX_EVAL="export CC=clang-6.0; export CXX=clang++-6.0;"
|
|
||||||
|
|
||||||
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:
|
|
||||||
# unit tests
|
|
||||||
- cmake -Htest -Bbuild/test
|
|
||||||
- cmake --build build/test --target test-verbose
|
|
||||||
# build examples
|
|
||||||
- python3 examples/build_all.py
|
|
28
CMakeLists.txt
Normal file
28
CMakeLists.txt
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||||
|
|
||||||
|
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git/")
|
||||||
|
find_package(Git REQUIRED)
|
||||||
|
execute_process(
|
||||||
|
COMMAND "${GIT_EXECUTABLE}" describe --tags --match=?[0-9.]*
|
||||||
|
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
|
||||||
|
OUTPUT_VARIABLE DESCRIBE_NAME COMMAND_ERROR_IS_FATAL ANY
|
||||||
|
)
|
||||||
|
set(CPM_DEVELOPMENT "-development-version")
|
||||||
|
else()
|
||||||
|
file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/.git_archival.txt" DESCRIBE_NAME
|
||||||
|
REGEX "^describe-name:.*"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
string(REGEX MATCH "([0-9\\.]+)" EXTRACTED_CPM_VERSION "${DESCRIBE_NAME}")
|
||||||
|
|
||||||
|
project(
|
||||||
|
CPM.cmake
|
||||||
|
VERSION "${EXTRACTED_CPM_VERSION}"
|
||||||
|
DESCRIPTION
|
||||||
|
"CMake's missing package manager. A small CMake script for setup-free, cross-platform, reproducible dependency management."
|
||||||
|
HOMEPAGE_URL "https://github.com/cpm-cmake/CPM.cmake"
|
||||||
|
LANGUAGES NONE
|
||||||
|
)
|
||||||
|
|
||||||
|
include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/CPM.cmake")
|
177
CONTRIBUTING.md
Normal file
177
CONTRIBUTING.md
Normal file
@ -0,0 +1,177 @@
|
|||||||
|
<!-- omit in toc -->
|
||||||
|
# Contributing to CPM.cmake
|
||||||
|
|
||||||
|
First off, thanks for taking the time to contribute! ❤️
|
||||||
|
|
||||||
|
All types of contributions are encouraged and valued. See the [Table of Contents](#table-of-contents) for different ways to help and details about how this project handles them. Please make sure to read the relevant section before making your contribution. It will make it a lot easier for us maintainers and smooth out the experience for all involved. The community looks forward to your contributions. 🎉
|
||||||
|
|
||||||
|
> And if you like the project, but just don't have time to contribute, that's fine. There are other easy ways to support the project and show your appreciation, which we would also be very happy about:
|
||||||
|
> - Star the project
|
||||||
|
> - Tweet about it
|
||||||
|
> - Refer this project in your project's readme
|
||||||
|
> - Mention the project at local meetups and tell your friends/colleagues
|
||||||
|
|
||||||
|
<!-- omit in toc -->
|
||||||
|
## Table of Contents
|
||||||
|
|
||||||
|
- [I Have a Question](#i-have-a-question)
|
||||||
|
- [I Want To Contribute](#i-want-to-contribute)
|
||||||
|
- [Reporting Bugs](#reporting-bugs)
|
||||||
|
- [Suggesting Enhancements](#suggesting-enhancements)
|
||||||
|
- [Your First Code Contribution](#your-first-code-contribution)
|
||||||
|
- [Styleguides](#styleguides)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## I Have a Question
|
||||||
|
|
||||||
|
> If you want to ask a question, we assume that you have read the available [Documentation](https://github.com/cpm-cmake/CPM.cmake/blob/master/README.md).
|
||||||
|
|
||||||
|
Before you ask a question, it is best to search for existing [Issues](https://github.com/cpm-cmake/CPM.cmake/issues) that might help you. In case you have found a suitable issue and still need clarification, you can write your question in this issue. It is also advisable to search the internet for answers first.
|
||||||
|
|
||||||
|
If you then still feel the need to ask a question and need clarification, we recommend the following:
|
||||||
|
|
||||||
|
- Open an [Issue](https://github.com/cpm-cmake/CPM.cmake/issues/new).
|
||||||
|
- Provide as much context as you can about what you're running into.
|
||||||
|
- Provide project and platform versions (CMake, OS, etc), depending on what seems relevant.
|
||||||
|
|
||||||
|
We will then take care of the issue as soon as possible.
|
||||||
|
|
||||||
|
## I Want To Contribute
|
||||||
|
|
||||||
|
> ### Legal Notice <!-- omit in toc -->
|
||||||
|
> When contributing to this project, you must agree that you have authored 100% of the content, that you have the necessary rights to the content and that the content you contribute may be provided under the project license.
|
||||||
|
|
||||||
|
### Reporting Bugs
|
||||||
|
|
||||||
|
<!-- omit in toc -->
|
||||||
|
#### Before Submitting a Bug Report
|
||||||
|
|
||||||
|
A good bug report shouldn't leave others needing to chase you up for more information. Therefore, we ask you to investigate carefully, collect information and describe the issue in detail in your report. Please complete the following steps in advance to help us fix any potential bug as fast as possible.
|
||||||
|
|
||||||
|
- Make sure that you are using the latest version.
|
||||||
|
- Determine if your bug is really a bug and not an error on your side e.g. using incompatible environment components/versions (Make sure that you have read the [documentation](https://github.com/cpm-cmake/CPM.cmake/blob/master/README.md). If you are looking for support, you might want to check [this section](#i-have-a-question)).
|
||||||
|
- To see if other users have experienced (and potentially already solved) the same issue you are having, check if there is not already a bug report existing for your bug or error in the [bug tracker](https://github.com/cpm-cmake/CPM.cmake/issues?q=label%3Abug).
|
||||||
|
- Also make sure to search the internet (including Stack Overflow) to see if users outside of the GitHub community have discussed the issue.
|
||||||
|
- Collect information about the bug:
|
||||||
|
- Stack trace / Full CMake error output
|
||||||
|
- OS, Platform and Version (Windows, Linux, macOS, x86, ARM)
|
||||||
|
- Version of CMake, compiler or other tools used, depending on what seems relevant.
|
||||||
|
- Possibly any relevant environment / command line arguments used
|
||||||
|
- Can you reliably reproduce the issue? And can you also reproduce it with older versions?
|
||||||
|
|
||||||
|
<!-- omit in toc -->
|
||||||
|
#### How Do I Submit a Good Bug Report?
|
||||||
|
|
||||||
|
We use GitHub issues to track bugs and errors. If you run into an issue with the project:
|
||||||
|
|
||||||
|
- Open an [Issue](https://github.com/cpm-cmake/CPM.cmake/issues/new). (Since we can't be sure at this point whether it is a bug or not, we ask you not to talk about a bug yet and not to label the issue.)
|
||||||
|
- Explain the behavior you would expect and the actual behavior.
|
||||||
|
- Please provide as much context as possible and describe the *reproduction steps* that someone else can follow to recreate the issue on their own. This usually includes your code. For good bug reports you should isolate the problem and create a reduced test case.
|
||||||
|
- Provide the information you collected in the previous section.
|
||||||
|
|
||||||
|
Once it's filed:
|
||||||
|
|
||||||
|
- The project team will label the issue accordingly.
|
||||||
|
- A team member will try to reproduce the issue with your provided steps. If there are no reproduction steps or no obvious way to reproduce the issue, the team will ask you for those steps and mark the issue as `needs-repro`. Bugs with the `needs-repro` tag will not be addressed until they are reproduced.
|
||||||
|
- If the team is able to reproduce the issue, it will be marked `needs-fix`, as well as possibly other tags (such as `critical`), and the issue will be left to be [implemented by someone](#your-first-code-contribution).
|
||||||
|
|
||||||
|
### Suggesting Enhancements
|
||||||
|
|
||||||
|
This section guides you through submitting an enhancement suggestion for CPM.cmake, **including completely new features and minor improvements to existing functionality**. Following these guidelines will help maintainers and the community to understand your suggestion and find related suggestions.
|
||||||
|
|
||||||
|
<!-- omit in toc -->
|
||||||
|
#### Before Submitting an Enhancement
|
||||||
|
|
||||||
|
- Make sure that you are using the latest version.
|
||||||
|
- Read the [documentation](https://github.com/cpm-cmake/CPM.cmake/blob/master/README.md) carefully and find out if the functionality is already covered, maybe by an individual configuration.
|
||||||
|
- Perform a [search](https://github.com/cpm-cmake/CPM.cmake/issues) to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one.
|
||||||
|
- Find out whether your idea fits with the scope and aims of the project. It's up to you to make a strong case to convince the project's developers of the merits of this feature. Keep in mind that we want features that will be useful to the majority of our users and not just a small subset. If you're just targeting a minority of users, consider writing an add-on/plugin library.
|
||||||
|
|
||||||
|
<!-- omit in toc -->
|
||||||
|
#### How Do I Submit a Good Enhancement Suggestion?
|
||||||
|
|
||||||
|
Enhancement suggestions are tracked as [GitHub issues](https://github.com/cpm-cmake/CPM.cmake/issues).
|
||||||
|
|
||||||
|
- Use a **clear and descriptive title** for the issue to identify the suggestion.
|
||||||
|
- Provide a **step-by-step description of the suggested enhancement** in as many details as possible.
|
||||||
|
- **Describe the current behavior** and **explain which behavior you expected to see instead** and why. At this point you can also tell which alternatives do not work for you.
|
||||||
|
- **Explain why this enhancement would be useful** to most CPM.cmake users. You may also want to point out the other projects that solved it better and which could serve as inspiration.
|
||||||
|
|
||||||
|
### Your First Code Contribution
|
||||||
|
|
||||||
|
Please try to keep your individual changes as minimal and focussed on the issue as possible.
|
||||||
|
If you discover that the scope of your contribution is growing larger than expected you might want to split the changes into multiple separate contributions to allow a more focussed discussion and review.
|
||||||
|
|
||||||
|
It is usually a great idea and often required to add tests for your changes.
|
||||||
|
This allows us to quickly validate that the changes are working as intended and also guarantees that they won't be broken by other future updates.
|
||||||
|
For small and targeted functional changes, e.g. supporting a new URL schema, a [unit test](#unit-tests) may be enough.
|
||||||
|
For contributions that change large-scale behaviour, such as dependency caching features, an [integration test](#integration-tests) is more suited.
|
||||||
|
Depending on the changes, a combination of both test types may also be appropriate.
|
||||||
|
|
||||||
|
#### Unit tests
|
||||||
|
|
||||||
|
Unit tests are small CMake scripts that live in the [unit test directory](./test/unit/).
|
||||||
|
They usually make use of some of the helper assertions defined in the [testing.cmake](./cmake/testing.cmake) file.
|
||||||
|
An example unit test for checking the `cpm_get_version_from_git_tag` function could look like the following.
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||||
|
|
||||||
|
include(${CPM_PATH}/CPM.cmake)
|
||||||
|
include(${CPM_PATH}/testing.cmake)
|
||||||
|
|
||||||
|
cpm_get_version_from_git_tag("v1.2.3-a" VERSION)
|
||||||
|
assert_equal("1.2.3" ${VERSION})
|
||||||
|
```
|
||||||
|
|
||||||
|
This test can be run directly with CMake by providing the CPM source directory.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cmake -DCPM_PATH=$(pwd)/cmake -P <path to the test file>
|
||||||
|
```
|
||||||
|
|
||||||
|
We can also the [test directory's](./test/) CMakeLists to detect and run all unit tests using CMake's test runner.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cmake -Stest -Bbuild/test
|
||||||
|
cmake --build build/test --target test-verbose # or `test` for less noisy output
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Integration tests
|
||||||
|
|
||||||
|
The integration tests of CPM.cmake are written in Ruby. They use a custom integration test framework which extends the [Test::Unit](https://www.rubydoc.info/github/test-unit/test-unit/Test/Unit) library.
|
||||||
|
|
||||||
|
They require Ruby 2.7.0 or later.
|
||||||
|
|
||||||
|
To run all tests from the repo root execute:
|
||||||
|
|
||||||
|
```
|
||||||
|
ruby test/integration/runner.rb
|
||||||
|
```
|
||||||
|
|
||||||
|
For a detailed guide on integration tests, see the documentation in the [integration test directory](./test/integration/).
|
||||||
|
|
||||||
|
## Styleguides
|
||||||
|
|
||||||
|
This project uses automatic code styling using [clang-format](https://clang.llvm.org/docs/ClangFormat.html) and [cmake-format](https://github.com/cheshirekow/cmake_format).
|
||||||
|
The code style is enforced by the tools using the style options defined in the [.clang-format](./.clang-format) and [.cmake-format](./.cmake-format) configuration files.
|
||||||
|
|
||||||
|
To install the necessary tools for code styling we recommend using recent version of [Python/pip](https://www.python.org).
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pip3 install clang-format==14.0.6 cmake_format==0.6.11 pyyaml
|
||||||
|
```
|
||||||
|
|
||||||
|
For convenience, we have a CMake project defined in the [test/style](./test/style/) directory that can be called to automatically apply the code styling to all files currently added in git.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# initialize the project
|
||||||
|
cmake -Stest/style -Bbuild/style
|
||||||
|
# apply the code styling to this repository
|
||||||
|
cmake --build build/style --target fix-format
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- omit in toc -->
|
||||||
|
## Attribution
|
||||||
|
This guide is based on the **contributing-gen**. [Make your own](https://github.com/bttger/contributing-gen)!
|
40
CONTRIBUTORS.md
Normal file
40
CONTRIBUTORS.md
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
# CPM.cmake Contributors
|
||||||
|
|
||||||
|
For detailed breakdown of individual contributions see the [Contributors page on GitHub](https://github.com/cpm-cmake/CPM.cmake/graphs/contributors)
|
||||||
|
|
||||||
|
* [Lars Melchior](https://github.com/TheLartians)
|
||||||
|
* [Borislav Stanimirov](https://github.com/iboB)
|
||||||
|
* [Paul T](https://github.com/DeveloperPaul123)
|
||||||
|
* [Leonardo Lima](https://github.com/leozz37)
|
||||||
|
* [pgorgon-hem](https://github.com/pgorgon-hem)
|
||||||
|
* [Xavier Muller](https://github.com/xmuller)
|
||||||
|
* NVIDIA CORPORATION via [Robert Maynard](https://github.com/robertmaynard)
|
||||||
|
* [Kingsley Chen](https://github.com/kingsamchen)
|
||||||
|
* [alexandreSalconiDenis](https://github.com/alexandreSalconiDenis)
|
||||||
|
* [DNKpp](https://github.com/DNKpp)
|
||||||
|
* [Olivier Le Doeuff](https://github.com/OlivierLDff)
|
||||||
|
* [Stuart Dootson](https://github.com/studoot)
|
||||||
|
* [Tobias Hellmann](https://github.com/Tobi823)
|
||||||
|
* [Giuseppe Cesarano](https://github.com/GiuseppeCesarano)
|
||||||
|
* [Pavel Sokolov](https://github.com/hacker-cb)
|
||||||
|
* [Claus Klein](https://github.com/ClausKlein)
|
||||||
|
* [Clare Macrae](https://github.com/claremacrae)
|
||||||
|
* [Kai Germaschewski](https://github.com/germasch)
|
||||||
|
* [Andrea Barbadoro](https://github.com/andijcr)
|
||||||
|
* [MixusMinimax](https://github.com/MixusMinimax)
|
||||||
|
* [Dan Raviv](https://github.com/danra)
|
||||||
|
* [Prabir Shrestha](https://github.com/prabirshrestha)
|
||||||
|
* [Paul Taylor](https://github.com/trxcllnt)
|
||||||
|
* [Ryan Mast](https://github.com/nightlark)
|
||||||
|
* [Vinpasso](https://github.com/Vinpasso)
|
||||||
|
* [Yotam Gingold](https://github.com/yig)
|
||||||
|
* [jecassis](https://github.com/jecassis)
|
||||||
|
* [Johel Ernesto Guerrero Peña](https://github.com/JohelEGP)
|
||||||
|
* [Lars Bilke](https://github.com/bilke)
|
||||||
|
* [Lava Block](https://github.com/TheLavaBlock)
|
||||||
|
* [Anton Filimonov](https://github.com/variar)
|
||||||
|
* [David Fong](https://github.com/david-fong)
|
||||||
|
* [Thomas Mosegaard Pedersen](https://github.com/thomas-mp)
|
||||||
|
* [Evgeny Gorodetskiy](https://github.com/egorodet)
|
||||||
|
* [Kamil Kisiel](https://github.com/kisielk)
|
||||||
|
* [AlessandroW](https://github.com/AlessandroW)
|
2
LICENSE
2
LICENSE
@ -1,6 +1,6 @@
|
|||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2019 Lars Melchior
|
Copyright (c) 2019-2022 Lars Melchior and contributors
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
488
README.md
488
README.md
@ -1,7 +1,3 @@
|
|||||||
[](https://travis-ci.com/TheLartians/CPM.cmake)
|
|
||||||
[](https://github.com/TheLartians/CPM.cmake/actions)
|
|
||||||
[](https://github.com/TheLartians/CPM.cmake/actions)
|
|
||||||
[](https://github.com/TheLartians/CPM.cmake/actions) [](https://gitter.im/TheLartians/CPM.cmake?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
<p align="center">
|
<p align="center">
|
||||||
@ -11,12 +7,12 @@
|
|||||||
|
|
||||||
# Setup-free CMake dependency management
|
# Setup-free CMake dependency management
|
||||||
|
|
||||||
CPM.cmake is a CMake script that adds dependency management capabilities to CMake.
|
CPM.cmake is a cross-platform CMake script that adds dependency management capabilities to CMake.
|
||||||
It's built as a thin wrapper around CMake's [FetchContent](https://cmake.org/cmake/help/latest/module/FetchContent.html) module that adds version control, caching, a simple API [and more](#comparison-to-pure-fetchcontent--externalproject).
|
It's built as a thin wrapper around CMake's [FetchContent](https://cmake.org/cmake/help/latest/module/FetchContent.html) module that adds version control, caching, a simple API [and more](#comparison-to-pure-fetchcontent--externalproject).
|
||||||
|
|
||||||
## Manage everything
|
## Manage everything
|
||||||
|
|
||||||
Any downloadable project or resource can be added as a version-controlled dependency though CPM, it is not necessary to modify or package anything.
|
Any downloadable project or resource can be added as a version-controlled dependency through CPM, it is not necessary to modify or package anything.
|
||||||
Projects using modern CMake are automatically configured and their targets can be used immediately.
|
Projects using modern CMake are automatically configured and their targets can be used immediately.
|
||||||
For everything else, the targets can be created manually after the dependency has been downloaded (see the [snippets](#snippets) below for examples).
|
For everything else, the targets can be created manually after the dependency has been downloaded (see the [snippets](#snippets) below for examples).
|
||||||
|
|
||||||
@ -25,37 +21,6 @@ For everything else, the targets can be created manually after the dependency ha
|
|||||||
- [CPM: An Awesome Dependency Manager for C++ with CMake](https://medium.com/swlh/cpm-an-awesome-dependency-manager-for-c-with-cmake-3c53f4376766)
|
- [CPM: An Awesome Dependency Manager for C++ with CMake](https://medium.com/swlh/cpm-an-awesome-dependency-manager-for-c-with-cmake-3c53f4376766)
|
||||||
- [CMake and the Future of C++ Package Management](https://ibob.github.io/blog/2020/01/13/cmake-package-management/)
|
- [CMake and the Future of C++ Package Management](https://ibob.github.io/blog/2020/01/13/cmake-package-management/)
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
After `CPM.cmake` has been [added](#adding-cpm) to your project, the function `CPMAddPackage` or `CPMFindPackage` can be used to fetch and configure a dependency.
|
|
||||||
Afterwards, any targets defined in the dependency can be used directly.
|
|
||||||
`CPMFindPackage` and `CPMAddPackage` take the following named parameters.
|
|
||||||
|
|
||||||
```cmake
|
|
||||||
CPMAddPackage(
|
|
||||||
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
|
## Full CMakeLists Example
|
||||||
|
|
||||||
```cmake
|
```cmake
|
||||||
@ -65,38 +30,115 @@ cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
|||||||
project(MyProject)
|
project(MyProject)
|
||||||
|
|
||||||
# add executable
|
# add executable
|
||||||
add_executable(tests tests.cpp)
|
add_executable(main main.cpp)
|
||||||
|
|
||||||
# add dependencies
|
# add dependencies
|
||||||
include(cmake/CPM.cmake)
|
include(cmake/CPM.cmake)
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage("gh:fmtlib/fmt#7.1.3")
|
||||||
NAME Catch2
|
CPMAddPackage("gh:nlohmann/json@3.10.5")
|
||||||
GITHUB_REPOSITORY catchorg/Catch2
|
CPMAddPackage("gh:catchorg/Catch2@3.4.0")
|
||||||
VERSION 2.5.0
|
|
||||||
)
|
|
||||||
|
|
||||||
# link dependencies
|
# link dependencies
|
||||||
target_link_libraries(tests Catch2)
|
target_link_libraries(main fmt::fmt nlohmann_json::nlohmann_json Catch2::Catch2WithMain)
|
||||||
```
|
```
|
||||||
|
|
||||||
See the [examples directory](https://github.com/TheLartians/CPM.cmake/tree/master/examples) for complete examples with source code and check [below](#snippets) or in the [wiki](https://github.com/TheLartians/CPM.cmake/wiki/More-Snippets) for example snippets.
|
See the [examples directory](https://github.com/cpm-cmake/CPM.cmake/tree/master/examples) for complete examples with source code and check [below](#snippets) or in the [wiki](https://github.com/cpm-cmake/CPM.cmake/wiki/More-Snippets) for example snippets.
|
||||||
|
|
||||||
## Adding CPM
|
## Adding CPM
|
||||||
|
|
||||||
To add CPM to your current project, simply add the [latest release](https://github.com/TheLartians/CPM.cmake/releases/latest) of `CPM.cmake` or `get_cpm.cmake` to your project's `cmake` directory.
|
To add CPM to your current project, simply add the [latest release](https://github.com/cpm-cmake/CPM.cmake/releases/latest) of `CPM.cmake` or `get_cpm.cmake` to your project's `cmake` directory.
|
||||||
The command below will perform this automatically.
|
The command below will perform this automatically.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
mkdir -p cmake
|
mkdir -p cmake
|
||||||
wget -O cmake/CPM.cmake https://github.com/TheLartians/CPM.cmake/releases/latest/download/get_cpm.cmake
|
wget -O cmake/CPM.cmake https://github.com/cpm-cmake/CPM.cmake/releases/latest/download/get_cpm.cmake
|
||||||
```
|
```
|
||||||
|
|
||||||
You can also download CPM.cmake directly from your project's `CMakeLists.txt`. See the [wiki](https://github.com/TheLartians/CPM.cmake/wiki/Downloading-CPM.cmake-in-CMake) for more details.
|
You can also download CPM.cmake directly from your project's `CMakeLists.txt`. See the [wiki](https://github.com/cpm-cmake/CPM.cmake/wiki/Downloading-CPM.cmake-in-CMake) for more details.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
After `CPM.cmake` has been [added](#adding-cpm) to your project, the function `CPMAddPackage` can be used to fetch and configure a dependency.
|
||||||
|
Afterwards, any targets defined in the dependency can be used directly.
|
||||||
|
`CPMAddPackage` takes the following named parameters.
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
CPMAddPackage(
|
||||||
|
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)
|
||||||
|
PATCHES # Patch files to be applied sequentially using patch and PATCH_OPTIONS (optional)
|
||||||
|
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`, however this isn't recommended, as such packages will only be updated when the cache is cleared.
|
||||||
|
|
||||||
|
`PATCHES` takes a list of patch files to apply sequentially. For a basic example, see [Highway](examples/highway/CMakeLists.txt).
|
||||||
|
We recommend that if you use `PATCHES`, you also set `CPM_SOURCE_CACHE`. See [issue 577](https://github.com/cpm-cmake/CPM.cmake/issues/577).
|
||||||
|
|
||||||
|
If an additional optional parameter `EXCLUDE_FROM_ALL` is set to a truthy value, then any targets defined inside the dependency won't be built by default. See the [CMake docs](https://cmake.org/cmake/help/latest/prop_tgt/EXCLUDE_FROM_ALL.html) for details.
|
||||||
|
|
||||||
|
If an additional optional parameter `SYSTEM` is set to a truthy value, the SYSTEM directory property of the subdirectory added will be set to true.
|
||||||
|
See the [add_subdirectory ](https://cmake.org/cmake/help/latest/command/add_subdirectory.html?highlight=add_subdirectory)
|
||||||
|
and [SYSTEM](https://cmake.org/cmake/help/latest/prop_tgt/SYSTEM.html#prop_tgt:SYSTEM) target property for details.
|
||||||
|
|
||||||
|
A shorthand syntax is also supported:
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
# A git package from a given uri with a version
|
||||||
|
CPMAddPackage("uri@version")
|
||||||
|
# A git package from a given uri with a git tag or commit hash
|
||||||
|
CPMAddPackage("uri#tag")
|
||||||
|
# A git package with both version and tag provided
|
||||||
|
CPMAddPackage("uri@version#tag")
|
||||||
|
```
|
||||||
|
|
||||||
|
In the shorthand syntax if the URI is of the form `gh:user/name`, it is interpreted as GitHub URI and converted to `https://github.com/user/name.git`. If the URI is of the form `gl:user/name`, it is interpreted as a [GitLab](https://gitlab.com/explore/) URI and converted to `https://gitlab.com/user/name.git`. If the URI is of the form `bb:user/name`, it is interpreted as a [Bitbucket](https://bitbucket.org/) URI and converted to `https://bitbucket.org/user/name.git`. Otherwise the URI used verbatim as a git URL. All packages added using the shorthand syntax will be added using the [EXCLUDE_FROM_ALL](https://cmake.org/cmake/help/latest/prop_tgt/EXCLUDE_FROM_ALL.html) and [SYSTEM](https://cmake.org/cmake/help/latest/prop_tgt/SYSTEM.html#prop_tgt:SYSTEM) flag.
|
||||||
|
|
||||||
|
The single-argument syntax also works for URLs:
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
# An archive package from a given url. The version is inferred
|
||||||
|
CPMAddPackage("https://example.com/my-package-1.2.3.zip")
|
||||||
|
# An archive package from a given url with an MD5 hash provided
|
||||||
|
CPMAddPackage("https://example.com/my-package-1.2.3.zip#MD5=68e20f674a48be38d60e129f600faf7d")
|
||||||
|
# An archive package from a given url. The version is explicitly given
|
||||||
|
CPMAddPackage("https://example.com/my-package.zip@1.2.3")
|
||||||
|
```
|
||||||
|
|
||||||
|
Additionally, if needed, extra arguments can be provided while using single argument syntax by using the shorthand syntax with the `URI` specifier.
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
CPMAddPackage(
|
||||||
|
URI "gh:nlohmann/json@3.9.1"
|
||||||
|
OPTIONS "JSON_BuildTests OFF"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
The `URI` argument must be the first argument to `CPMAddPackage`.
|
||||||
|
`URI` automatically sets `EXCLUDE_FROM_ALL YES` and `SYSTEM YES`.
|
||||||
|
If this is not desired, `EXCLUDE_FROM_ALL NO` and `SYSTEM NO` can be set afterwards.
|
||||||
|
|
||||||
|
After calling `CPMAddPackage`, the following variables are defined in the local scope, where `<dependency>` is the name of the dependency.
|
||||||
|
|
||||||
|
- `<dependency>_SOURCE_DIR` is the path to the source of the dependency.
|
||||||
|
- `<dependency>_BINARY_DIR` is the path to the build directory of the dependency.
|
||||||
|
- `<dependency>_ADDED` is set to `YES` if the dependency has not been added before, otherwise it is set to `NO`.
|
||||||
|
- `CPM_LAST_PACKAGE_NAME` is set to the determined name of the last added dependency (equivalent to `<dependency>`).
|
||||||
|
|
||||||
|
For using CPM.cmake projects with external package managers, such as conan or vcpkg, setting the variable [`CPM_USE_LOCAL_PACKAGES`](#options) will make CPM.cmake try to add a package through `find_package` first, and add it from source if it doesn't succeed.
|
||||||
|
|
||||||
|
In rare cases, this behaviour may be desirable by default. The function `CPMFindPackage` will try to find a local dependency via CMake's `find_package` and fallback to `CPMAddPackage`, if the dependency is not found.
|
||||||
|
|
||||||
## Updating CPM
|
## 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.
|
To update CPM to the newest version, update the script in the project's root directory, for example by running the same command as for [adding CPM](#adding-cpm).
|
||||||
Dependencies using CPM will automatically use the updated script of the outermost project.
|
Dependencies using CPM will automatically use the updated script of the outermost project.
|
||||||
|
|
||||||
## Advantages
|
## Advantages
|
||||||
@ -112,8 +154,12 @@ Dependencies using CPM will automatically use the updated script of the outermos
|
|||||||
## Limitations
|
## Limitations
|
||||||
|
|
||||||
- **No pre-built binaries** For every new build directory, all dependencies are initially downloaded and built from scratch. To avoid extra downloads it is recommend to set the [`CPM_SOURCE_CACHE`](#CPM_SOURCE_CACHE) environmental variable. Using a caching compiler such as [ccache](https://github.com/TheLartians/Ccache.cmake) can drastically reduce build time.
|
- **No pre-built binaries** For every new build directory, all dependencies are initially downloaded and built from scratch. To avoid extra downloads it is recommend to set the [`CPM_SOURCE_CACHE`](#CPM_SOURCE_CACHE) environmental variable. Using a caching compiler such as [ccache](https://github.com/TheLartians/Ccache.cmake) can drastically reduce build time.
|
||||||
- **Dependent on good CMakeLists** Many libraries do not have CMakeLists that work well for subprojects. Luckily this is slowly changing, however, until then, some manual configuration may be required (see the snippets [below](#snippets) for examples). For best practices on preparing projects for CPM, see the [wiki](https://github.com/TheLartians/CPM.cmake/wiki/Preparing-projects-for-CPM.cmake).
|
- **Dependent on good CMakeLists** Many libraries do not have CMakeLists that work well for subprojects. Luckily this is slowly changing, however, until then, some manual configuration may be required (see the snippets [below](#snippets) for examples). For best practices on preparing projects for CPM, see the [wiki](https://github.com/cpm-cmake/CPM.cmake/wiki/Preparing-projects-for-CPM.cmake).
|
||||||
- **First version used** In diamond-shaped dependency graphs (e.g. `A` depends on `C`@1.1 and `B`, which itself depends on `C`@1.2 the first added dependency will be used (in this case `C`@1.1). In this case, B requires a newer version of `C` than `A`, so CPM will emit a warning. This can be easily resolved by adding a new version of the dependency in the outermost project, or by introducing a [package lock file](#package-lock).
|
- **First version used** In diamond-shaped dependency graphs (e.g. `A` depends on `C`@1.1 and `B`, which itself depends on `C`@1.2 the first added dependency will be used (in this case `C`@1.1). In this case, B requires a newer version of `C` than `A`, so CPM will emit a warning. This can be easily resolved by adding a new version of the dependency in the outermost project, or by introducing a [package lock file](#package-lock).
|
||||||
|
- **Some CMake policies set to `NEW`** Including CPM.cmake will lead to several CMake policies being set to `NEW`. Users which need the old behavior will need to manually modify their CMake code to ensure they're set to `OLD` at the appropriate places. The policies are:
|
||||||
|
- [CMP0077](https://cmake.org/cmake/help/latest/policy/CMP0077.html) and [CMP0126](https://cmake.org/cmake/help/latest/policy/CMP0126.html). They make setting package options from `CMPAddPackage` possible.
|
||||||
|
- [CMP0135](https://cmake.org/cmake/help/latest/policy/CMP0135.html) It allows for proper package rebuilds of packages which are archives, source cache is not used, and the package URL is changed to an older version.
|
||||||
|
- [CMP0150](https://cmake.org/cmake/help/latest/policy/CMP0150.html) Relative paths provided to `GIT_REPOSITORY` are treated as relative to the parent project's remote.
|
||||||
|
|
||||||
For projects with more complex needs and where an extra setup step doesn't matter, it may be worth to check out an external C++ package manager such as [vcpkg](https://github.com/microsoft/vcpkg), [conan](https://conan.io) or [hunter](https://github.com/ruslo/hunter).
|
For projects with more complex needs and where an extra setup step doesn't matter, it may be worth to check out an external C++ package manager such as [vcpkg](https://github.com/microsoft/vcpkg), [conan](https://conan.io) or [hunter](https://github.com/ruslo/hunter).
|
||||||
Dependencies added with `CPMFindPackage` should work with external package managers.
|
Dependencies added with `CPMFindPackage` should work with external package managers.
|
||||||
@ -127,7 +173,7 @@ Additionally, it is difficult to cross-compile projects (e.g. for mobile), as th
|
|||||||
|
|
||||||
CPM.cmake allows dependencies to be unambiguously defined and builds them from source.
|
CPM.cmake allows dependencies to be unambiguously defined and builds them from source.
|
||||||
Note that the behaviour differs from `find_package`, as variables exported to the parent scope (such as `<PackageName>_LIBRARIES`) will not be visible after adding a package using CPM.cmake.
|
Note that the behaviour differs from `find_package`, as variables exported to the parent scope (such as `<PackageName>_LIBRARIES`) will not be visible after adding a package using CPM.cmake.
|
||||||
The behaviour can be [achieved manually](https://github.com/TheLartians/CPM.cmake/issues/132#issuecomment-644955140), if required.
|
The behaviour can be [achieved manually](https://github.com/cpm-cmake/CPM.cmake/issues/132#issuecomment-644955140), if required.
|
||||||
|
|
||||||
## Comparison to pure FetchContent / ExternalProject
|
## Comparison to pure FetchContent / ExternalProject
|
||||||
|
|
||||||
@ -135,15 +181,14 @@ CPM.cmake is a wrapper for CMake's FetchContent module and adds a number of feat
|
|||||||
The most notable features are:
|
The most notable features are:
|
||||||
|
|
||||||
- A simpler to use API
|
- A simpler to use API
|
||||||
- Version checking: CPM.cmake will check the version number of any added dependency and omit a warning if another dependency requires a more recent version.
|
- Version checking: CPM.cmake will check the version number of any added dependency and emit a warning if another dependency requires a more recent version.
|
||||||
- Options: any Options passed to a dependency are stored and compared on later use, so if another dependency tries to add an existing dependency with incompatible options a warning will be emitted to the user.
|
|
||||||
- Offline builds: CPM.cmake will override CMake's download and update commands, which allows new builds to be configured while offline if all dependencies [are available locally](#cpm_source_cache).
|
- Offline builds: CPM.cmake will override CMake's download and update commands, which allows new builds to be configured while offline if all dependencies [are available locally](#cpm_source_cache).
|
||||||
- Automatic shallow clone: if a version tag (e.g. `v2.2.0`) is provided and `CPM_SOURCE_CACHE` is used, CPM.cmake will perform a shallow clone of the dependency, which should be significantly faster while using less storage than a full clone.
|
- Automatic shallow clone: if a version tag (e.g. `v2.2.0`) is provided and `CPM_SOURCE_CACHE` is used, CPM.cmake will perform a shallow clone of the dependency, which should be significantly faster while using less storage than a full clone.
|
||||||
- Overridable: all `CPMAddPackage` can be configured to use `find_package` by setting a [CMake flag](#cpm_use_local_packages), making it easy to integrate into projects that may require local versioning through the system's package manager.
|
- Overridable: all `CPMAddPackage` can be configured to use `find_package` by setting a [CMake flag](#cpm_use_local_packages), making it easy to integrate into projects that may require local versioning through the system's package manager.
|
||||||
- [Package lock files](#package-lock) for easier transitive dependency management.
|
- [Package lock files](#package-lock) for easier transitive dependency management.
|
||||||
- Dependencies can be overridden [per-build](#local-package-override) using CMake CLI parameters.
|
- Dependencies can be overridden [per-build](#local-package-override) using CMake CLI parameters.
|
||||||
|
|
||||||
ExternalProject works similarly as FetchContent, however waits with adding dependencies until build time.
|
ExternalProject works similarly as FetchContent, however waits with adding dependencies until build time.
|
||||||
This has a quite a few disadvantages, especially as it makes using custom toolchains / cross-compiling very difficult and can lead to problems with nested dependencies.
|
This has a quite a few disadvantages, especially as it makes using custom toolchains / cross-compiling very difficult and can lead to problems with nested dependencies.
|
||||||
|
|
||||||
## Options
|
## Options
|
||||||
@ -160,25 +205,46 @@ export CPM_SOURCE_CACHE=$HOME/.cache/CPM
|
|||||||
|
|
||||||
Note that passing the variable as a configure option to CMake will always override the value set by the environmental variable.
|
Note that passing the variable as a configure option to CMake will always override the value set by the environmental variable.
|
||||||
|
|
||||||
You can use `CPM_SOURCE_CACHE` on GitHub Actions workflows [cache](https://github.com/actions/cache) and combine it with ccache, to make your CI faster. See the [wiki](https://github.com/TheLartians/CPM.cmake/wiki/Caching-with-CPM.cmake-and-ccache-on-GitHub-Actions) for more info.
|
You can use `CPM_SOURCE_CACHE` on GitHub Actions workflows [cache](https://github.com/actions/cache) and combine it with ccache, to make your CI faster. See the [wiki](https://github.com/cpm-cmake/CPM.cmake/wiki/Caching-with-CPM.cmake-and-ccache-on-GitHub-Actions) for more info.
|
||||||
|
|
||||||
|
The directory where the version for a project is stored is by default the hash of the arguments to `CPMAddPackage()`.
|
||||||
|
If for instance the patch command uses external files, the directory name can be set with the argument `CUSTOM_CACHE_KEY`.
|
||||||
|
|
||||||
### CPM_DOWNLOAD_ALL
|
### CPM_DOWNLOAD_ALL
|
||||||
|
|
||||||
If set, CPM will forward all calls to `CPMFindPackage` as `CPMAddPackage`.
|
If set, CPM will forward all calls to `CPMFindPackage` as `CPMAddPackage`.
|
||||||
This is useful to create reproducible builds or to determine if the source parameters have all been set correctly.
|
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.
|
This can also be set as an environmental variable.
|
||||||
|
This can be controlled on a per package basis with the `CPM_DOWNLOAD_<dependency name>` variable.
|
||||||
|
|
||||||
### CPM_USE_LOCAL_PACKAGES
|
### 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`.
|
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.
|
If the option `CPM_LOCAL_PACKAGES_ONLY` is set, CPM will emit an error if the dependency is not found locally.
|
||||||
These options can also be set as environmental variables.
|
These options can also be set as environmental variables.
|
||||||
|
|
||||||
|
In the case that `find_package` requires additional arguments, the parameter `FIND_PACKAGE_ARGUMENTS` may be specified in the `CPMAddPackage` call. The value of this parameter will be forwarded to `find_package`.
|
||||||
|
|
||||||
|
Note that this does not apply to dependencies that have been defined with a truthy `FORCE` parameter. These will be added as defined.
|
||||||
|
|
||||||
|
### CPM_DONT_UPDATE_MODULE_PATH
|
||||||
|
|
||||||
|
By default, CPM will override any `find_package` commands to use the CPM downloaded version.
|
||||||
|
This is equivalent to the `OVERRIDE_FIND_PACKAGE` FetchContent option, which has no effect in CPM.
|
||||||
|
To disable this behaviour set the `CPM_DONT_UPDATE_MODULE_PATH` option.
|
||||||
|
This will not work for `find_package(CONFIG)` in CMake versions before 3.24.
|
||||||
|
|
||||||
|
### CPM_USE_NAMED_CACHE_DIRECTORIES
|
||||||
|
|
||||||
|
If set, CPM use additional directory level in cache to improve readability of packages names in IDEs like CLion. It changes cache structure, so all dependencies are downloaded again. There is no problem to mix both structures in one cache directory but then there may be 2 copies of some dependencies.
|
||||||
|
This can also be set as an environmental variable.
|
||||||
|
|
||||||
## Local package override
|
## Local package override
|
||||||
|
|
||||||
Library developers are often in the situation where they work on a locally checked out dependency at the same time as on a consumer project.
|
Library developers are often in the situation where they work on a locally checked out dependency at the same time as on a consumer project.
|
||||||
It is possible to override the consumer's dependency with the version by supplying the CMake option `CPM_<dependency name>_SOURCE` set to the absolute path of the local library.
|
It is possible to override the consumer's dependency with the version by supplying the CMake option `CPM_<dependency name>_SOURCE` set to the absolute path of the local library.
|
||||||
For example, to use the local version of the dependency `Dep` at the path `/path/to/dep`, the consumer can be built with the following command.
|
For example, to use the local version of the dependency `Dep` at the path `/path/to/dep`, the consumer can be built with the following command.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cmake -Bbuild -DCPM_Dep_SOURCE=/path/to/dep
|
cmake -Bbuild -DCPM_Dep_SOURCE=/path/to/dep
|
||||||
@ -201,11 +267,27 @@ cmake -Bbuild
|
|||||||
cmake --build build --target cpm-update-package-lock
|
cmake --build build --target cpm-update-package-lock
|
||||||
```
|
```
|
||||||
|
|
||||||
See the [wiki](https://github.com/TheLartians/CPM.cmake/wiki/Package-lock) for more info.
|
See the [wiki](https://github.com/cpm-cmake/CPM.cmake/wiki/Package-lock) for more info.
|
||||||
|
|
||||||
|
## Private repositories and CI
|
||||||
|
|
||||||
|
When using CPM.cmake with private repositories, there may be a need to provide an [access token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token) to be able to clone other projects. Instead of providing the token in CMake, we recommend to provide the regular URL and use [git-config](https://git-scm.com/docs/git-config) to rewrite the URLs to include the token.
|
||||||
|
|
||||||
|
As an example, you could include one of the following in your CI script.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Github
|
||||||
|
git config --global url."https://${USERNAME}:${TOKEN}@github.com".insteadOf "https://github.com"
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# GitLab
|
||||||
|
git config --global url."https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com".insteadOf "https://gitlab.com"
|
||||||
|
```
|
||||||
|
|
||||||
## Built with CPM.cmake
|
## Built with CPM.cmake
|
||||||
|
|
||||||
Some amazing projects that are built using the CPM.cmake package manager.
|
Some amazing projects that are built using the CPM.cmake package manager.
|
||||||
If you know others, feel free to add them here through a PR.
|
If you know others, feel free to add them here through a PR.
|
||||||
|
|
||||||
<table>
|
<table>
|
||||||
@ -235,60 +317,147 @@ If you know others, feel free to add them here through a PR.
|
|||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<a href="https://git.io/liblava">
|
||||||
|
<p align="center">
|
||||||
|
<img src="https://github.com/liblava.png" alt="liblava" width="100pt" />
|
||||||
|
</p>
|
||||||
|
<p align="center"><b>liblava - Modern Vulkan library</b></p>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a href="https://github.com/variar/klogg">
|
||||||
|
<p align="center">
|
||||||
|
<img src="https://github.com/variar/klogg/blob/master/src/app/images/hicolor/scalable/klogg.svg" alt="klogg" width="100pt" />
|
||||||
|
</p>
|
||||||
|
<p align="center"><b>klogg - fast advanced log explorer</b></p>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a href="https://github.com/MethanePowered/MethaneKit">
|
||||||
|
<p align="center">
|
||||||
|
<img src="https://github.com/MethanePowered/MethaneKit/raw/master/Docs/Images/Logo/MethaneLogoSmall.png" alt="MethaneKit" width="100pt" />
|
||||||
|
</p>
|
||||||
|
<p align="center"><b>Methane Kit - modern 3D graphics rendering framework</b></p>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<a href="https://github.com/jhasse/jngl">
|
||||||
|
<p align="center">
|
||||||
|
<img src="https://github.com/jhasse/jngl/raw/master/doc/jngl-logo.svg" alt="JNGL" width="100pt" />
|
||||||
|
</p>
|
||||||
|
<p align="center"><b>JNGL - easy to use cross-platform 2D game library</b></p>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a href="https://github.com/sillydan1/aaltitoad">
|
||||||
|
<p align="center">
|
||||||
|
<img src="https://github.com/sillydan1/aaltitoad/raw/v1.1.0/.github/resources/logo/toad_only.svg" alt="aaltitoad" width="100pt" />
|
||||||
|
</p>
|
||||||
|
<p align="center"><b>AALTITOAD - verifier and simulator for Tick Tock Automata</b></p>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a href="https://github.com/ZIMO-Elektronik">
|
||||||
|
<p align="center">
|
||||||
|
<img src="https://avatars.githubusercontent.com/u/117935012?s=400&u=9a871a46dd13437f0adcae166e9efbe518ff0b99&v=4" alt="ZIMO-Elektronik" width="100pt" />
|
||||||
|
</p>
|
||||||
|
<p align="center"><b>ZIMO-Elektronik</b></p>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<a href="https://github.com/ada-url/ada">
|
||||||
|
<p align="center">
|
||||||
|
<img src="https://avatars.githubusercontent.com/u/120840559?s=200&v=4" alt="ada" width="100pt" />
|
||||||
|
</p>
|
||||||
|
<p align="center"><b>ada - WHATWG-compliant and fast URL parser written in modern C++</b></p>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a href="https://github.com/exaloop/codon">
|
||||||
|
<p align="center">
|
||||||
|
<img src="https://github.com/exaloop/codon/blob/develop/docs/img/logo.png?raw=true" alt="codon" width="100pt" />
|
||||||
|
</p>
|
||||||
|
<p align="center"><b>codon - A high-performance, zero-overhead, extensible Python compiler using LLVM</b></p>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a href="https://github.com/RoaringBitmap/CRoaring">
|
||||||
|
<p align="center">
|
||||||
|
<img src="https://avatars.githubusercontent.com/u/16548876?s=200&v=4" alt="CRoaring" width="100pt" />
|
||||||
|
</p>
|
||||||
|
<p align="center"><b>CRoaring - Roaring bitmaps in C (and C++), with SIMD (AVX2, AVX-512 and NEON) optimizations: used by Apache Doris, ClickHouse, and StarRocks</b></p>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
## Snippets
|
## Snippets
|
||||||
|
|
||||||
These examples demonstrate how to include some well-known projects with CPM.
|
These examples demonstrate how to include some well-known projects with CPM.
|
||||||
See the [wiki](https://github.com/TheLartians/CPM.cmake/wiki/More-Snippets) for more snippets.
|
See the [wiki](https://github.com/cpm-cmake/CPM.cmake/wiki/More-Snippets) for more snippets.
|
||||||
|
|
||||||
### [Catch2](https://github.com/catchorg/Catch2)
|
### [Catch2](https://github.com/catchorg/Catch2)
|
||||||
|
|
||||||
```cmake
|
```cmake
|
||||||
CPMAddPackage(
|
CPMAddPackage("gh:catchorg/Catch2@2.5.0")
|
||||||
NAME Catch2
|
|
||||||
GITHUB_REPOSITORY catchorg/Catch2
|
|
||||||
VERSION 2.5.0
|
|
||||||
)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### [Boost (via boost-cmake)](https://github.com/Orphis/boost-cmake)
|
### [Range-v3](https://github.com/ericniebler/range-v3)
|
||||||
|
|
||||||
```CMake
|
```Cmake
|
||||||
CPMAddPackage(
|
CPMAddPackage("gh:ericniebler/range-v3#0.12.0")
|
||||||
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)
|
### [Yaml-cpp](https://github.com/jbeder/yaml-cpp)
|
||||||
|
|
||||||
```CMake
|
```CMake
|
||||||
|
# as the tag is in an unusual format, we need to explicitly specify the version
|
||||||
|
CPMAddPackage("gh:jbeder/yaml-cpp#yaml-cpp-0.6.3@0.6.3")
|
||||||
|
```
|
||||||
|
|
||||||
|
### [nlohmann/json](https://github.com/nlohmann/json)
|
||||||
|
|
||||||
|
```cmake
|
||||||
CPMAddPackage(
|
CPMAddPackage(
|
||||||
NAME yaml-cpp
|
URI "gh:nlohmann/json@3.9.1"
|
||||||
GITHUB_REPOSITORY jbeder/yaml-cpp
|
OPTIONS "JSON_BuildTests OFF"
|
||||||
# 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
|
### [Boost](https://github.com/boostorg/boost)
|
||||||
OPTIONS
|
|
||||||
"YAML_CPP_BUILD_TESTS Off"
|
Boost is a large project and will take a while to download. Using
|
||||||
"YAML_CPP_BUILD_CONTRIB Off"
|
`CPM_SOURCE_CACHE` is strongly recommended. Cloning moves much more
|
||||||
"YAML_CPP_BUILD_TOOLS Off"
|
data than a source archive, so this sample will use a compressed
|
||||||
|
source archive (tar.xz) release from Boost's github page.
|
||||||
|
|
||||||
|
```CMake
|
||||||
|
# boost is a huge project and directly downloading the 'alternate release'
|
||||||
|
# from github is much faster than recursively cloning the repo.
|
||||||
|
CPMAddPackage(
|
||||||
|
NAME Boost
|
||||||
|
VERSION 1.84.0
|
||||||
|
URL https://github.com/boostorg/boost/releases/download/boost-1.84.0/boost-1.84.0.tar.xz
|
||||||
|
URL_HASH SHA256=2e64e5d79a738d0fa6fb546c6e5c2bd28f88d268a2a080546f74e5ff98f29d0e
|
||||||
|
OPTIONS "BOOST_ENABLE_CMAKE ON"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
For a working example of using CPM to download and configure the Boost C++ Libraries see [here](examples/boost).
|
||||||
|
|
||||||
|
### [cxxopts](https://github.com/jarro2783/cxxopts)
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
# the install option has to be explicitly set to allow installation
|
||||||
|
CPMAddPackage(
|
||||||
|
URI "gh:jarro2783/cxxopts@2.2.1"
|
||||||
|
OPTIONS "CXXOPTS_BUILD_EXAMPLES NO" "CXXOPTS_BUILD_TESTS NO" "CXXOPTS_ENABLE_INSTALL YES"
|
||||||
)
|
)
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -296,50 +465,13 @@ CPMAddPackage(
|
|||||||
|
|
||||||
```cmake
|
```cmake
|
||||||
CPMAddPackage(
|
CPMAddPackage(
|
||||||
NAME benchmark
|
URI "gh:google/benchmark@1.5.2"
|
||||||
GITHUB_REPOSITORY google/benchmark
|
OPTIONS "BENCHMARK_ENABLE_TESTING Off"
|
||||||
VERSION 1.4.1
|
|
||||||
OPTIONS
|
|
||||||
"BENCHMARK_ENABLE_TESTING Off"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
if (benchmark_ADDED)
|
if(benchmark_ADDED)
|
||||||
# compile with C++17
|
# enable c++11 to avoid compilation errors
|
||||||
set_target_properties(benchmark PROPERTIES CXX_STANDARD 17)
|
set_target_properties(benchmark PROPERTIES CXX_STANDARD 11)
|
||||||
endif()
|
|
||||||
```
|
|
||||||
|
|
||||||
### [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()
|
endif()
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -371,4 +503,86 @@ For a full example on using CPM to download and configure lua with sol2 see [her
|
|||||||
|
|
||||||
### Full Examples
|
### Full Examples
|
||||||
|
|
||||||
See the [examples directory](https://github.com/TheLartians/CPM.cmake/tree/master/examples) for full examples with source code and check out the [wiki](https://github.com/TheLartians/CPM.cmake/wiki/More-Snippets) for many more example snippets.
|
See the [examples directory](https://github.com/cpm-cmake/CPM.cmake/tree/master/examples) for full examples with source code and check out the [wiki](https://github.com/cpm-cmake/CPM.cmake/wiki/More-Snippets) for many more example snippets.
|
||||||
|
|
||||||
|
## Source Archives from GitHub
|
||||||
|
|
||||||
|
Using a compressed source archive is usually much faster than a shallow
|
||||||
|
clone. Optionally, you can verify the integrity using
|
||||||
|
[SHA256](https://en.wikipedia.org/wiki/SHA-2) or similar. Setting the hash is useful to ensure a
|
||||||
|
specific source is imported, especially since tags, branches, and
|
||||||
|
archives can change.
|
||||||
|
|
||||||
|
Let's look at adding [spdlog](https://github.com/gabime/spdlog) to a project:
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
CPMAddPackage(
|
||||||
|
NAME spdlog
|
||||||
|
URL https://github.com/gabime/spdlog/archive/refs/tags/v1.12.0.zip
|
||||||
|
URL_HASH SHA256=6174bf8885287422a6c6a0312eb8a30e8d22bcfcee7c48a6d02d1835d7769232
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
URL_HASH is optional, but it's a good idea for releases.
|
||||||
|
|
||||||
|
|
||||||
|
### Identifying the URL
|
||||||
|
|
||||||
|
Information for determining the URL is found
|
||||||
|
[here](https://docs.github.com/en/repositories/working-with-files/using-files/downloading-source-code-archives#source-code-archive-urls).
|
||||||
|
|
||||||
|
|
||||||
|
#### Release
|
||||||
|
|
||||||
|
Not every software package provides releases, but for those that do,
|
||||||
|
they can be found on the release page of the project. In a browser,
|
||||||
|
the URL of the specific release is determined in a browser is
|
||||||
|
determined by right clicking and selecting `Copy link address` (or
|
||||||
|
similar) for the desired release. This is the value you will use in
|
||||||
|
the URL section.
|
||||||
|
|
||||||
|
This is the URL for spdlog release 1.13.0 in zip format:
|
||||||
|
`https://github.com/gabime/spdlog/archive/refs/tags/v1.13.0.zip`
|
||||||
|
|
||||||
|
|
||||||
|
#### Branch
|
||||||
|
|
||||||
|
The URL for branches is non-obvious from a browser. But it's still fairly easy to figure it out. The format is as follows:
|
||||||
|
|
||||||
|
`https://github.com/<user>/<name>/archive/refs/heads/<branch-name>.<archive-type>`
|
||||||
|
|
||||||
|
Archive type can be one of `tar.gz` or `zip`.
|
||||||
|
|
||||||
|
The URL for branch `v2.x` of spdlog is:
|
||||||
|
`https://github.com/gabime/spdlog/archive/refs/heads/v2.x.tar.gz`
|
||||||
|
|
||||||
|
|
||||||
|
#### Tag
|
||||||
|
|
||||||
|
Tags are similar, but with this format:
|
||||||
|
|
||||||
|
`https://github.com/<user>/<name>/archive/refs/tags/<tag-name>.<archive-type>`
|
||||||
|
|
||||||
|
Tag `v1.8.5` of spdlog is this:
|
||||||
|
|
||||||
|
`https://github.com/gabime/spdlog/archive/refs/tags/v1.8.5.tar.gz`
|
||||||
|
|
||||||
|
Exactly like the release.
|
||||||
|
|
||||||
|
|
||||||
|
#### Commit
|
||||||
|
|
||||||
|
If a specific commit contains the code you need, it's defined as follows:
|
||||||
|
|
||||||
|
`https://github.com/<user>/<name>/archive/<commit-hash>.<archive-type>`
|
||||||
|
|
||||||
|
Example:
|
||||||
|
`https://github.com/gabime/spdlog/archive/c1569a3d293a6b511ecb9c18b2298826c9578d9f.tar.gz`
|
||||||
|
|
||||||
|
|
||||||
|
### Determining the Hash
|
||||||
|
|
||||||
|
The following snippet illustrates determining the SHA256 hash on a linux machine using `wget` and `sha256sum`:
|
||||||
|
```bash
|
||||||
|
wget https://github.com/gabime/spdlog/archive/refs/tags/v1.13.0.zip -O - | sha256sum
|
||||||
|
```
|
||||||
|
75
cmake/.cmake-format-additional_commands-cpm
Normal file
75
cmake/.cmake-format-additional_commands-cpm
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
parse:
|
||||||
|
additional_commands:
|
||||||
|
cpmaddpackage:
|
||||||
|
pargs:
|
||||||
|
nargs: '*'
|
||||||
|
flags: []
|
||||||
|
spelling: CPMAddPackage
|
||||||
|
kwargs: &cpmaddpackagekwargs
|
||||||
|
NAME: 1
|
||||||
|
FORCE: 1
|
||||||
|
VERSION: 1
|
||||||
|
GIT_TAG: 1
|
||||||
|
DOWNLOAD_ONLY: 1
|
||||||
|
GITHUB_REPOSITORY: 1
|
||||||
|
GITLAB_REPOSITORY: 1
|
||||||
|
GIT_REPOSITORY: 1
|
||||||
|
SVN_REPOSITORY: 1
|
||||||
|
SVN_REVISION: 1
|
||||||
|
SOURCE_DIR: 1
|
||||||
|
DOWNLOAD_COMMAND: 1
|
||||||
|
FIND_PACKAGE_ARGUMENTS: 1
|
||||||
|
NO_CACHE: 1
|
||||||
|
GIT_SHALLOW: 1
|
||||||
|
URL: 1
|
||||||
|
URL_HASH: 1
|
||||||
|
URL_MD5: 1
|
||||||
|
DOWNLOAD_NAME: 1
|
||||||
|
DOWNLOAD_NO_EXTRACT: 1
|
||||||
|
HTTP_USERNAME: 1
|
||||||
|
HTTP_PASSWORD: 1
|
||||||
|
EXCLUDE_FROM_ALL: 1
|
||||||
|
SYSTEM: 1
|
||||||
|
SOURCE_SUBDIR: 1
|
||||||
|
PATCHES: +
|
||||||
|
OPTIONS: +
|
||||||
|
cpmfindpackage:
|
||||||
|
pargs:
|
||||||
|
nargs: '*'
|
||||||
|
flags: []
|
||||||
|
spelling: CPMFindPackage
|
||||||
|
kwargs: *cpmaddpackagekwargs
|
||||||
|
cpmdeclarepackage:
|
||||||
|
pargs:
|
||||||
|
nargs: '*'
|
||||||
|
flags: []
|
||||||
|
spelling: CPMDeclarePackage
|
||||||
|
kwargs: *cpmaddpackagekwargs
|
||||||
|
packageproject:
|
||||||
|
pargs:
|
||||||
|
nargs: '*'
|
||||||
|
flags: []
|
||||||
|
spelling: packageProject
|
||||||
|
kwargs:
|
||||||
|
NAME: 1
|
||||||
|
VERSION: 1
|
||||||
|
NAMESPACE: 1
|
||||||
|
INCLUDE_DIR: 1
|
||||||
|
INCLUDE_DESTINATION: 1
|
||||||
|
INCLUDE_HEADER_PATTERN: 1
|
||||||
|
BINARY_DIR: 1
|
||||||
|
COMPATIBILITY: 1
|
||||||
|
VERSION_HEADER: 1
|
||||||
|
EXPORT_HEADER: 1
|
||||||
|
DISABLE_VERSION_SUFFIX: 1
|
||||||
|
CPACK: 1
|
||||||
|
DEPENDENCIES: +
|
||||||
|
cpmusepackagelock:
|
||||||
|
pargs: 1
|
||||||
|
spelling: CPMUsePackageLock
|
||||||
|
cpmregisterpackage:
|
||||||
|
pargs: 1
|
||||||
|
spelling: CPMRegisterPackage
|
||||||
|
cpmgetpackageversion:
|
||||||
|
pargs: 2
|
||||||
|
spelling: CPMGetPackageVersion
|
954
cmake/CPM.cmake
954
cmake/CPM.cmake
File diff suppressed because it is too large
Load Diff
@ -1,4 +1,9 @@
|
|||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
#
|
||||||
|
# SPDX-FileCopyrightText: Copyright (c) 2019-2023 Lars Melchior and contributors
|
||||||
|
|
||||||
set(CPM_DOWNLOAD_VERSION 1.0.0-development-version)
|
set(CPM_DOWNLOAD_VERSION 1.0.0-development-version)
|
||||||
|
set(CPM_HASH_SUM "CPM_HASH_SUM_PLACEHOLDER")
|
||||||
|
|
||||||
if(CPM_SOURCE_CACHE)
|
if(CPM_SOURCE_CACHE)
|
||||||
set(CPM_DOWNLOAD_LOCATION "${CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
|
set(CPM_DOWNLOAD_LOCATION "${CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
|
||||||
@ -8,12 +13,12 @@ else()
|
|||||||
set(CPM_DOWNLOAD_LOCATION "${CMAKE_BINARY_DIR}/cmake/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
|
set(CPM_DOWNLOAD_LOCATION "${CMAKE_BINARY_DIR}/cmake/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT (EXISTS ${CPM_DOWNLOAD_LOCATION}))
|
# Expand relative path. This is important if the provided path contains a tilde (~)
|
||||||
message(STATUS "Downloading CPM.cmake to ${CPM_DOWNLOAD_LOCATION}")
|
get_filename_component(CPM_DOWNLOAD_LOCATION ${CPM_DOWNLOAD_LOCATION} ABSOLUTE)
|
||||||
file(DOWNLOAD
|
|
||||||
https://github.com/TheLartians/CPM.cmake/releases/download/v${CPM_DOWNLOAD_VERSION}/CPM.cmake
|
file(DOWNLOAD
|
||||||
${CPM_DOWNLOAD_LOCATION}
|
https://github.com/cpm-cmake/CPM.cmake/releases/download/v${CPM_DOWNLOAD_VERSION}/CPM.cmake
|
||||||
)
|
${CPM_DOWNLOAD_LOCATION} EXPECTED_HASH SHA256=${CPM_HASH_SUM}
|
||||||
endif()
|
)
|
||||||
|
|
||||||
include(${CPM_DOWNLOAD_LOCATION})
|
include(${CPM_DOWNLOAD_LOCATION})
|
||||||
|
@ -3,13 +3,25 @@ function(ASSERT_EQUAL)
|
|||||||
message(FATAL_ERROR "assertion failed: invalid argument count: ${ARGC}")
|
message(FATAL_ERROR "assertion failed: invalid argument count: ${ARGC}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT ${ARGV0} STREQUAL ${ARGV1})
|
if(NOT "${ARGV0}" STREQUAL "${ARGV1}")
|
||||||
message(FATAL_ERROR "assertion failed: '${ARGV0}' != '${ARGV1}'")
|
message(FATAL_ERROR "assertion failed: '${ARGV0}' != '${ARGV1}'")
|
||||||
else()
|
else()
|
||||||
message(STATUS "test passed: '${ARGV0}' == '${ARGV1}'")
|
message(STATUS "test passed: '${ARGV0}' == '${ARGV1}'")
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
function(ASSERT_NOT_EQUAL)
|
||||||
|
if(NOT ARGC EQUAL 2)
|
||||||
|
message(FATAL_ERROR "assertion failed: invalid argument count: ${ARGC}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if("${ARGV0}" STREQUAL "${ARGV1}")
|
||||||
|
message(FATAL_ERROR "assertion failed: '${ARGV0}' == '${ARGV1}'")
|
||||||
|
else()
|
||||||
|
message(STATUS "test passed: '${ARGV0}' != '${ARGV1}'")
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
function(ASSERT_EMPTY)
|
function(ASSERT_EMPTY)
|
||||||
if(NOT ARGC EQUAL 0)
|
if(NOT ARGC EQUAL 0)
|
||||||
message(FATAL_ERROR "assertion failed: input ${ARGC} not empty: '${ARGV}'")
|
message(FATAL_ERROR "assertion failed: input ${ARGC} not empty: '${ARGV}'")
|
||||||
@ -20,7 +32,15 @@ function(ASSERT_DEFINED KEY)
|
|||||||
if(DEFINED ${KEY})
|
if(DEFINED ${KEY})
|
||||||
message(STATUS "test passed: '${KEY}' is defined")
|
message(STATUS "test passed: '${KEY}' is defined")
|
||||||
else()
|
else()
|
||||||
message(FATAL_ERROR "assertion failed: '${KEY}' is not defiend")
|
message(FATAL_ERROR "assertion failed: '${KEY}' is not defined")
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(ASSERT_NOT_DEFINED KEY)
|
||||||
|
if(DEFINED ${KEY})
|
||||||
|
message(FATAL_ERROR "assertion failed: '${KEY}' is defined (${${KEY}})")
|
||||||
|
else()
|
||||||
|
message(STATUS "test passed: '${KEY}' is not defined")
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
@ -28,7 +48,15 @@ function(ASSERT_TRUTHY KEY)
|
|||||||
if(${${KEY}})
|
if(${${KEY}})
|
||||||
message(STATUS "test passed: '${KEY}' is set truthy")
|
message(STATUS "test passed: '${KEY}' is set truthy")
|
||||||
else()
|
else()
|
||||||
message(FATAL_ERROR "assertion failed: value of '${KEY}' is not true (${${KEY}})")
|
message(FATAL_ERROR "assertion failed: value of '${KEY}' is not truthy (${${KEY}})")
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(ASSERT_FALSY KEY)
|
||||||
|
if(${${KEY}})
|
||||||
|
message(FATAL_ERROR "assertion failed: value of '${KEY}' is not falsy (${${KEY}})")
|
||||||
|
else()
|
||||||
|
message(STATUS "test passed: '${KEY}' is set falsy")
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
@ -51,3 +79,16 @@ function(ASSERT_NOT_EXISTS file)
|
|||||||
message(FATAL_ERROR "assertion failed: file ${file} exists")
|
message(FATAL_ERROR "assertion failed: file ${file} exists")
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
function(ASSERT_CONTENTS_EQUAL file content)
|
||||||
|
if(EXISTS ${file})
|
||||||
|
file(READ ${file} file_content)
|
||||||
|
if(content STREQUAL file_content)
|
||||||
|
message(STATUS "test passed: '${file}' exists and contains '${content}'")
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "assertion failed: file '${file}' does not contain expected content.")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "assertion failed: file '${file} does not exist")
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
7
examples/TestingFramework/CMakeLists.txt
Normal file
7
examples/TestingFramework/CMakeLists.txt
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||||
|
|
||||||
|
project(CPMTestingFrameworkExample)
|
||||||
|
|
||||||
|
include(../../cmake/CPM.cmake)
|
||||||
|
CPMAddPackage("bb:HEMRND/TestingFramework@0.4.1")
|
||||||
|
add_test_suites(TESTS SomeTest)
|
19
examples/TestingFramework/SomeTest.cpp
Normal file
19
examples/TestingFramework/SomeTest.cpp
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
#include <HEM/TestingFramework.hpp>
|
||||||
|
|
||||||
|
using namespace fakeit;
|
||||||
|
|
||||||
|
class ITest {
|
||||||
|
public:
|
||||||
|
virtual int getInt() = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_CASE("Testing Framework Test") {
|
||||||
|
constexpr int someIntValue = 123456;
|
||||||
|
|
||||||
|
Mock<ITest> testMock;
|
||||||
|
When(Method(testMock, getInt)).Return(someIntValue);
|
||||||
|
|
||||||
|
int readValue = testMock.get().getInt();
|
||||||
|
|
||||||
|
REQUIRE(readValue == someIntValue);
|
||||||
|
}
|
@ -8,12 +8,7 @@ include(../../cmake/CPM.cmake)
|
|||||||
|
|
||||||
find_package(Threads REQUIRED)
|
find_package(Threads REQUIRED)
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage("gh:chriskohlhoff/asio#asio-1-18-1@1.18.1")
|
||||||
NAME asio
|
|
||||||
VERSION 1.16.1
|
|
||||||
GITHUB_REPOSITORY chriskohlhoff/asio
|
|
||||||
GIT_TAG asio-1-16-1 # asio uses non-standard version tag, we must specify GIT_TAG
|
|
||||||
)
|
|
||||||
|
|
||||||
# ASIO doesn't use CMake, we have to configure it manually. Extra notes for using on Windows:
|
# ASIO doesn't use CMake, we have to configure it manually. Extra notes for using on Windows:
|
||||||
#
|
#
|
||||||
@ -24,7 +19,7 @@ CPMAddPackage(
|
|||||||
if(asio_ADDED)
|
if(asio_ADDED)
|
||||||
add_library(asio INTERFACE)
|
add_library(asio INTERFACE)
|
||||||
|
|
||||||
target_include_directories(asio INTERFACE ${asio_SOURCE_DIR}/asio/include)
|
target_include_directories(asio SYSTEM INTERFACE ${asio_SOURCE_DIR}/asio/include)
|
||||||
|
|
||||||
target_compile_definitions(asio INTERFACE ASIO_STANDALONE ASIO_NO_DEPRECATED)
|
target_compile_definitions(asio INTERFACE ASIO_STANDALONE ASIO_NO_DEPRECATED)
|
||||||
|
|
||||||
@ -65,3 +60,4 @@ endif()
|
|||||||
|
|
||||||
add_executable(CPMExampleASIOStandalone main.cpp)
|
add_executable(CPMExampleASIOStandalone main.cpp)
|
||||||
target_link_libraries(CPMExampleASIOStandalone asio)
|
target_link_libraries(CPMExampleASIOStandalone asio)
|
||||||
|
target_compile_features(CPMExampleASIOStandalone PRIVATE cxx_std_11)
|
||||||
|
@ -6,26 +6,22 @@ project(CPMExampleBenchmark)
|
|||||||
|
|
||||||
include(../../cmake/CPM.cmake)
|
include(../../cmake/CPM.cmake)
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage("gh:cpm-cmake/testpack-fibonacci@2.0")
|
||||||
NAME fibonacci
|
|
||||||
GITLAB_REPOSITORY TheLartians/Fibonacci
|
|
||||||
VERSION 2.0
|
|
||||||
)
|
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage(
|
||||||
NAME benchmark
|
NAME benchmark
|
||||||
GITHUB_REPOSITORY google/benchmark
|
GITHUB_REPOSITORY google/benchmark
|
||||||
VERSION 1.5.0
|
VERSION 1.7.1
|
||||||
OPTIONS "BENCHMARK_ENABLE_TESTING Off"
|
OPTIONS "BENCHMARK_ENABLE_TESTING Off"
|
||||||
)
|
)
|
||||||
|
|
||||||
if(benchmark_ADDED)
|
if(benchmark_ADDED)
|
||||||
# patch google benchmark target
|
# enable c++11 to avoid compilation errors
|
||||||
set_target_properties(benchmark PROPERTIES CXX_STANDARD 17)
|
set_target_properties(benchmark PROPERTIES CXX_STANDARD 11)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# ---- Executable ----
|
# ---- Executable ----
|
||||||
|
|
||||||
add_executable(CPMExampleBenchmark "main.cpp")
|
add_executable(CPMExampleBenchmark "main.cpp")
|
||||||
set_target_properties(CPMExampleBenchmark PROPERTIES CXX_STANDARD 17)
|
|
||||||
target_link_libraries(CPMExampleBenchmark fibonacci benchmark)
|
target_link_libraries(CPMExampleBenchmark fibonacci benchmark)
|
||||||
|
target_compile_features(CPMExampleBenchmark PRIVATE cxx_std_17)
|
||||||
|
@ -5,17 +5,20 @@ project(CPMExampleBoost)
|
|||||||
# ---- Create binary ----
|
# ---- Create binary ----
|
||||||
|
|
||||||
add_executable(CPMExampleBoost main.cpp)
|
add_executable(CPMExampleBoost main.cpp)
|
||||||
set_target_properties(CPMExampleBoost PROPERTIES CXX_STANDARD 17)
|
target_compile_features(CPMExampleBoost PRIVATE cxx_std_17)
|
||||||
|
|
||||||
# ---- Dependencies ----
|
# ---- Dependencies ----
|
||||||
|
|
||||||
include(../../cmake/CPM.cmake)
|
include(../../cmake/CPM.cmake)
|
||||||
|
|
||||||
CPMFindPackage(
|
CPMAddPackage(
|
||||||
NAME Boost
|
NAME Boost
|
||||||
GITHUB_REPOSITORY Orphis/boost-cmake
|
VERSION 1.86.0 # Versions less than 1.85.0 may need patches for installation targets.
|
||||||
VERSION 1.67.0
|
URL https://github.com/boostorg/boost/releases/download/boost-1.86.0/boost-1.86.0-cmake.tar.xz
|
||||||
FIND_PACKAGE_ARGUMENTS "COMPONENTS system"
|
URL_HASH SHA256=2c5ec5edcdff47ff55e27ed9560b0a0b94b07bd07ed9928b476150e16b0efc57
|
||||||
|
OPTIONS "BOOST_ENABLE_CMAKE ON" "BOOST_SKIP_INSTALL_RULES ON" # Set `OFF` for installation
|
||||||
|
"BUILD_SHARED_LIBS OFF" "BOOST_INCLUDE_LIBRARIES container\\\;asio" # Note the escapes!
|
||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(CPMExampleBoost PRIVATE Boost::system pthread)
|
# `Boost::headers` is also valid
|
||||||
|
target_link_libraries(CPMExampleBoost PRIVATE Boost::asio Boost::container)
|
||||||
|
@ -9,18 +9,26 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#include <boost/asio.hpp>
|
#include <boost/asio.hpp>
|
||||||
|
#include <boost/container/devector.hpp>
|
||||||
#include <boost/date_time/posix_time/posix_time.hpp>
|
#include <boost/date_time/posix_time/posix_time.hpp>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
void print(const boost::system::error_code& /*e*/) { std::cout << "Hello, world!" << std::endl; }
|
boost::container::devector<std::string> strings;
|
||||||
|
|
||||||
|
void print(const boost::system::error_code& /*e*/) {
|
||||||
|
for (const auto& a : strings) std::cout << a;
|
||||||
|
}
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
boost::asio::io_service io;
|
boost::asio::io_service io;
|
||||||
|
|
||||||
|
strings.push_back("Hello, world!\n");
|
||||||
|
|
||||||
boost::asio::deadline_timer t(io, boost::posix_time::seconds(1));
|
boost::asio::deadline_timer t(io, boost::posix_time::seconds(1));
|
||||||
t.async_wait(&print);
|
t.async_wait(&print);
|
||||||
|
|
||||||
io.run();
|
io.run();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from subprocess import PIPE, run
|
from subprocess import PIPE, run
|
||||||
|
|
||||||
@ -9,21 +11,23 @@ examples = [
|
|||||||
|
|
||||||
assert(len(examples) > 0)
|
assert(len(examples) > 0)
|
||||||
|
|
||||||
|
|
||||||
def runCommand(command):
|
def runCommand(command):
|
||||||
print('- %s' % command)
|
print('- %s' % command)
|
||||||
result = run(command, stdout=PIPE, stderr=PIPE, universal_newlines=True, shell=True)
|
result = run(command, stdout=PIPE, stderr=PIPE, universal_newlines=True, shell=True)
|
||||||
if result.returncode != 0:
|
if result.returncode != 0:
|
||||||
print("error while running '%s':\n" % command, ' ' + str(result.stderr).replace('\n','\n '))
|
print("error while running '%s':\n" % command, ' ' + str(result.stderr).replace('\n', '\n '))
|
||||||
exit(result.returncode)
|
exit(result.returncode)
|
||||||
return result.stdout
|
return result.stdout
|
||||||
|
|
||||||
|
|
||||||
print('')
|
print('')
|
||||||
for example in examples:
|
for example in examples:
|
||||||
print("running example %s" % example.name)
|
print("running example %s" % example.name)
|
||||||
print("================" + ('=' * len(example.name)))
|
print("================" + ('=' * len(example.name)))
|
||||||
project = Path(".") / 'build' / example.name
|
project = Path(".") / 'build' / example.name
|
||||||
configure = runCommand('cmake -H%s -B%s' % (example, project))
|
configure = runCommand('cmake -S%s -B%s' % (example, project))
|
||||||
print(' ' + '\n '.join([line for line in configure.split('\n') if 'CPM:' in line]))
|
print(' ' + '\n '.join([line for line in configure.split('\n') if 'CPM:' in line]))
|
||||||
build = runCommand('cmake --build %s -j4' % (project))
|
build = runCommand('cmake --build %s -- -j%i' % (project, os.cpu_count() / 2))
|
||||||
print(' ' + '\n '.join([line for line in build.split('\n') if 'Built target' in line]))
|
print(' ' + '\n '.join([line for line in build.split('\n') if 'Built target' in line]))
|
||||||
print('')
|
print('')
|
||||||
|
@ -6,23 +6,14 @@ project(CPMExampleCatch2)
|
|||||||
|
|
||||||
include(../../cmake/CPM.cmake)
|
include(../../cmake/CPM.cmake)
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage("gh:cpm-cmake/testpack-fibonacci@2.0")
|
||||||
NAME fibonacci
|
CPMAddPackage("gh:catchorg/Catch2@3.4.0")
|
||||||
GITHUB_REPOSITORY TheLartians/Fibonacci
|
|
||||||
VERSION 2.0
|
|
||||||
)
|
|
||||||
|
|
||||||
CPMAddPackage(
|
|
||||||
NAME Catch2
|
|
||||||
GITHUB_REPOSITORY catchorg/Catch2
|
|
||||||
VERSION 2.5.0
|
|
||||||
)
|
|
||||||
|
|
||||||
# ---- Create binary ----
|
# ---- Create binary ----
|
||||||
|
|
||||||
add_executable(CPMExampleCatch2 main.cpp)
|
add_executable(CPMExampleCatch2 main.cpp)
|
||||||
target_link_libraries(CPMExampleCatch2 fibonacci Catch2)
|
target_link_libraries(CPMExampleCatch2 fibonacci Catch2::Catch2WithMain)
|
||||||
set_target_properties(CPMExampleCatch2 PROPERTIES CXX_STANDARD 17)
|
target_compile_features(CPMExampleCatch2 PRIVATE cxx_std_17)
|
||||||
|
|
||||||
# ---- Enable testing ----
|
# ---- Enable testing ----
|
||||||
|
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
#define CATCH_CONFIG_MAIN
|
|
||||||
|
|
||||||
#include <fibonacci.h>
|
#include <fibonacci.h>
|
||||||
|
|
||||||
#include <catch2/catch.hpp>
|
#include <catch2/catch_test_macros.hpp>
|
||||||
|
|
||||||
TEST_CASE("fibonacci") {
|
TEST_CASE("fibonacci") {
|
||||||
REQUIRE(fibonacci(0) == 0);
|
REQUIRE(fibonacci(0) == 0);
|
||||||
|
@ -8,7 +8,7 @@ include(../../cmake/CPM.cmake)
|
|||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage(
|
||||||
NAME cereal
|
NAME cereal
|
||||||
VERSION 1.2.2
|
VERSION 1.3.0
|
||||||
GITHUB_REPOSITORY USCiLab/cereal
|
GITHUB_REPOSITORY USCiLab/cereal
|
||||||
OPTIONS "SKIP_PORTABILITY_TEST ON" "JUST_INSTALL_CEREAL ON"
|
OPTIONS "SKIP_PORTABILITY_TEST ON" "JUST_INSTALL_CEREAL ON"
|
||||||
)
|
)
|
||||||
@ -17,4 +17,4 @@ CPMAddPackage(
|
|||||||
|
|
||||||
add_executable(CPMExampleCereal main.cpp)
|
add_executable(CPMExampleCereal main.cpp)
|
||||||
target_link_libraries(CPMExampleCereal cereal)
|
target_link_libraries(CPMExampleCereal cereal)
|
||||||
set_target_properties(CPMExampleCereal PROPERTIES CXX_STANDARD 17)
|
target_compile_features(CPMExampleCereal PRIVATE cxx_std_17)
|
||||||
|
@ -6,15 +6,10 @@ project(CPMExampleCXXOpts)
|
|||||||
|
|
||||||
include(../../cmake/CPM.cmake)
|
include(../../cmake/CPM.cmake)
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage("gh:jarro2783/cxxopts@2.2.0")
|
||||||
NAME cxxopts
|
|
||||||
GITHUB_REPOSITORY jarro2783/cxxopts
|
|
||||||
VERSION 2.2.0
|
|
||||||
OPTIONS "CXXOPTS_BUILD_EXAMPLES Off" "CXXOPTS_BUILD_TESTS Off"
|
|
||||||
)
|
|
||||||
|
|
||||||
# ---- Create binary ----
|
# ---- Create binary ----
|
||||||
|
|
||||||
add_executable(CPMExampleCXXOpts main.cpp)
|
add_executable(CPMExampleCXXOpts main.cpp)
|
||||||
target_link_libraries(CPMExampleCXXOpts cxxopts)
|
target_link_libraries(CPMExampleCXXOpts cxxopts)
|
||||||
set_target_properties(CPMExampleCXXOpts PROPERTIES CXX_STANDARD 17)
|
target_compile_features(CPMExampleCXXOpts PRIVATE cxx_std_17)
|
||||||
|
@ -3,8 +3,14 @@
|
|||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
cxxopts::Options options("MyProgram", "One line description of MyProgram");
|
cxxopts::Options options("MyProgram", "One line description of MyProgram");
|
||||||
options.add_options()("h,help", "Show help")("d,debug", "Enable debugging")(
|
|
||||||
"f,file", "File name", cxxopts::value<std::string>());
|
// clang-format off
|
||||||
|
options.add_options()
|
||||||
|
("h,help", "Show help")
|
||||||
|
("d,debug", "Enable debugging")
|
||||||
|
("f,file", "File name", cxxopts::value<std::string>()
|
||||||
|
);
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
auto result = options.parse(argc, argv);
|
auto result = options.parse(argc, argv);
|
||||||
|
|
||||||
|
@ -6,23 +6,14 @@ project(CPMExampleDoctest)
|
|||||||
|
|
||||||
include(../../cmake/CPM.cmake)
|
include(../../cmake/CPM.cmake)
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage("gh:cpm-cmake/testpack-fibonacci@2.0")
|
||||||
NAME fibonacci
|
CPMAddPackage("gh:onqtam/doctest@2.4.9")
|
||||||
GITLAB_REPOSITORY TheLartians/Fibonacci
|
|
||||||
VERSION 2.0
|
|
||||||
)
|
|
||||||
|
|
||||||
CPMAddPackage(
|
|
||||||
NAME doctest
|
|
||||||
GITHUB_REPOSITORY onqtam/doctest
|
|
||||||
GIT_TAG 2.3.2
|
|
||||||
)
|
|
||||||
|
|
||||||
# ---- Create binary ----
|
# ---- Create binary ----
|
||||||
|
|
||||||
add_executable(CPMExampleDoctest main.cpp)
|
add_executable(CPMExampleDoctest main.cpp)
|
||||||
target_link_libraries(CPMExampleDoctest fibonacci doctest)
|
target_link_libraries(CPMExampleDoctest fibonacci doctest)
|
||||||
set_target_properties(CPMExampleDoctest PROPERTIES CXX_STANDARD 17)
|
target_compile_features(CPMExampleDoctest PRIVATE cxx_std_17)
|
||||||
|
|
||||||
# ---- Enable testing ----
|
# ---- Enable testing ----
|
||||||
|
|
||||||
|
@ -9,18 +9,17 @@ include(../../cmake/CPM.cmake)
|
|||||||
CPMAddPackage(
|
CPMAddPackage(
|
||||||
NAME EnTT
|
NAME EnTT
|
||||||
VERSION 3.1.1
|
VERSION 3.1.1
|
||||||
GITHUB_REPOSITORY skypjack/entt
|
GITHUB_REPOSITORY skypjack/entt # EnTT's CMakeLists screws with configuration options
|
||||||
# EnTT's CMakeLists screws with configuration options
|
|
||||||
DOWNLOAD_ONLY True
|
DOWNLOAD_ONLY True
|
||||||
)
|
)
|
||||||
|
|
||||||
if(EnTT_ADDED)
|
if(EnTT_ADDED)
|
||||||
add_library(EnTT INTERFACE)
|
add_library(EnTT INTERFACE)
|
||||||
target_include_directories(EnTT INTERFACE ${EnTT_SOURCE_DIR}/src)
|
target_include_directories(EnTT SYSTEM INTERFACE ${EnTT_SOURCE_DIR}/src)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# ---- Executable ----
|
# ---- Executable ----
|
||||||
|
|
||||||
add_executable(CPMEnTTExample "main.cpp")
|
add_executable(CPMEnTTExample main.cpp)
|
||||||
set_target_properties(CPMEnTTExample PROPERTIES CXX_STANDARD 17)
|
target_compile_features(CPMEnTTExample PRIVATE cxx_std_17)
|
||||||
target_link_libraries(CPMEnTTExample EnTT)
|
target_link_libraries(CPMEnTTExample EnTT)
|
||||||
|
@ -1,19 +1,15 @@
|
|||||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||||
|
|
||||||
project(CPMJSONExample)
|
project(CPMFmtExample)
|
||||||
|
|
||||||
# ---- Dependencies ----
|
# ---- Dependencies ----
|
||||||
|
|
||||||
include(../../cmake/CPM.cmake)
|
include(../../cmake/CPM.cmake)
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage("gh:fmtlib/fmt#7.1.3")
|
||||||
NAME fmt
|
|
||||||
GIT_TAG 6.1.2
|
|
||||||
GITHUB_REPOSITORY fmtlib/fmt
|
|
||||||
)
|
|
||||||
|
|
||||||
# ---- Executable ----
|
# ---- Executable ----
|
||||||
|
|
||||||
add_executable(CPMFmtExample "main.cpp")
|
add_executable(CPMFmtExample main.cpp)
|
||||||
set_target_properties(CPMFmtExample PROPERTIES CXX_STANDARD 17)
|
target_compile_features(CPMFmtExample PRIVATE cxx_std_17)
|
||||||
target_link_libraries(CPMFmtExample fmt)
|
target_link_libraries(CPMFmtExample fmt)
|
||||||
|
@ -6,17 +6,13 @@ project(CPMExampleGtest)
|
|||||||
|
|
||||||
include(../../cmake/CPM.cmake)
|
include(../../cmake/CPM.cmake)
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage("gh:cpm-cmake/testpack-fibonacci@2.0")
|
||||||
NAME fibonacci
|
|
||||||
GITLAB_REPOSITORY TheLartians/Fibonacci
|
|
||||||
VERSION 2.0
|
|
||||||
)
|
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage(
|
||||||
NAME googletest
|
NAME googletest
|
||||||
GITHUB_REPOSITORY google/googletest
|
GITHUB_REPOSITORY google/googletest
|
||||||
GIT_TAG release-1.8.1
|
GIT_TAG release-1.12.1
|
||||||
VERSION 1.8.1
|
VERSION 1.12.1
|
||||||
OPTIONS "INSTALL_GTEST OFF" "gtest_force_shared_crt"
|
OPTIONS "INSTALL_GTEST OFF" "gtest_force_shared_crt"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -24,7 +20,7 @@ CPMAddPackage(
|
|||||||
|
|
||||||
add_executable(CPMExampleGtest main.cpp)
|
add_executable(CPMExampleGtest main.cpp)
|
||||||
target_link_libraries(CPMExampleGtest fibonacci gtest gtest_main gmock)
|
target_link_libraries(CPMExampleGtest fibonacci gtest gtest_main gmock)
|
||||||
set_target_properties(CPMExampleGtest PROPERTIES CXX_STANDARD 17)
|
target_compile_features(CPMExampleGtest PRIVATE cxx_std_17)
|
||||||
|
|
||||||
# ---- Enable testing ----
|
# ---- Enable testing ----
|
||||||
|
|
||||||
|
28
examples/highway/CMakeLists.txt
Normal file
28
examples/highway/CMakeLists.txt
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||||
|
|
||||||
|
project(CPMExamplePatchHighway)
|
||||||
|
|
||||||
|
# ---- Dependencies ----
|
||||||
|
|
||||||
|
include(../../cmake/CPM.cmake)
|
||||||
|
|
||||||
|
# Google's highway Includes a SIMD sorting function that is faster than x86-simd-sort for larger
|
||||||
|
# arrays. See: https://github.com/google/highway/blob/master/g3doc/quick_reference.md
|
||||||
|
CPMAddPackage(
|
||||||
|
NAME highway
|
||||||
|
URL https://github.com/google/highway/archive/refs/tags/1.1.0.tar.gz
|
||||||
|
URL_HASH SHA256=354a8b4539b588e70b98ec70844273e3f2741302c4c377bcc4e81b3d1866f7c9
|
||||||
|
PATCHES "highway.patch" # This adds SYSTEM to the includes.
|
||||||
|
OPTIONS "HWY_ENABLE_EXAMPLES OFF" "HWY_ENABLE_INSTALL OFF" "HWY_ENABLE_TESTS OFF"
|
||||||
|
)
|
||||||
|
|
||||||
|
# ---- Executable ----
|
||||||
|
|
||||||
|
if(LINUX)
|
||||||
|
# This would cause a float compare error inside the highway header code if the patch is NOT
|
||||||
|
# applied.
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wfloat-equal")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_executable(CPMExamplePatchHighway "main.cpp")
|
||||||
|
target_link_libraries(CPMExamplePatchHighway hwy hwy_contrib)
|
28
examples/highway/highway.patch
Normal file
28
examples/highway/highway.patch
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
Common subdirectories: a/.bcr and b/.bcr
|
||||||
|
Common subdirectories: a/.github and b/.github
|
||||||
|
diff -u a/CMakeLists.txt b/CMakeLists.txt
|
||||||
|
--- a/CMakeLists.txt 2024-05-21 12:50:37.738318520 -0500
|
||||||
|
+++ b/CMakeLists.txt 2024-05-21 12:49:59.914226871 -0500
|
||||||
|
@@ -350,7 +350,7 @@
|
||||||
|
target_compile_options(hwy PRIVATE ${HWY_FLAGS})
|
||||||
|
set_property(TARGET hwy PROPERTY POSITION_INDEPENDENT_CODE ON)
|
||||||
|
set_target_properties(hwy PROPERTIES VERSION ${LIBRARY_VERSION} SOVERSION ${LIBRARY_SOVERSION})
|
||||||
|
-target_include_directories(hwy PUBLIC
|
||||||
|
+target_include_directories(hwy SYSTEM PUBLIC
|
||||||
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>
|
||||||
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
|
||||||
|
target_compile_features(hwy PUBLIC cxx_std_11)
|
||||||
|
@@ -370,7 +370,7 @@
|
||||||
|
target_compile_options(hwy_contrib PRIVATE ${HWY_FLAGS})
|
||||||
|
set_property(TARGET hwy_contrib PROPERTY POSITION_INDEPENDENT_CODE ON)
|
||||||
|
set_target_properties(hwy_contrib PROPERTIES VERSION ${LIBRARY_VERSION} SOVERSION ${LIBRARY_SOVERSION})
|
||||||
|
-target_include_directories(hwy_contrib PUBLIC
|
||||||
|
+target_include_directories(hwy_contrib SYSTEM PUBLIC
|
||||||
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>
|
||||||
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
|
||||||
|
target_compile_features(hwy_contrib PUBLIC cxx_std_11)
|
||||||
|
Common subdirectories: a/cmake and b/cmake
|
||||||
|
Common subdirectories: a/debian and b/debian
|
||||||
|
Common subdirectories: a/docs and b/docs
|
||||||
|
Common subdirectories: a/g3doc and b/g3doc
|
||||||
|
Common subdirectories: a/hwy and b/hwy
|
27
examples/highway/main.cpp
Normal file
27
examples/highway/main.cpp
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
#include <hwy/contrib/sort/vqsort.h> // hwy::VQSort() for large data sets
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include <random>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
// Use hwy::VQSort to sort larger vectors
|
||||||
|
inline void sort_large(std::vector<double>& v) {
|
||||||
|
hwy::VQSort(v.data(), v.size(), hwy::SortAscending{});
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int, char**) {
|
||||||
|
std::random_device random_device;
|
||||||
|
std::default_random_engine random_engine(random_device());
|
||||||
|
std::uniform_real_distribution<double> uniform_dist(0.0, 100.0);
|
||||||
|
|
||||||
|
const std::size_t sz = 100000;
|
||||||
|
std::vector<double> v;
|
||||||
|
v.reserve(sz);
|
||||||
|
for (std::size_t i = 0; i < sz; ++i) {
|
||||||
|
v.push_back(uniform_dist(random_engine));
|
||||||
|
}
|
||||||
|
|
||||||
|
sort_large(v);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
@ -5,22 +5,10 @@ project(CPMJSONExample)
|
|||||||
# ---- Dependencies ----
|
# ---- Dependencies ----
|
||||||
|
|
||||||
include(../../cmake/CPM.cmake)
|
include(../../cmake/CPM.cmake)
|
||||||
|
CPMAddPackage("gh:nlohmann/json@3.10.5")
|
||||||
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 ----
|
# ---- Executable ----
|
||||||
|
|
||||||
add_executable(CPMJSONExample "main.cpp")
|
add_executable(CPMJSONExample main.cpp)
|
||||||
set_target_properties(CPMJSONExample PROPERTIES CXX_STANDARD 17)
|
target_compile_features(CPMJSONExample PRIVATE cxx_std_17)
|
||||||
target_link_libraries(CPMJSONExample nlohmann_json)
|
target_link_libraries(CPMJSONExample nlohmann_json::nlohmann_json)
|
||||||
|
@ -6,19 +6,15 @@ project(CPMlinenoiseExample)
|
|||||||
|
|
||||||
include(../../cmake/CPM.cmake)
|
include(../../cmake/CPM.cmake)
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage("gh:antirez/linenoise#1.0")
|
||||||
NAME linenoise
|
|
||||||
GIT_TAG 1.0
|
|
||||||
GITHUB_REPOSITORY antirez/linenoise
|
|
||||||
)
|
|
||||||
|
|
||||||
if(linenoise_ADDED)
|
if(linenoise_ADDED)
|
||||||
add_library(linenoise ${linenoise_SOURCE_DIR}/linenoise.c)
|
add_library(linenoise ${linenoise_SOURCE_DIR}/linenoise.c)
|
||||||
target_include_directories(linenoise PUBLIC ${linenoise_SOURCE_DIR})
|
target_include_directories(linenoise SYSTEM PUBLIC ${linenoise_SOURCE_DIR})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# ---- Executable ----
|
# ---- Executable ----
|
||||||
|
|
||||||
add_executable(CPMlinenoiseExample "main.cpp")
|
add_executable(CPMlinenoiseExample main.cpp)
|
||||||
set_target_properties(CPMlinenoiseExample PROPERTIES CXX_STANDARD 17)
|
target_compile_features(CPMlinenoiseExample PRIVATE cxx_std_17)
|
||||||
target_link_libraries(CPMlinenoiseExample linenoise)
|
target_link_libraries(CPMlinenoiseExample linenoise)
|
||||||
|
@ -56,7 +56,7 @@ int main(int argc, char **argv) {
|
|||||||
int len = atoi(line + 11);
|
int len = atoi(line + 11);
|
||||||
linenoiseHistorySetMaxLen(len);
|
linenoiseHistorySetMaxLen(len);
|
||||||
} else if (line[0] == '/') {
|
} else if (line[0] == '/') {
|
||||||
printf("Unreconized command: %s\n", line);
|
printf("Unrecognized command: %s\n", line);
|
||||||
}
|
}
|
||||||
free(line);
|
free(line);
|
||||||
}
|
}
|
||||||
|
@ -6,21 +6,10 @@ project(CPMRangev3Example)
|
|||||||
|
|
||||||
include(../../cmake/CPM.cmake)
|
include(../../cmake/CPM.cmake)
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage("gh:ericniebler/range-v3#0.12.0")
|
||||||
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 ----
|
# ---- Executable ----
|
||||||
|
|
||||||
add_executable(CPMRangev3Example "main.cpp")
|
add_executable(CPMRangev3Example main.cpp)
|
||||||
set_target_properties(CPMRangev3Example PROPERTIES CXX_STANDARD 17)
|
target_compile_features(CPMRangev3Example PRIVATE cxx_std_17)
|
||||||
target_link_libraries(CPMRangev3Example range-v3)
|
target_link_libraries(CPMRangev3Example range-v3)
|
||||||
|
@ -32,7 +32,7 @@ auto is_six = [](int i) { return i == 6; };
|
|||||||
int main() {
|
int main() {
|
||||||
std::vector<int> v{6, 2, 3, 4, 5, 6};
|
std::vector<int> v{6, 2, 3, 4, 5, 6};
|
||||||
cout << std::boolalpha;
|
cout << std::boolalpha;
|
||||||
cout << "vector: " << ranges::view::all(v) << '\n';
|
cout << "vector: " << ranges::views::all(v) << '\n';
|
||||||
|
|
||||||
cout << "vector any_of is_six: " << ranges::any_of(v, is_six) << '\n';
|
cout << "vector any_of is_six: " << ranges::any_of(v, is_six) << '\n';
|
||||||
cout << "vector all_of is_six: " << ranges::all_of(v, is_six) << '\n';
|
cout << "vector all_of is_six: " << ranges::all_of(v, is_six) << '\n';
|
||||||
|
14
examples/simdjson/CMakeLists.txt
Normal file
14
examples/simdjson/CMakeLists.txt
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||||
|
|
||||||
|
project(CPMSIMDJSONExample)
|
||||||
|
|
||||||
|
# ---- Dependencies ----
|
||||||
|
|
||||||
|
include(../../cmake/CPM.cmake)
|
||||||
|
CPMAddPackage("gh:simdjson/simdjson@3.5.0")
|
||||||
|
|
||||||
|
# ---- Executable ----
|
||||||
|
|
||||||
|
add_executable(CPMSIMDJSONExample main.cpp)
|
||||||
|
target_compile_features(CPMSIMDJSONExample PRIVATE cxx_std_17)
|
||||||
|
target_link_libraries(CPMSIMDJSONExample simdjson::simdjson)
|
31
examples/simdjson/main.cpp
Normal file
31
examples/simdjson/main.cpp
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "simdjson.h"
|
||||||
|
using namespace simdjson;
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
ondemand::parser parser;
|
||||||
|
auto cars_json = R"( [
|
||||||
|
{ "make": "Toyota", "model": "Camry", "year": 2018, "tire_pressure": [ 40.1, 39.9, 37.7, 40.4 ] },
|
||||||
|
{ "make": "Kia", "model": "Soul", "year": 2012, "tire_pressure": [ 30.1, 31.0, 28.6, 28.7 ] },
|
||||||
|
{ "make": "Toyota", "model": "Tercel", "year": 1999, "tire_pressure": [ 29.8, 30.0, 30.2, 30.5 ] }
|
||||||
|
] )"_padded;
|
||||||
|
|
||||||
|
// Iterating through an array of objects
|
||||||
|
for (ondemand::object car : parser.iterate(cars_json)) {
|
||||||
|
// Accessing a field by name
|
||||||
|
std::cout << "Make/Model: " << std::string_view(car["make"]) << "/"
|
||||||
|
<< std::string_view(car["model"]) << std::endl;
|
||||||
|
|
||||||
|
// Casting a JSON element to an integer
|
||||||
|
uint64_t year = car["year"];
|
||||||
|
std::cout << "- This car is " << 2020 - year << " years old." << std::endl;
|
||||||
|
|
||||||
|
// Iterating through an array of floats
|
||||||
|
double total_tire_pressure = 0;
|
||||||
|
for (double tire_pressure : car["tire_pressure"]) {
|
||||||
|
total_tire_pressure += tire_pressure;
|
||||||
|
}
|
||||||
|
std::cout << "- Average tire pressure: " << (total_tire_pressure / 4) << std::endl;
|
||||||
|
}
|
||||||
|
}
|
@ -15,11 +15,11 @@ CPMAddPackage(
|
|||||||
|
|
||||||
if(simple_match_ADDED)
|
if(simple_match_ADDED)
|
||||||
add_library(simple_match INTERFACE IMPORTED)
|
add_library(simple_match INTERFACE IMPORTED)
|
||||||
target_include_directories(simple_match INTERFACE "${simple_match_SOURCE_DIR}/include")
|
target_include_directories(simple_match SYSTEM INTERFACE "${simple_match_SOURCE_DIR}/include")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# ---- Executable ----
|
# ---- Executable ----
|
||||||
|
|
||||||
add_executable(CPMSimpleMatchExample "main.cpp")
|
add_executable(CPMSimpleMatchExample main.cpp)
|
||||||
set_target_properties(CPMSimpleMatchExample PROPERTIES CXX_STANDARD 17)
|
target_compile_features(CPMSimpleMatchExample PRIVATE cxx_std_17)
|
||||||
target_link_libraries(CPMSimpleMatchExample simple_match)
|
target_link_libraries(CPMSimpleMatchExample simple_match)
|
||||||
|
@ -8,36 +8,29 @@ include(../../cmake/CPM.cmake)
|
|||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage(
|
||||||
NAME lua
|
NAME lua
|
||||||
GIT_REPOSITORY https://github.com/lua/lua.git
|
GITHUB_REPOSITORY lua/lua
|
||||||
VERSION 5.3.5
|
VERSION 5.3.5
|
||||||
DOWNLOAD_ONLY YES
|
DOWNLOAD_ONLY YES
|
||||||
)
|
)
|
||||||
|
|
||||||
if(lua_ADDED)
|
if(lua_ADDED)
|
||||||
# lua has no CMakeLists, so we create our own target
|
# lua has no CMakeLists, so we create our own target
|
||||||
|
|
||||||
file(GLOB lua_sources ${lua_SOURCE_DIR}/*.c)
|
file(GLOB lua_sources ${lua_SOURCE_DIR}/*.c)
|
||||||
list(REMOVE_ITEM lua_sources "${lua_SOURCE_DIR}/lua.c" "${lua_SOURCE_DIR}/luac.c")
|
list(REMOVE_ITEM lua_sources "${lua_SOURCE_DIR}/lua.c" "${lua_SOURCE_DIR}/luac.c")
|
||||||
add_library(lua STATIC ${lua_sources})
|
add_library(lua STATIC ${lua_sources})
|
||||||
|
target_include_directories(lua SYSTEM PUBLIC $<BUILD_INTERFACE:${lua_SOURCE_DIR}>)
|
||||||
target_include_directories(lua PUBLIC $<BUILD_INTERFACE:${lua_SOURCE_DIR}>)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage(
|
||||||
NAME sol2
|
NAME sol2
|
||||||
URL https://github.com/ThePhD/sol2/archive/v3.0.2.zip
|
GITHUB_REPOSITORY ThePhD/sol2
|
||||||
VERSION 3.0.2
|
VERSION 3.3.0
|
||||||
DOWNLOAD_ONLY YES
|
# fix for clang 18.1.0, see https://github.com/ThePhD/sol2/issues/1581#issuecomment-2103463524
|
||||||
|
PATCHES fix_for_clang.patch
|
||||||
)
|
)
|
||||||
|
|
||||||
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 ----
|
# ---- Executable ----
|
||||||
|
|
||||||
add_executable(CPMSol2Example "main.cpp")
|
add_executable(CPMSol2Example main.cpp)
|
||||||
set_target_properties(CPMSol2Example PROPERTIES CXX_STANDARD 17)
|
target_compile_features(CPMSol2Example PRIVATE cxx_std_17)
|
||||||
target_link_libraries(CPMSol2Example sol2)
|
target_link_libraries(CPMSol2Example sol2 lua)
|
||||||
|
18
examples/sol2/fix_for_clang.patch
Normal file
18
examples/sol2/fix_for_clang.patch
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
diff -u a/include/sol/function_types_stateless.hpp b/include/types/function_types_stateless.hpp
|
||||||
|
--- a/include/sol/function_types_stateless.hpp
|
||||||
|
+++ b/include/sol/function_types_stateless.hpp
|
||||||
|
@@ -322,7 +322,13 @@ namespace sol { namespace function_detail {
|
||||||
|
}
|
||||||
|
|
||||||
|
template <bool is_yielding, bool no_trampoline>
|
||||||
|
- static int call(lua_State* L) noexcept(std::is_nothrow_copy_assignable_v<T>) {
|
||||||
|
+ static int call(lua_State* L)
|
||||||
|
+#if SOL_IS_ON(SOL_COMPILER_CLANG)
|
||||||
|
+ // apparent regression in clang 18 - llvm/llvm-project#91362
|
||||||
|
+#else
|
||||||
|
+ noexcept(std::is_nothrow_copy_assignable_v<T>)
|
||||||
|
+#endif
|
||||||
|
+ {
|
||||||
|
int nr;
|
||||||
|
if constexpr (no_trampoline) {
|
||||||
|
nr = real_call(L);
|
@ -6,14 +6,24 @@ project(CPMSpdlogExample)
|
|||||||
|
|
||||||
include(../../cmake/CPM.cmake)
|
include(../../cmake/CPM.cmake)
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage("gh:gabime/spdlog@1.8.2")
|
||||||
NAME spdlog
|
|
||||||
GITHUB_REPOSITORY gabime/spdlog
|
# spdlog uses fmt and bundles that dependency. If you want to use fmt in your project as well, you
|
||||||
VERSION 1.7.0
|
# can let spdlog reuse fmt from CPM.cmake like this:
|
||||||
)
|
#
|
||||||
|
# cmake-format: off
|
||||||
|
#
|
||||||
|
# CPMAddPackage("gh:fmtlib/fmt#7.1.3")
|
||||||
|
# CPMAddPackage(
|
||||||
|
# GITHUB_REPOSITORY gabime/spdlog
|
||||||
|
# VERSION 1.8.2
|
||||||
|
# OPTIONS "SPDLOG_FMT_EXTERNAL 1"
|
||||||
|
# )
|
||||||
|
#
|
||||||
|
# cmake-format: on
|
||||||
|
|
||||||
# ---- Executable ----
|
# ---- Executable ----
|
||||||
|
|
||||||
add_executable(CPMSpdlogExample "main.cpp")
|
add_executable(CPMSpdlogExample main.cpp)
|
||||||
set_target_properties(CPMSpdlogExample PROPERTIES CXX_STANDARD 17)
|
target_compile_features(CPMSpdlogExample PRIVATE cxx_std_17)
|
||||||
target_link_libraries(CPMSpdlogExample spdlog)
|
target_link_libraries(CPMSpdlogExample spdlog)
|
||||||
|
20
examples/xxHash/CMakeLists.txt
Normal file
20
examples/xxHash/CMakeLists.txt
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||||
|
|
||||||
|
project(CPMxxHashExample)
|
||||||
|
|
||||||
|
# ---- Dependencies ----
|
||||||
|
|
||||||
|
include(../../cmake/CPM.cmake)
|
||||||
|
|
||||||
|
CPMAddPackage(
|
||||||
|
GITHUB_REPOSITORY Cyan4973/xxHash
|
||||||
|
GIT_TAG v0.8.2
|
||||||
|
OPTIONS "XXHASH_BUILD_ENABLE_INLINE_API OFF" "XXHASH_BUILD_XXHSUM OFF"
|
||||||
|
SOURCE_SUBDIR cmake_unofficial
|
||||||
|
)
|
||||||
|
|
||||||
|
# ---- Executable ----
|
||||||
|
|
||||||
|
add_executable(CPMxxHashExample main.cpp)
|
||||||
|
target_compile_features(CPMxxHashExample PRIVATE cxx_std_17)
|
||||||
|
target_link_libraries(CPMxxHashExample xxHash::xxhash)
|
12
examples/xxHash/main.cpp
Normal file
12
examples/xxHash/main.cpp
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#include <xxh3.h>
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
std::string example = "Hello World!";
|
||||||
|
XXH64_hash_t hash = XXH3_64bits(example.data(), example.size());
|
||||||
|
|
||||||
|
std::cout << "Hash: " << hash << std::endl;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
@ -6,18 +6,10 @@ project(CPMYamlExample)
|
|||||||
|
|
||||||
include(../../cmake/CPM.cmake)
|
include(../../cmake/CPM.cmake)
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage("gh:jbeder/yaml-cpp#yaml-cpp-0.6.3@0.6.3")
|
||||||
NAME yaml-cpp
|
|
||||||
GIT_REPOSITORY https://github.com/jbeder/yaml-cpp.git
|
|
||||||
# 0.6.2 uses deprecated CMake syntax
|
|
||||||
VERSION 0.6.3
|
|
||||||
# 0.6.3 is not released yet, so use the most recent commit
|
|
||||||
GIT_TAG 012269756149ae99745b6dafefd415843d7420bb
|
|
||||||
OPTIONS "YAML_CPP_BUILD_TESTS Off" "YAML_CPP_BUILD_CONTRIB Off" "YAML_CPP_BUILD_TOOLS Off"
|
|
||||||
)
|
|
||||||
|
|
||||||
# ---- Executable ----
|
# ---- Executable ----
|
||||||
|
|
||||||
add_executable(CPMYamlExample "main.cpp")
|
add_executable(CPMYamlExample main.cpp)
|
||||||
set_target_properties(CPMYamlExample PROPERTIES CXX_STANDARD 17)
|
target_compile_features(CPMYamlExample PRIVATE cxx_std_17)
|
||||||
target_link_libraries(CPMYamlExample yaml-cpp)
|
target_link_libraries(CPMYamlExample yaml-cpp)
|
||||||
|
@ -14,3 +14,5 @@ foreach(test ${tests})
|
|||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
add_custom_target(test-verbose COMMAND ${CMAKE_CTEST_COMMAND} -C Debug --verbose)
|
add_custom_target(test-verbose COMMAND ${CMAKE_CTEST_COMMAND} -C Debug --verbose)
|
||||||
|
|
||||||
|
add_subdirectory(style)
|
||||||
|
2
test/integration/.gitignore
vendored
Normal file
2
test/integration/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# Use this to have a local integration test which is for personal experiments
|
||||||
|
test_local.rb
|
44
test/integration/README.md
Normal file
44
test/integration/README.md
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
# CPM.cmake Integration Tests
|
||||||
|
|
||||||
|
The integration tests of CPM.cmake are written in Ruby. They use a custom integration test framework which extends the [Test::Unit](https://www.rubydoc.info/github/test-unit/test-unit/Test/Unit) library.
|
||||||
|
|
||||||
|
They require Ruby 2.7.0 or later.
|
||||||
|
|
||||||
|
## Running tests
|
||||||
|
|
||||||
|
To run all tests from the repo root execute:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ruby test/integration/runner.rb
|
||||||
|
```
|
||||||
|
|
||||||
|
The runner will run all tests and generate a report of the execution.
|
||||||
|
|
||||||
|
The current working directory doesn't matter. If you are in `<repo-root>/test/integration`, you can run simply `$ ruby runner.rb`.
|
||||||
|
|
||||||
|
You can execute with `--help` (`$ ruby runner.rb --help`) to see various configuration options of the runner like running individual tests or test cases, or ones that match a regex.
|
||||||
|
|
||||||
|
The tests themselves are situated in the Ruby scripts prefixed with `test_`. `<repo-root>/test/integration/test_*`. You can also run an individual test script. For example to only run the **basics** test case, you can execute `$ ruby test_basics.rb`
|
||||||
|
|
||||||
|
The tests generate CMake scripts and execute CMake and build toolchains. By default they do this in a directory they generate in your temp path (`/tmp/cpm-test/` on Linux). You can configure the working directory of the tests with an environment variable `CPM_INTEGRATION_TEST_DIR`. For example `$ CPM_INTEGRATION_TEST_DIR=~/mycpmtest; ruby runner.rb`
|
||||||
|
|
||||||
|
## Writing tests
|
||||||
|
|
||||||
|
Writing tests makes use of the custom integration test framework in `lib.rb`. It is a relatively small extension of Ruby's Test::Unit library.
|
||||||
|
|
||||||
|
### The Gist
|
||||||
|
|
||||||
|
* Tests cases are Ruby scripts in this directory. The file names must be prefixed with `test_`
|
||||||
|
* The script should `require_relative './lib'` to allow for individual execution (or else if will only be executable from the runner)
|
||||||
|
* A test case file should contain a single class which inherits from `IntegrationTest`. It *can* contain multiple classes, but that's bad practice as it makes individual execution harder and implies a dependency between the classes.
|
||||||
|
* There should be no dependency between the test scripts. Each should be executable individually and the order in which multiple ones are executed mustn't matter.
|
||||||
|
* The class should contain methods, also prefixed with `test_` which will be executed by the framework. In most cases there would be a single test method per class.
|
||||||
|
* In case there are multiple test methods, they will be executed in the order in which they are defined.
|
||||||
|
* The test methods should contain assertions which check for the expected state of things at various points of the test's execution.
|
||||||
|
|
||||||
|
### More
|
||||||
|
|
||||||
|
* [A basic tutorial on writing integration tests.](tutorial.md)
|
||||||
|
* [A brief reference of the integration test framework](reference.md)
|
||||||
|
* Make sure you're familiar with the [idiosyncrasies](idiosyncrasies.md) of writing integration tests
|
||||||
|
* [Some tips and tricks](tips.md)
|
98
test/integration/idiosyncrasies.md
Normal file
98
test/integration/idiosyncrasies.md
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
# Notable Idiosyncrasies When Writing Integration Tests
|
||||||
|
|
||||||
|
As an integration test framework based on a unit test framework the one created for CPM.cmake suffers from several idiosyncrasies. Make sure you familiarize yourself with them before writing integration tests.
|
||||||
|
|
||||||
|
## No shared instance variables between methods
|
||||||
|
|
||||||
|
The runner will create an instance of the test class for each test method. This means that instance variables defined in a test method, *will not* be visible in another. For example:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
class MyTest < IntegrationTest
|
||||||
|
def test_something
|
||||||
|
@x = 123
|
||||||
|
assert_equal 123, @x # Pass. @x is 123
|
||||||
|
end
|
||||||
|
def test_something_else
|
||||||
|
assert_equal 123, @x # Fail! @x would be nil here
|
||||||
|
end
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
There are hacks around sharing Ruby state between methods, but we choose not to use them. If you want to initialize something for all test methods, use `setup`.
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
class MyTest < IntegrationTest
|
||||||
|
def setup
|
||||||
|
@x = 123
|
||||||
|
end
|
||||||
|
def test_something
|
||||||
|
assert_equal 123, @x # Pass. @x is 123 thanks to setup
|
||||||
|
end
|
||||||
|
def test_something_else
|
||||||
|
assert_equal 123, @x # Pass. @x is 123 thanks to setup
|
||||||
|
end
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
## `IntegrationTest` makes use of `Test::Unit::TestCase#cleanup`
|
||||||
|
|
||||||
|
After each test method the `cleanup` method is called thanks to Test::Unit. If you require the use of `cleanup` in your own tests, make sure you call `super` to also run `IntegrationTest#cleanup`.
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
class MyTest < IntegrationTest
|
||||||
|
def cleanup
|
||||||
|
super
|
||||||
|
my_cleanup
|
||||||
|
end
|
||||||
|
# ...
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
## It's better to have assertions in test methods as opposed to helper methods
|
||||||
|
|
||||||
|
Test::Unit will display a helpful message if an assertion has failed. It will also include the line of code in the test method which caused the failure. However if an assertion is not in the test method, it will display the line which calls the method in which it is. So, please try, to have most assertions in test methods (though we acknowledge that in certain cases this is not practical). For example, if you only require scopes, try using lambdas.
|
||||||
|
|
||||||
|
Instead of this:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
class MyTest < IntegrationTest
|
||||||
|
def test_something
|
||||||
|
do_a
|
||||||
|
do_b
|
||||||
|
do_c
|
||||||
|
end
|
||||||
|
def do_a
|
||||||
|
# ...
|
||||||
|
end
|
||||||
|
def do_b
|
||||||
|
# ...
|
||||||
|
assert false # will display failed line as "do_b"
|
||||||
|
end
|
||||||
|
def do_c
|
||||||
|
# ...
|
||||||
|
end
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
...write this:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
class MyTest < IntegrationTest
|
||||||
|
def test_something
|
||||||
|
do_a = -> {
|
||||||
|
# ...
|
||||||
|
}
|
||||||
|
do_b = -> {
|
||||||
|
# ...
|
||||||
|
assert false # will display failed line as "assert false"
|
||||||
|
}
|
||||||
|
do_c = -> {
|
||||||
|
# ...
|
||||||
|
}
|
||||||
|
|
||||||
|
do_a.()
|
||||||
|
do_b.()
|
||||||
|
do_c.()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
```
|
206
test/integration/lib.rb
Normal file
206
test/integration/lib.rb
Normal file
@ -0,0 +1,206 @@
|
|||||||
|
require 'fileutils'
|
||||||
|
require 'open3'
|
||||||
|
require 'tmpdir'
|
||||||
|
require 'test/unit'
|
||||||
|
|
||||||
|
module TestLib
|
||||||
|
TMP_DIR = File.expand_path(ENV['CPM_INTEGRATION_TEST_DIR'] || File.join(Dir.tmpdir, 'cpm-test', Time.now.strftime('%Y_%m_%d-%H_%M_%S')))
|
||||||
|
CPM_PATH = File.expand_path('../../cmake/CPM.cmake', __dir__)
|
||||||
|
|
||||||
|
TEMPLATES_DIR = File.expand_path('templates', __dir__)
|
||||||
|
|
||||||
|
# Environment variables which are read by cpm
|
||||||
|
CPM_ENV = %w(
|
||||||
|
CPM_USE_LOCAL_PACKAGES
|
||||||
|
CPM_LOCAL_PACKAGES_ONLY
|
||||||
|
CPM_DOWNLOAD_ALL
|
||||||
|
CPM_DONT_UPDATE_MODULE_PATH
|
||||||
|
CPM_DONT_CREATE_PACKAGE_LOCK
|
||||||
|
CPM_INCLUDE_ALL_IN_PACKAGE_LOCK
|
||||||
|
CPM_USE_NAMED_CACHE_DIRECTORIES
|
||||||
|
CPM_SOURCE_CACHE
|
||||||
|
)
|
||||||
|
def self.clear_env
|
||||||
|
CPM_ENV.each { ENV[_1] = nil }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
puts "Warning: test directory '#{TestLib::TMP_DIR}' already exists" if File.exist?(TestLib::TMP_DIR)
|
||||||
|
raise "Cannot find 'CPM.cmake' at '#{TestLib::CPM_PATH}'" if !File.file?(TestLib::CPM_PATH)
|
||||||
|
|
||||||
|
puts "Running CPM.cmake integration tests"
|
||||||
|
puts "Temp directory: '#{TestLib::TMP_DIR}'"
|
||||||
|
|
||||||
|
# Clean all CPM-related env vars
|
||||||
|
TestLib.clear_env
|
||||||
|
|
||||||
|
class Project
|
||||||
|
def initialize(src_dir, bin_dir)
|
||||||
|
@src_dir = src_dir
|
||||||
|
@bin_dir = bin_dir
|
||||||
|
end
|
||||||
|
|
||||||
|
attr :src_dir, :bin_dir
|
||||||
|
|
||||||
|
def create_file(target_path, text, args = {})
|
||||||
|
target_path = File.join(@src_dir, target_path)
|
||||||
|
|
||||||
|
# tweak args
|
||||||
|
args[:cpm_path] = TestLib::CPM_PATH if !args[:cpm_path]
|
||||||
|
args[:packages] = [args[:package]] if args[:package] # if args contain package, create the array
|
||||||
|
args[:packages] = args[:packages].join("\n") if args[:packages] # join all packages if any
|
||||||
|
|
||||||
|
File.write target_path, text % args
|
||||||
|
end
|
||||||
|
|
||||||
|
def create_file_from_template(target_path, source_path, args = {})
|
||||||
|
source_path = File.join(@src_dir, source_path)
|
||||||
|
raise "#{source_path} doesn't exist" if !File.file?(source_path)
|
||||||
|
src_text = File.read source_path
|
||||||
|
create_file target_path, src_text, args
|
||||||
|
end
|
||||||
|
|
||||||
|
# common function to create ./CMakeLists.txt from ./lists.in.cmake
|
||||||
|
def create_lists_from_default_template(args = {})
|
||||||
|
create_file_from_template 'CMakeLists.txt', 'lists.in.cmake', args
|
||||||
|
end
|
||||||
|
|
||||||
|
CommandResult = Struct.new :out, :err, :status
|
||||||
|
def configure(extra_args = '')
|
||||||
|
CommandResult.new *Open3.capture3("cmake -S #{@src_dir} -B #{@bin_dir} #{extra_args}")
|
||||||
|
end
|
||||||
|
def build(extra_args = '')
|
||||||
|
CommandResult.new *Open3.capture3("cmake --build #{@bin_dir} #{extra_args}")
|
||||||
|
end
|
||||||
|
|
||||||
|
class CMakeCache
|
||||||
|
class Entry
|
||||||
|
def initialize(val, type, advanced, desc)
|
||||||
|
@val = val
|
||||||
|
@type = type
|
||||||
|
@advanced = advanced
|
||||||
|
@desc = desc
|
||||||
|
end
|
||||||
|
attr :val, :type, :advanced, :desc
|
||||||
|
alias_method :advanced?, :advanced
|
||||||
|
def inspect
|
||||||
|
"(#{val.inspect} #{type}" + (advanced? ? ' ADVANCED)' : ')')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Package = Struct.new(:ver, :src_dir, :bin_dir)
|
||||||
|
|
||||||
|
def self.from_dir(dir)
|
||||||
|
entries = {}
|
||||||
|
cur_desc = ''
|
||||||
|
file = File.join(dir, 'CMakeCache.txt')
|
||||||
|
return nil if !File.file?(file)
|
||||||
|
File.readlines(file).each { |line|
|
||||||
|
line.strip!
|
||||||
|
next if line.empty?
|
||||||
|
next if line.start_with? '#' # comment
|
||||||
|
if line.start_with? '//'
|
||||||
|
cur_desc += line[2..]
|
||||||
|
else
|
||||||
|
m = /(.+?)(-ADVANCED)?:([A-Z]+)=(.*)/.match(line)
|
||||||
|
raise "Error parsing '#{line}' in #{file}" if !m
|
||||||
|
entries[m[1]] = Entry.new(m[4], m[3], !!m[2], cur_desc)
|
||||||
|
cur_desc = ''
|
||||||
|
end
|
||||||
|
}
|
||||||
|
CMakeCache.new entries
|
||||||
|
end
|
||||||
|
|
||||||
|
def initialize(entries)
|
||||||
|
@entries = entries
|
||||||
|
|
||||||
|
package_list = self['CPM_PACKAGES']
|
||||||
|
@packages = if package_list
|
||||||
|
# collect package data
|
||||||
|
@packages = package_list.split(';').map { |name|
|
||||||
|
[name, Package.new(
|
||||||
|
self["CPM_PACKAGE_#{name}_VERSION"],
|
||||||
|
self["CPM_PACKAGE_#{name}_SOURCE_DIR"],
|
||||||
|
self["CPM_PACKAGE_#{name}_BINARY_DIR"]
|
||||||
|
)]
|
||||||
|
}.to_h
|
||||||
|
else
|
||||||
|
{}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
attr :entries, :packages
|
||||||
|
|
||||||
|
def [](key)
|
||||||
|
e = @entries[key]
|
||||||
|
return nil if !e
|
||||||
|
e.val
|
||||||
|
end
|
||||||
|
end
|
||||||
|
def read_cache
|
||||||
|
CMakeCache.from_dir @bin_dir
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class IntegrationTest < Test::Unit::TestCase
|
||||||
|
self.test_order = :defined # run tests in order of definition (as opposed to alphabetical)
|
||||||
|
|
||||||
|
def cleanup
|
||||||
|
# Clear cpm-related env vars which may have been set by the test
|
||||||
|
TestLib.clear_env
|
||||||
|
end
|
||||||
|
|
||||||
|
# extra assertions
|
||||||
|
|
||||||
|
def assert_success(res)
|
||||||
|
msg = build_message(nil, "command status was expected to be a success, but failed with code <?> and STDERR:\n\n#{res.err}", res.status.to_i)
|
||||||
|
assert_block(msg) { res.status.success? }
|
||||||
|
end
|
||||||
|
|
||||||
|
def assert_failure(res)
|
||||||
|
msg = build_message(nil, "command status was expected to be a failure, but succeeded")
|
||||||
|
assert_block(msg) { !res.status.success? }
|
||||||
|
end
|
||||||
|
|
||||||
|
def assert_same_path(a, b)
|
||||||
|
msg = build_message(nil, "<?> expected but was\n<?>", a, b)
|
||||||
|
assert_block(msg) { File.identical? a, b }
|
||||||
|
end
|
||||||
|
|
||||||
|
# utils
|
||||||
|
class << self
|
||||||
|
def startup
|
||||||
|
@@test_dir = File.join(TestLib::TMP_DIR, self.name.
|
||||||
|
# to-underscore conversion from Rails
|
||||||
|
gsub(/::/, '/').
|
||||||
|
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
||||||
|
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
||||||
|
tr("-", "_").
|
||||||
|
downcase
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def cur_test_dir
|
||||||
|
@@test_dir
|
||||||
|
end
|
||||||
|
|
||||||
|
def make_project(name: nil, from_template: nil)
|
||||||
|
test_name = local_name
|
||||||
|
test_name = test_name[5..] if test_name.start_with?('test_')
|
||||||
|
|
||||||
|
base = File.join(cur_test_dir, test_name)
|
||||||
|
base += "-#{name}" if name
|
||||||
|
src_dir = base + '-src'
|
||||||
|
|
||||||
|
FileUtils.mkdir_p src_dir
|
||||||
|
|
||||||
|
if from_template
|
||||||
|
from_template = File.join(TestLib::TEMPLATES_DIR, from_template)
|
||||||
|
raise "#{from_template} is not a directory" if !File.directory?(from_template)
|
||||||
|
FileUtils.copy_entry from_template, src_dir
|
||||||
|
end
|
||||||
|
|
||||||
|
Project.new src_dir, base + '-bin'
|
||||||
|
end
|
||||||
|
end
|
66
test/integration/reference.md
Normal file
66
test/integration/reference.md
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
# Integration Test Framework Reference
|
||||||
|
|
||||||
|
## `TestLib`
|
||||||
|
|
||||||
|
A module for the framework. Provides global data and functionality. For ease of use the utility classes are *not* in this module.
|
||||||
|
|
||||||
|
Provides:
|
||||||
|
|
||||||
|
* `TMP_DIR` - the temporary directory for the current test run
|
||||||
|
* `CPM_PATH` - path to CPM.cmake. The thing that is being tested
|
||||||
|
* `TEMPLATES_DIR` - path to integration test templates
|
||||||
|
* `CPM_ENV` - an array of the names of all environment variables, which CPM.cmake may read
|
||||||
|
* `.clear_env` - a function to clear all aforementioned environment variables
|
||||||
|
|
||||||
|
## `Project`
|
||||||
|
|
||||||
|
A helper class to manage a CMake project.
|
||||||
|
|
||||||
|
Provides:
|
||||||
|
|
||||||
|
* `#initialize(src_dir, bin_dir)` - create a project with a given source and binary directory
|
||||||
|
* `#src_dir`, `#bin_dir` - get project directories
|
||||||
|
* `#create_file(target_path, text, args = {})` - create a file in the project's source directory with a given test. The `args` hash is used to interpolate markup in the text string.
|
||||||
|
* Will set `:cpm_path` in `args` to `TestLib::CPM_PATH` if not already present.
|
||||||
|
* If `:package` is present it will be added to the array `:packages`
|
||||||
|
* Will convert `:packages` form an array to a string
|
||||||
|
* `#create_file_from_template(target_path, source_path, args = {})` - create a file in the project source directory, based on another file in the project source directory. The contents of the file at `source_path` will be read and used in `create_file`
|
||||||
|
* `#create_lists_from_default_template(args = {})` - same as `create_file_from_template('CMakeLists.txt', 'lists.in.cmake', args)`
|
||||||
|
* `::CommandResult` - a struct of:
|
||||||
|
* `out` - the standard output from a command execution
|
||||||
|
* `err` - the standard error output from the execution
|
||||||
|
* `status` - the [`Process::Status`](https://ruby-doc.org/core-2.7.0/Process/Status.html) of the execution
|
||||||
|
* `#configure(extra_args = '') => CommandResult` - configure the project with optional extra args to CMake
|
||||||
|
* `#build(extra_args = '') => CommandResult` - build the project with optional extra args to CMake
|
||||||
|
* `::CMakeCache` - a helper class with the contents of a CMakeCache.txt. Provides:
|
||||||
|
* `::Entry` - a CMake cache entry of:
|
||||||
|
* `val` - the value as string
|
||||||
|
* `type` - the type as string
|
||||||
|
* `advanced?` - whether the entry is an advanced option
|
||||||
|
* `desc` - the description of the entry (can be an empty string)
|
||||||
|
* `::Package` - the CMake cache for a CPM.cmake package. A struct of:
|
||||||
|
* `ver` - the version as string
|
||||||
|
* `src_dir`, `bin_dir` - the source and binary directories of the package
|
||||||
|
* `.from_dir(dir)` - create an instance of `CMakeCache` from `<dir>/CMakeLists.txt`
|
||||||
|
* `#initialize(entries)` - create a cache from a hash of entries by name. Will populate packages.
|
||||||
|
* `#entries => {String => Entry}` - the entries of the cache
|
||||||
|
* `#packages => {String => Package}` - CPM.cmake packages by name found in the cache
|
||||||
|
* `#[](key) => String` - an entry value from an entry name. Created because the value is expected to be needed much more frequently than the entire entry data. To get a full entry use `cache.entries['name']`.
|
||||||
|
* `read_cache => CMakeCache` - reads the CMake cache in the binary directory of the project and returns it as a `CMakeCache` instance
|
||||||
|
|
||||||
|
## `IntegrationTest`
|
||||||
|
|
||||||
|
The class which must be a parent of all integration test case classes. It itself extends `Test::Unit::TestCase` with:
|
||||||
|
|
||||||
|
### Assertions
|
||||||
|
|
||||||
|
* `assert_success(res)` - assert that an instance of `Project::CommandResult` is a success
|
||||||
|
* `assert_same_path(a, b)` - assert that two strings represent the same path. For example on Windows `c:\foo` and `C:\Foo` do.
|
||||||
|
|
||||||
|
### Utils
|
||||||
|
|
||||||
|
* `cur_test_dir` - the directory of the current test case. A subdirectory of `TestLib::TMP_DIR`
|
||||||
|
* `make_project(name: nil, from_template: nil)` - create a project from a test method. Will create the project's source and binary directories as subdirectories of `cur_test_dir`.
|
||||||
|
* Optionally provide a name which will be concatenated to the project directory. This allows creating multiple projects in a test
|
||||||
|
* Optionally work with a template, in which case it will copy the contents of the template directory (one from `templates`) in the project's source directory.
|
||||||
|
|
4
test/integration/runner.rb
Normal file
4
test/integration/runner.rb
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
require_relative './lib'
|
||||||
|
|
||||||
|
exit Test::Unit::AutoRunner::run(true, __dir__)
|
||||||
|
|
7
test/integration/templates/no-deps/lists.in.cmake
Normal file
7
test/integration/templates/no-deps/lists.in.cmake
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||||
|
|
||||||
|
project(no-deps)
|
||||||
|
|
||||||
|
include("%{cpm_path}")
|
||||||
|
|
||||||
|
add_executable(no-deps main.c)
|
6
test/integration/templates/no-deps/main.c
Normal file
6
test/integration/templates/no-deps/main.c
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
puts("Hello");
|
||||||
|
return 0;
|
||||||
|
}
|
13
test/integration/templates/using-adder/lists.in.cmake
Normal file
13
test/integration/templates/using-adder/lists.in.cmake
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||||
|
|
||||||
|
project(using-adder)
|
||||||
|
|
||||||
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
||||||
|
|
||||||
|
include("%{cpm_path}")
|
||||||
|
|
||||||
|
%{packages}
|
||||||
|
|
||||||
|
add_executable(using-adder using-adder.cpp)
|
||||||
|
|
||||||
|
target_link_libraries(using-adder adder)
|
8
test/integration/templates/using-adder/using-adder.cpp
Normal file
8
test/integration/templates/using-adder/using-adder.cpp
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#include <adder/adder.hpp>
|
||||||
|
#include <cstdio>
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int sum = adder::add(5, 3);
|
||||||
|
std::printf("%d\n", sum);
|
||||||
|
return 0;
|
||||||
|
}
|
13
test/integration/templates/using-fibadder/lists.in.cmake
Normal file
13
test/integration/templates/using-fibadder/lists.in.cmake
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||||
|
|
||||||
|
project(using-fibadder)
|
||||||
|
|
||||||
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
||||||
|
|
||||||
|
include("%{cpm_path}")
|
||||||
|
|
||||||
|
%{packages}
|
||||||
|
|
||||||
|
add_executable(using-fibadder using-fibadder.cpp)
|
||||||
|
|
||||||
|
target_link_libraries(using-fibadder fibadder)
|
@ -0,0 +1,8 @@
|
|||||||
|
#include <cstdio>
|
||||||
|
#include <fibadder/fibadder.hpp>
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int sum = fibadder::fibadd(6, 7);
|
||||||
|
std::printf("%d\n", sum);
|
||||||
|
return 0;
|
||||||
|
}
|
13
test/integration/templates/using-patch-adder/lists.in.cmake
Normal file
13
test/integration/templates/using-patch-adder/lists.in.cmake
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||||
|
|
||||||
|
project(using-patch-adder)
|
||||||
|
|
||||||
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
||||||
|
|
||||||
|
include("%{cpm_path}")
|
||||||
|
|
||||||
|
%{packages}
|
||||||
|
|
||||||
|
add_executable(using-patch-adder using-patch-adder.cpp)
|
||||||
|
|
||||||
|
target_link_libraries(using-patch-adder adder)
|
@ -0,0 +1,12 @@
|
|||||||
|
diff --git a/code/adder/adder.hpp b/code/adder/adder.hpp
|
||||||
|
index fdb9324..7c2fa00 100644
|
||||||
|
--- a/code/adder/adder.hpp
|
||||||
|
+++ b/code/adder/adder.hpp
|
||||||
|
@@ -1,6 +1,6 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
-namespace adder
|
||||||
|
+namespace patched
|
||||||
|
{
|
||||||
|
int add(int a, int b);
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
diff --git a/code/adder/adder.cpp b/code/adder/adder.cpp
|
||||||
|
index fc6e767..44b1197 100644
|
||||||
|
--- a/code/adder/adder.cpp
|
||||||
|
+++ b/code/adder/adder.cpp
|
||||||
|
@@ -1,6 +1,6 @@
|
||||||
|
#include "adder.hpp"
|
||||||
|
|
||||||
|
-namespace adder
|
||||||
|
+namespace patched
|
||||||
|
{
|
||||||
|
int add(int a, int b)
|
||||||
|
{
|
@ -0,0 +1,8 @@
|
|||||||
|
#include <adder/adder.hpp>
|
||||||
|
#include <cstdio>
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int sum = patched::add(5, 3);
|
||||||
|
std::printf("%d\n", sum);
|
||||||
|
return 0;
|
||||||
|
}
|
58
test/integration/test_basics.rb
Normal file
58
test/integration/test_basics.rb
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
require_relative './lib'
|
||||||
|
|
||||||
|
# Tests of cpm caches and vars when no packages are used
|
||||||
|
|
||||||
|
class Basics < IntegrationTest
|
||||||
|
# Test cpm caches with no cpm-related env vars
|
||||||
|
def test_cpm_default
|
||||||
|
prj = make_project from_template: 'no-deps'
|
||||||
|
prj.create_lists_from_default_template
|
||||||
|
assert_success prj.configure
|
||||||
|
|
||||||
|
@cache = prj.read_cache
|
||||||
|
|
||||||
|
assert_empty @cache.packages
|
||||||
|
|
||||||
|
assert_same_path TestLib::CPM_PATH, check_and_get('CPM_FILE')
|
||||||
|
assert_same_path File.dirname(TestLib::CPM_PATH), check_and_get('CPM_DIRECTORY')
|
||||||
|
|
||||||
|
assert_equal 'OFF', check_and_get('CPM_DRY_RUN')
|
||||||
|
assert_equal 'CPM:', check_and_get('CPM_INDENT')
|
||||||
|
assert_equal '1.0.0-development-version', check_and_get('CPM_VERSION')
|
||||||
|
|
||||||
|
assert_equal 'OFF', check_and_get('CPM_SOURCE_CACHE', 'PATH')
|
||||||
|
assert_equal 'OFF', check_and_get('CPM_DOWNLOAD_ALL', 'BOOL')
|
||||||
|
assert_equal 'OFF', check_and_get('CPM_LOCAL_PACKAGES_ONLY', 'BOOL')
|
||||||
|
assert_equal 'OFF', check_and_get('CPM_USE_LOCAL_PACKAGES', 'BOOL')
|
||||||
|
assert_equal 'OFF', check_and_get('CPM_USE_NAMED_CACHE_DIRECTORIES', 'BOOL')
|
||||||
|
|
||||||
|
assert_equal 'OFF', check_and_get('CPM_DONT_CREATE_PACKAGE_LOCK', 'BOOL')
|
||||||
|
assert_equal 'OFF', check_and_get('CPM_INCLUDE_ALL_IN_PACKAGE_LOCK', 'BOOL')
|
||||||
|
assert_same_path File.join(prj.bin_dir, 'cpm-package-lock.cmake'), check_and_get('CPM_PACKAGE_LOCK_FILE')
|
||||||
|
|
||||||
|
assert_equal 'OFF', check_and_get('CPM_DONT_UPDATE_MODULE_PATH', 'BOOL')
|
||||||
|
if @cache.entries['CMAKE_FIND_PACKAGE_REDIRECTS_DIR'].nil?
|
||||||
|
assert_same_path File.join(prj.bin_dir, 'CPM_modules'), check_and_get('CPM_MODULE_PATH')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Test when env CPM_SOURCE_CACHE is set
|
||||||
|
def test_env_cpm_source_cache
|
||||||
|
ENV['CPM_SOURCE_CACHE'] = cur_test_dir
|
||||||
|
|
||||||
|
prj = make_project from_template: 'no-deps'
|
||||||
|
prj.create_lists_from_default_template
|
||||||
|
assert_success prj.configure
|
||||||
|
|
||||||
|
@cache = prj.read_cache
|
||||||
|
|
||||||
|
assert_equal cur_test_dir, check_and_get('CPM_SOURCE_CACHE', 'PATH')
|
||||||
|
end
|
||||||
|
|
||||||
|
def check_and_get(key, type = 'INTERNAL')
|
||||||
|
e = @cache.entries[key]
|
||||||
|
assert_not_nil e, key
|
||||||
|
assert_equal type, e.type, key
|
||||||
|
e.val
|
||||||
|
end
|
||||||
|
end
|
25
test/integration/test_download_command.rb
Normal file
25
test/integration/test_download_command.rb
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
require_relative './lib'
|
||||||
|
|
||||||
|
# Tests using a multi-argumenet download command to fetch a dependency
|
||||||
|
|
||||||
|
class DownloadCommand < IntegrationTest
|
||||||
|
|
||||||
|
def test_fetch_dependency_using_download_command
|
||||||
|
prj = make_project from_template: 'using-adder'
|
||||||
|
|
||||||
|
prj.create_lists_from_default_template package: <<~PACK
|
||||||
|
set(DOWNLOAD_DIR ${CMAKE_BINARY_DIR}/_deps/testpack-adder-src)
|
||||||
|
CPMAddPackage(
|
||||||
|
NAME testpack-adder
|
||||||
|
SOURCE_DIR ${DOWNLOAD_DIR}
|
||||||
|
DOWNLOAD_COMMAND git clone --depth 1 --branch v1.0.0 https://github.com/cpm-cmake/testpack-adder.git ${DOWNLOAD_DIR}
|
||||||
|
OPTIONS "ADDER_BUILD_TESTS OFF"
|
||||||
|
)
|
||||||
|
PACK
|
||||||
|
|
||||||
|
# configure with unpopulated cache
|
||||||
|
assert_success prj.configure
|
||||||
|
assert_success prj.build
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
43
test/integration/test_fetchcontent_compatibility.rb
Normal file
43
test/integration/test_fetchcontent_compatibility.rb
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
require_relative './lib'
|
||||||
|
|
||||||
|
# Tests FetchContent overriding with CPM
|
||||||
|
|
||||||
|
class FetchContentCompatibility < IntegrationTest
|
||||||
|
def setup
|
||||||
|
@cache_dir = File.join(cur_test_dir, 'cpmcache')
|
||||||
|
ENV['CPM_SOURCE_CACHE'] = @cache_dir
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_add_dependency_cpm_and_fetchcontent
|
||||||
|
prj = make_project from_template: 'using-adder'
|
||||||
|
|
||||||
|
prj.create_lists_from_default_template package: <<~PACK
|
||||||
|
CPMAddPackage(
|
||||||
|
NAME testpack-adder
|
||||||
|
GITHUB_REPOSITORY cpm-cmake/testpack-adder
|
||||||
|
VERSION 1.0.0
|
||||||
|
OPTIONS "ADDER_BUILD_TESTS OFF"
|
||||||
|
)
|
||||||
|
|
||||||
|
# should have no effect, as we added the dependency using CPM
|
||||||
|
FetchContent_Declare(
|
||||||
|
testpack-adder
|
||||||
|
GIT_REPOSITORY https://github.com/cpm-cmake/testpack-adder
|
||||||
|
GIT_TAG v1.0.0
|
||||||
|
)
|
||||||
|
FetchContent_MakeAvailable(testpack-adder)
|
||||||
|
PACK
|
||||||
|
|
||||||
|
# configure with unpopulated cache
|
||||||
|
assert_success prj.configure
|
||||||
|
assert_success prj.build
|
||||||
|
|
||||||
|
# cache is populated
|
||||||
|
assert_true File.exist?(File.join(@cache_dir, "testpack-adder"))
|
||||||
|
|
||||||
|
# configure with populated cache
|
||||||
|
assert_success prj.configure
|
||||||
|
assert_success prj.build
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
21
test/integration/test_parallelism.rb
Normal file
21
test/integration/test_parallelism.rb
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
require_relative './lib'
|
||||||
|
|
||||||
|
class Parallelism < IntegrationTest
|
||||||
|
def setup
|
||||||
|
@cache_dir = File.join(cur_test_dir, 'cpmcache')
|
||||||
|
ENV['CPM_SOURCE_CACHE'] = @cache_dir
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_populate_cache_in_parallel
|
||||||
|
4.times.map { |i|
|
||||||
|
prj = make_project name: i.to_s, from_template: 'using-fibadder'
|
||||||
|
prj.create_lists_from_default_template package: 'CPMAddPackage("gh:cpm-cmake/testpack-fibadder@1.0.0")'
|
||||||
|
prj
|
||||||
|
}.map { |prj|
|
||||||
|
Thread.new do
|
||||||
|
assert_success prj.configure
|
||||||
|
assert_success prj.build
|
||||||
|
end
|
||||||
|
}.map(&:join)
|
||||||
|
end
|
||||||
|
end
|
27
test/integration/test_patches_command.rb
Normal file
27
test/integration/test_patches_command.rb
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
require_relative './lib'
|
||||||
|
|
||||||
|
# Tests using a multi-argumenet PATCHES command to fetch and modify a dependency
|
||||||
|
|
||||||
|
class DownloadCommand < IntegrationTest
|
||||||
|
|
||||||
|
def test_fetch_dependency_using_download_command
|
||||||
|
prj = make_project from_template: 'using-patch-adder'
|
||||||
|
|
||||||
|
prj.create_lists_from_default_template package: <<~PACK
|
||||||
|
set(DOWNLOAD_DIR ${CMAKE_BINARY_DIR}/_deps/testpack-adder-src)
|
||||||
|
CPMAddPackage(
|
||||||
|
NAME testpack-adder
|
||||||
|
DOWNLOAD_COMMAND git clone --depth 1 --branch v1.0.0 https://github.com/cpm-cmake/testpack-adder.git ${DOWNLOAD_DIR}
|
||||||
|
OPTIONS "ADDER_BUILD_TESTS OFF" "ADDER_BUILD_EXAMPLES OFF"
|
||||||
|
PATCHES
|
||||||
|
patches/001-test_patches_command.patch
|
||||||
|
patches/002-test_patches_command.patch
|
||||||
|
)
|
||||||
|
PACK
|
||||||
|
|
||||||
|
# configure with unpopulated cache
|
||||||
|
assert_success prj.configure
|
||||||
|
assert_success prj.build
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
17
test/integration/test_relative_urls.rb
Normal file
17
test/integration/test_relative_urls.rb
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
require_relative './lib'
|
||||||
|
|
||||||
|
class RelativeURLs < IntegrationTest
|
||||||
|
def setup
|
||||||
|
# relative URLs were introduced in CMake 3.27
|
||||||
|
@relative_urls_supported = (!ENV['CMAKE_VERSION']) || (Gem::Version.new(ENV['CMAKE_VERSION']) >= Gem::Version.new('3.27'))
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_add_project_with_relative_urls
|
||||||
|
omit_if !@relative_urls_supported do
|
||||||
|
prj = make_project from_template: 'using-fibadder'
|
||||||
|
prj.create_lists_from_default_template package: 'CPMAddPackage("gh:cpm-cmake/testpack-fibadder@1.1.0-relative-urls")'
|
||||||
|
assert_success prj.configure
|
||||||
|
assert_success prj.build
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
36
test/integration/test_remove_source_dir.rb
Normal file
36
test/integration/test_remove_source_dir.rb
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
require_relative './lib'
|
||||||
|
|
||||||
|
class RemoveSourceDir < IntegrationTest
|
||||||
|
def test_remove_source_dir
|
||||||
|
prj = make_project from_template: 'using-adder'
|
||||||
|
|
||||||
|
prj.create_lists_from_default_template package: <<~PACK
|
||||||
|
CPMAddPackage(
|
||||||
|
NAME testpack-adder
|
||||||
|
GITHUB_REPOSITORY cpm-cmake/testpack-adder
|
||||||
|
VERSION 1.0.0
|
||||||
|
OPTIONS "ADDER_BUILD_TESTS OFF"
|
||||||
|
SOURCE_DIR testpack-adder
|
||||||
|
)
|
||||||
|
PACK
|
||||||
|
|
||||||
|
# configure and build
|
||||||
|
assert_success prj.configure
|
||||||
|
assert_success prj.build
|
||||||
|
|
||||||
|
# source_dir is populated
|
||||||
|
assert_true File.exist?(File.join(prj.bin_dir, 'testpack-adder'))
|
||||||
|
|
||||||
|
# source_dir is deleted by user
|
||||||
|
FileUtils.remove_dir(File.join(prj.bin_dir, 'testpack-adder'), true)
|
||||||
|
assert_false File.exist?(File.join(prj.bin_dir, 'testpack-adder'))
|
||||||
|
|
||||||
|
# configure and build with missing source_dir to fetch new content
|
||||||
|
assert_success prj.configure
|
||||||
|
assert_success prj.build
|
||||||
|
|
||||||
|
# source_dir is populated
|
||||||
|
assert_true File.exist?(File.join(prj.bin_dir, 'testpack-adder'))
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
86
test/integration/test_shorthand_syntax.rb
Normal file
86
test/integration/test_shorthand_syntax.rb
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
require_relative './lib'
|
||||||
|
|
||||||
|
class TestShorthandSyntax < IntegrationTest
|
||||||
|
|
||||||
|
def get_project_binaries prj
|
||||||
|
exe_dir = File.join(prj.bin_dir, 'bin')
|
||||||
|
assert File.directory? exe_dir
|
||||||
|
return Dir[exe_dir + '/**/*'].filter {
|
||||||
|
# on multi-configuration generators (like Visual Studio) the executables will be in bin/<Config>
|
||||||
|
# also filter-out other artifacts like .pdb or .dsym
|
||||||
|
!File.directory?(_1) && File.stat(_1).executable?
|
||||||
|
}.map {
|
||||||
|
# remove .exe extension if any (there will be one on Windows)
|
||||||
|
File.basename(_1, '.exe')
|
||||||
|
}.sort
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_create_with_commit_sha
|
||||||
|
prj = make_project from_template: 'using-adder'
|
||||||
|
prj.create_lists_from_default_template package:
|
||||||
|
'CPMAddPackage("gh:cpm-cmake/testpack-adder#cad1cd4b4cdf957c5b59e30bc9a1dd200dbfc716")'
|
||||||
|
assert_success prj.configure
|
||||||
|
|
||||||
|
cache = prj.read_cache
|
||||||
|
assert_equal 1, cache.packages.size
|
||||||
|
assert_equal '0', cache.packages['testpack-adder'].ver
|
||||||
|
|
||||||
|
assert_success prj.build
|
||||||
|
exes = get_project_binaries prj
|
||||||
|
# No adder projects were built as EXCLUDE_FROM_ALL is implicitly set
|
||||||
|
assert_equal ['using-adder'], exes
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_create_with_version
|
||||||
|
prj = make_project from_template: 'using-adder'
|
||||||
|
prj.create_lists_from_default_template package:
|
||||||
|
'CPMAddPackage("gh:cpm-cmake/testpack-adder@1.0.0")'
|
||||||
|
assert_success prj.configure
|
||||||
|
|
||||||
|
cache = prj.read_cache
|
||||||
|
assert_equal 1, cache.packages.size
|
||||||
|
assert_equal '1.0.0', cache.packages['testpack-adder'].ver
|
||||||
|
|
||||||
|
assert_success prj.build
|
||||||
|
exes = get_project_binaries prj
|
||||||
|
assert_equal ['using-adder'], exes
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_create_with_all
|
||||||
|
prj = make_project from_template: 'using-adder'
|
||||||
|
prj.create_lists_from_default_template package:
|
||||||
|
'CPMAddPackage(
|
||||||
|
URI "gh:cpm-cmake/testpack-adder@1.0.0"
|
||||||
|
EXCLUDE_FROM_ALL false
|
||||||
|
)'
|
||||||
|
assert_success prj.configure
|
||||||
|
|
||||||
|
cache = prj.read_cache
|
||||||
|
assert_equal cache.packages.size, 1
|
||||||
|
assert_equal cache.packages['testpack-adder'].ver, '1.0.0'
|
||||||
|
|
||||||
|
assert_success prj.build
|
||||||
|
exes = get_project_binaries prj
|
||||||
|
assert_equal exes, ['simple', 'test-adding', 'using-adder']
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_create_with_tests_but_without_examples
|
||||||
|
prj = make_project from_template: 'using-adder'
|
||||||
|
prj.create_lists_from_default_template package:
|
||||||
|
'CPMAddPackage(
|
||||||
|
URI "gh:cpm-cmake/testpack-adder@1.0.0"
|
||||||
|
OPTIONS "ADDER_BUILD_EXAMPLES OFF" "ADDER_BUILD_TESTS TRUE"
|
||||||
|
EXCLUDE_FROM_ALL false
|
||||||
|
)'
|
||||||
|
assert_success prj.configure
|
||||||
|
|
||||||
|
cache = prj.read_cache
|
||||||
|
assert_equal cache.packages.size, 1
|
||||||
|
assert_equal cache.packages['testpack-adder'].ver, '1.0.0'
|
||||||
|
|
||||||
|
assert_success prj.build
|
||||||
|
exes = get_project_binaries prj
|
||||||
|
assert_equal exes, ['test-adding', 'using-adder']
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
91
test/integration/test_simple.rb
Normal file
91
test/integration/test_simple.rb
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
require_relative './lib'
|
||||||
|
|
||||||
|
class Simple < IntegrationTest
|
||||||
|
ADDER_PACKAGE_NAME = 'testpack-adder'
|
||||||
|
|
||||||
|
def test_update_single_package
|
||||||
|
prj = make_project from_template: 'using-adder'
|
||||||
|
adder_cache0 = nil
|
||||||
|
adder_ver_file = nil
|
||||||
|
|
||||||
|
create_with_commit_sha = -> {
|
||||||
|
prj.create_lists_from_default_template package:
|
||||||
|
'CPMAddPackage("gh:cpm-cmake/testpack-adder#cad1cd4b4cdf957c5b59e30bc9a1dd200dbfc716")'
|
||||||
|
assert_success prj.configure
|
||||||
|
|
||||||
|
cache = prj.read_cache
|
||||||
|
assert_equal 1, cache.packages.size
|
||||||
|
|
||||||
|
adder_cache = cache.packages[ADDER_PACKAGE_NAME]
|
||||||
|
assert_not_nil adder_cache
|
||||||
|
assert_equal '0', adder_cache.ver
|
||||||
|
assert File.directory? adder_cache.src_dir
|
||||||
|
assert File.directory? adder_cache.bin_dir
|
||||||
|
|
||||||
|
adder_ver_file = File.join(adder_cache.src_dir, 'version')
|
||||||
|
assert File.file? adder_ver_file
|
||||||
|
assert_equal 'initial', File.read(adder_ver_file).strip
|
||||||
|
|
||||||
|
# calculated adder values
|
||||||
|
assert_equal 'ON', cache['ADDER_BUILD_EXAMPLES']
|
||||||
|
assert_equal 'ON', cache['ADDER_BUILD_TESTS']
|
||||||
|
assert_equal adder_cache.src_dir, cache['adder_SOURCE_DIR']
|
||||||
|
assert_equal adder_cache.bin_dir, cache['adder_BINARY_DIR']
|
||||||
|
|
||||||
|
# store for future comparisons
|
||||||
|
adder_cache0 = adder_cache
|
||||||
|
}
|
||||||
|
update_to_version_1 = -> {
|
||||||
|
prj.create_lists_from_default_template package:
|
||||||
|
'CPMAddPackage("gh:cpm-cmake/testpack-adder@1.0.0")'
|
||||||
|
assert_success prj.configure
|
||||||
|
|
||||||
|
cache = prj.read_cache
|
||||||
|
assert_equal 1, cache.packages.size
|
||||||
|
|
||||||
|
adder_cache = cache.packages[ADDER_PACKAGE_NAME]
|
||||||
|
assert_not_nil adder_cache
|
||||||
|
assert_equal '1.0.0', adder_cache.ver
|
||||||
|
|
||||||
|
# dirs shouldn't have changed
|
||||||
|
assert_equal adder_cache0.src_dir, adder_cache.src_dir
|
||||||
|
assert_equal adder_cache0.bin_dir, adder_cache.bin_dir
|
||||||
|
|
||||||
|
assert_equal '1.0.0', File.read(adder_ver_file).strip
|
||||||
|
}
|
||||||
|
update_with_option_off_and_build = -> {
|
||||||
|
prj.create_lists_from_default_template package: <<~PACK
|
||||||
|
CPMAddPackage(
|
||||||
|
NAME testpack-adder
|
||||||
|
GITHUB_REPOSITORY cpm-cmake/testpack-adder
|
||||||
|
VERSION 1.0.0
|
||||||
|
OPTIONS "ADDER_BUILD_TESTS OFF"
|
||||||
|
)
|
||||||
|
PACK
|
||||||
|
assert_success prj.configure
|
||||||
|
assert_success prj.build
|
||||||
|
|
||||||
|
exe_dir = File.join(prj.bin_dir, 'bin')
|
||||||
|
assert File.directory? exe_dir
|
||||||
|
|
||||||
|
exes = Dir[exe_dir + '/**/*'].filter {
|
||||||
|
# on multi-configuration generators (like Visual Studio) the executables will be in bin/<Config>
|
||||||
|
# also filter-out other artifacts like .pdb or .dsym
|
||||||
|
!File.directory?(_1) && File.stat(_1).executable?
|
||||||
|
}.map {
|
||||||
|
# remove .exe extension if any (there will be one on Windows)
|
||||||
|
File.basename(_1, '.exe')
|
||||||
|
}.sort
|
||||||
|
|
||||||
|
# we should end up with two executables
|
||||||
|
# * simple - the simple example from adder
|
||||||
|
# * using-adder - for this project
|
||||||
|
# ...and notably no test for adder, which must be disabled from the option override from above
|
||||||
|
assert_equal ['simple', 'using-adder'], exes
|
||||||
|
}
|
||||||
|
|
||||||
|
create_with_commit_sha.()
|
||||||
|
update_to_version_1.()
|
||||||
|
update_with_option_off_and_build.()
|
||||||
|
end
|
||||||
|
end
|
91
test/integration/test_source_cache.rb
Normal file
91
test/integration/test_source_cache.rb
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
require_relative './lib'
|
||||||
|
|
||||||
|
# Tests with source cache
|
||||||
|
|
||||||
|
class SourceCache < IntegrationTest
|
||||||
|
def setup
|
||||||
|
@cache_dir = File.join(cur_test_dir, 'cpmcache')
|
||||||
|
ENV['CPM_SOURCE_CACHE'] = @cache_dir
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_add_remove_dependency
|
||||||
|
prj = make_project from_template: 'using-fibadder'
|
||||||
|
|
||||||
|
###################################
|
||||||
|
# create
|
||||||
|
prj.create_lists_from_default_template package: 'CPMAddPackage("gh:cpm-cmake/testpack-fibadder@1.0.0")'
|
||||||
|
assert_success prj.configure
|
||||||
|
|
||||||
|
@cache = prj.read_cache
|
||||||
|
|
||||||
|
# fibadder - adder
|
||||||
|
# \ fibonacci - Format
|
||||||
|
assert_equal 4, @cache.packages.size
|
||||||
|
|
||||||
|
check_package_cache 'testpack-fibadder', '1.0.0', '6a17d24c95c44a169ff8ba173f52876a2ba3d137'
|
||||||
|
check_package_cache 'testpack-adder', '1.0.0', '1a4c153849d8e0cf9a3a245e5f6ab6e4722d8995'
|
||||||
|
check_package_cache 'testpack-fibonacci', '2.0', '332c789cb09b8c2f92342dfb874c82bec643daf6'
|
||||||
|
check_package_cache 'Format.cmake', '1.0', 'c5897bd28c5032d45f7f669c8fb470790d2ae156'
|
||||||
|
|
||||||
|
###################################
|
||||||
|
# add one package with a newer version
|
||||||
|
prj.create_lists_from_default_template packages: [
|
||||||
|
'CPMAddPackage("gh:cpm-cmake/testpack-adder@1.0.1")',
|
||||||
|
'CPMAddPackage("gh:cpm-cmake/testpack-fibadder@1.0.0")',
|
||||||
|
]
|
||||||
|
assert_success prj.configure
|
||||||
|
|
||||||
|
@cache = prj.read_cache
|
||||||
|
assert_equal 4, @cache.packages.size
|
||||||
|
|
||||||
|
check_package_cache 'testpack-fibadder', '1.0.0', '6a17d24c95c44a169ff8ba173f52876a2ba3d137'
|
||||||
|
check_package_cache 'testpack-adder', '1.0.1', '84eb33c1b8db880083cefc2adf4dc3f04778cd44'
|
||||||
|
check_package_cache 'testpack-fibonacci', '2.0', '332c789cb09b8c2f92342dfb874c82bec643daf6'
|
||||||
|
check_package_cache 'Format.cmake', '1.0', 'c5897bd28c5032d45f7f669c8fb470790d2ae156'
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_second_project
|
||||||
|
prj = make_project from_template: 'using-fibadder'
|
||||||
|
prj.create_lists_from_default_template package: 'CPMAddPackage("gh:cpm-cmake/testpack-fibadder@1.1.0")'
|
||||||
|
assert_success prj.configure
|
||||||
|
|
||||||
|
@cache = prj.read_cache
|
||||||
|
|
||||||
|
# fibadder - adder
|
||||||
|
# \ fibonacci - Format
|
||||||
|
assert_equal 4, @cache.packages.size
|
||||||
|
|
||||||
|
check_package_cache 'testpack-fibadder', '1.1.0', '603d79d88d7230cc749460a0f476df862aa70ead'
|
||||||
|
check_package_cache 'testpack-adder', '1.0.1', '84eb33c1b8db880083cefc2adf4dc3f04778cd44'
|
||||||
|
check_package_cache 'testpack-fibonacci', '2.0', '332c789cb09b8c2f92342dfb874c82bec643daf6'
|
||||||
|
check_package_cache 'Format.cmake', '1.0', 'c5897bd28c5032d45f7f669c8fb470790d2ae156'
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_cache_dir_contents
|
||||||
|
num_subdirs = -> (name) { Dir["#{File.join(@cache_dir, name.downcase)}/*/"].size }
|
||||||
|
assert_equal 2, num_subdirs.('testpack-fibadder')
|
||||||
|
assert_equal 2, num_subdirs.('testpack-adder')
|
||||||
|
assert_equal 1, num_subdirs.('testpack-fibonacci')
|
||||||
|
assert_equal 1, num_subdirs.('Format.cmake')
|
||||||
|
end
|
||||||
|
|
||||||
|
def check_package_cache(name, ver, dir_sha1)
|
||||||
|
package = @cache.packages[name]
|
||||||
|
assert_not_nil package, name
|
||||||
|
assert_equal ver, package.ver
|
||||||
|
expected_parent_dir = File.join(@cache_dir, name.downcase)
|
||||||
|
assert package.src_dir.start_with?(expected_parent_dir), "#{package.src_dir} must be in #{expected_parent_dir}"
|
||||||
|
|
||||||
|
# The hash has been shortened by cpm_get_shortest_hash. The following
|
||||||
|
# should hold:
|
||||||
|
# - The short hash should be a prefix of the input hash
|
||||||
|
# - There should be a file ".../${short_hash}.hash" which matches the full hash
|
||||||
|
short_hash = File.basename(package.src_dir)
|
||||||
|
assert dir_sha1.start_with?(short_hash), "short_hash should be a prefix of dir_sha1"
|
||||||
|
|
||||||
|
# Check that the full hash is stored in the .hash file
|
||||||
|
hash_file = "#{package.src_dir}.hash"
|
||||||
|
assert File.exist?(hash_file), "Hash file #{hash_file} should exist"
|
||||||
|
assert_equal dir_sha1, File.read(hash_file), "Hash file should contain the full original hash"
|
||||||
|
end
|
||||||
|
end
|
57
test/integration/test_system_warnings.rb
Normal file
57
test/integration/test_system_warnings.rb
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
require_relative './lib'
|
||||||
|
|
||||||
|
class SystemWarnings < IntegrationTest
|
||||||
|
|
||||||
|
def setup
|
||||||
|
# system is only supported for CMake >= 3.25
|
||||||
|
@system_supported = (!ENV['CMAKE_VERSION']) || (Gem::Version.new(ENV['CMAKE_VERSION']) >= Gem::Version.new('3.25'))
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_dependency_added_using_system
|
||||||
|
for use_system in [true, false] do
|
||||||
|
prj = make_project name: use_system ? "system" : "no_system", from_template: 'using-adder'
|
||||||
|
prj.create_lists_from_default_template package: <<~PACK
|
||||||
|
# this commit has a warning in a public header
|
||||||
|
CPMAddPackage(
|
||||||
|
NAME Adder
|
||||||
|
GITHUB_REPOSITORY cpm-cmake/testpack-adder
|
||||||
|
GIT_TAG v1.0.1-warnings
|
||||||
|
SYSTEM #{use_system ? "YES" : "NO"}
|
||||||
|
)
|
||||||
|
# all packages using `adder` will error on warnings
|
||||||
|
target_compile_options(adder INTERFACE
|
||||||
|
$<$<CXX_COMPILER_ID:MSVC>:/Wall /WX>
|
||||||
|
$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-Wall -Werror>
|
||||||
|
)
|
||||||
|
PACK
|
||||||
|
|
||||||
|
assert_success prj.configure
|
||||||
|
if use_system and @system_supported
|
||||||
|
assert_success prj.build
|
||||||
|
else
|
||||||
|
assert_failure prj.build
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_dependency_added_implicitly_using_system
|
||||||
|
prj = make_project from_template: 'using-adder'
|
||||||
|
prj.create_lists_from_default_template package: <<~PACK
|
||||||
|
# this commit has a warning in a public header
|
||||||
|
CPMAddPackage("gh:cpm-cmake/testpack-adder@1.0.1-warnings")
|
||||||
|
# all packages using `adder` will error on warnings
|
||||||
|
target_compile_options(adder INTERFACE
|
||||||
|
$<$<CXX_COMPILER_ID:MSVC>:/Wall /WX>
|
||||||
|
$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-Wall -Werror>
|
||||||
|
)
|
||||||
|
PACK
|
||||||
|
|
||||||
|
assert_success prj.configure
|
||||||
|
if @system_supported
|
||||||
|
assert_success prj.build
|
||||||
|
else
|
||||||
|
assert_failure prj.build
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
35
test/integration/tips.md
Normal file
35
test/integration/tips.md
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
# Tips and Tricks
|
||||||
|
|
||||||
|
## Playing and experimenting
|
||||||
|
|
||||||
|
Create a file called `test_local.rb` in this directory to have an integration test which is for your personal experiments and just playing with the integration test framework. `test_local.rb` is gitignored.
|
||||||
|
|
||||||
|
## Speeding-up development
|
||||||
|
|
||||||
|
Running an integration test requires configuring directories with CMake which can be quite slow. To speed-up development of integration tests consider doing the following steps:
|
||||||
|
|
||||||
|
**Work with standalone tests**
|
||||||
|
|
||||||
|
Instead of starting the runner, run just your integration test (`$ ruby test_your_test.rb`). This won't burden the execution with the others.
|
||||||
|
|
||||||
|
**Export the environment variable `CPM_INTEGRATION_TEST_DIR` to some local directory**
|
||||||
|
|
||||||
|
By default the framework generates a new temporary directory for each test run. If you override the temp directory to a specific one, rerunning the tests will work with the binary directories from the previous run and will improve the performance considerably.
|
||||||
|
|
||||||
|
*NOTE HOWEVER* that in certain cases this may not be an option. Some tests might assert that certain artifacts in the temporary directory are missing but upon rerunning in an existing directory they will be there causing the test to fail.
|
||||||
|
|
||||||
|
*ALSO NOTE* that this may silently affect reruns based on CMake caches from previous runs. If your test fails in peculiar ways on reruns, try a clean run. Always do a clean run before declaring a test a success.
|
||||||
|
|
||||||
|
**Set `CPM_SOURCE_CACHE` even if the test doesn't require it**
|
||||||
|
|
||||||
|
This is not a option for tests which explicitly check that there is no source cache. However certain tests may be indiferent to this. For such cases in development, you can add a setup function in the lines of:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
def setup
|
||||||
|
ENV['CPM_SOURCE_CACHE'] = '/home/myself/.testcpmcache'
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
Then the packages from your test will be cached and not redownloaded every time which is a dramatic improvement in performance.
|
||||||
|
|
||||||
|
*NOTE HOWEVER* that this may introduce subtle bugs. Always test without this dev-only addition, before declaring a test a success.
|
69
test/integration/tutorial.md
Normal file
69
test/integration/tutorial.md
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
# Integration Test Tutorial
|
||||||
|
|
||||||
|
Let's create an integration test which checks that CPM.cmake can make a specific package available.
|
||||||
|
|
||||||
|
First we do some boilerplate.
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
require_relative './lib'
|
||||||
|
|
||||||
|
class MyTest < IntegrationTest
|
||||||
|
# test that CPM.cmake can make https://github.com/cpm-cmake/testpack-adder/ available as a package
|
||||||
|
def test_make_adder_available
|
||||||
|
end
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
Now we have our test case class, and the single test method that we will require. Let's focus on the method's contents. The integration test framework provides us with a helper class, `Project`, which can be used for this scenario. A project has an associated pair of source and binary directories in the temporary directory and it provides methods to work with them.
|
||||||
|
|
||||||
|
We start by creating the project:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
prj = make_project
|
||||||
|
```
|
||||||
|
|
||||||
|
`make_project` is method of IntegrationTest which generates a source and a binary directory for it based on the name of our test class and test method. The project doesn't contain anything yet, so let's create some source files:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
prj.create_file 'main.cpp', <<~SRC
|
||||||
|
#include <iostream>
|
||||||
|
#include <adder/adder.hpp>
|
||||||
|
int main() {
|
||||||
|
std::cout << adder::add(1, 2) << '\\n';
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
SRC
|
||||||
|
prj.create_file 'CMakeLists.txt', <<~SRC
|
||||||
|
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||||
|
project(using-adder)
|
||||||
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
||||||
|
include("%{cpm_path}")
|
||||||
|
CPMAddPackage("gh:cpm-cmake/testpack-adder@1.0.0")
|
||||||
|
add_executable(using-adder main.cpp)
|
||||||
|
target_link_libraries(using-adder adder)
|
||||||
|
SRC
|
||||||
|
```
|
||||||
|
|
||||||
|
Note the line `include("%{cpm_path}")` when creating `CMakeLists.txt`. It contains a markup `%{cpm_path}`. `Project#create_file` will see such markups and substitute them with the appropriate values (in this case the path to CPM.cmake).
|
||||||
|
|
||||||
|
Now that we have the two files we need it's time we configure our project. We can use the opportunity to assert that the configure is successful as we expect it to be.
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
assert_success prj.configure
|
||||||
|
```
|
||||||
|
|
||||||
|
Now we can read the generated `CMakeCache.txt` and assert that certain values we expect are inside. `Project` provides a method for that: `read_cache`. It will return an instance of `Project::CMakeCache` which contains the data from the cache and provides additional helper functionalities. One of them is `packages`, which is a hash of the CPM.cmake packages in the cache with their versions, binary, source directories. So let's get the cache and assert that there is only one CPM.cmake package inside ant it has the version we expect.
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
cache = prj.read_cache
|
||||||
|
assert_equal 1, cache.packages.size
|
||||||
|
assert_equal '1.0.0', cache.packages['testpack-adder'].ver
|
||||||
|
```
|
||||||
|
|
||||||
|
Finally let's assert that the project can be built. This would mean that CPM.cmake has made the package available to our test project and that it has the appropriate include directories and link libraries to make an executable out of `main.cpp`.
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
assert_success prj.build
|
||||||
|
```
|
||||||
|
|
||||||
|
You can see the entire code for this tutorial in [tutorial.rb](tutorial.rb) in this directory.
|
37
test/integration/tutorial.rb
Normal file
37
test/integration/tutorial.rb
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
# This file is intentionally not prefixed with test_
|
||||||
|
# It is a tutorial for making integration tests and is not to be run from the runner
|
||||||
|
require_relative './lib'
|
||||||
|
|
||||||
|
class Tutorial < IntegrationTest
|
||||||
|
# test that CPM.cmake can make https://github.com/cpm-cmake/testpack-adder/ available as a package
|
||||||
|
def test_make_adder_available
|
||||||
|
prj = make_project
|
||||||
|
|
||||||
|
prj.create_file 'main.cpp', <<~SRC
|
||||||
|
#include <iostream>
|
||||||
|
#include <adder/adder.hpp>
|
||||||
|
int main() {
|
||||||
|
std::cout << adder::add(1, 2) << '\\n';
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
SRC
|
||||||
|
|
||||||
|
prj.create_file 'CMakeLists.txt', <<~SRC
|
||||||
|
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||||
|
project(using-adder)
|
||||||
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
|
||||||
|
include("%{cpm_path}")
|
||||||
|
CPMAddPackage("gh:cpm-cmake/testpack-adder@1.0.0")
|
||||||
|
add_executable(using-adder main.cpp)
|
||||||
|
target_link_libraries(using-adder adder)
|
||||||
|
SRC
|
||||||
|
|
||||||
|
assert_success prj.configure
|
||||||
|
|
||||||
|
cache = prj.read_cache
|
||||||
|
assert_equal 1, cache.packages.size
|
||||||
|
assert_equal '1.0.0', cache.packages['testpack-adder'].ver
|
||||||
|
|
||||||
|
assert_success prj.build
|
||||||
|
end
|
||||||
|
end
|
@ -6,7 +6,9 @@ include(${CMAKE_CURRENT_LIST_DIR}/../../cmake/CPM.cmake)
|
|||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage(
|
||||||
NAME Format.cmake
|
NAME Format.cmake
|
||||||
VERSION 1.6
|
VERSION 1.7.3
|
||||||
GITHUB_REPOSITORY TheLartians/Format.cmake
|
GITHUB_REPOSITORY TheLartians/Format.cmake
|
||||||
OPTIONS "FORMAT_CHECK_CMAKE ON"
|
# We exclude cmake files from integration tests as they contain invalid lines of code which are
|
||||||
|
# used by the integration test scripts
|
||||||
|
OPTIONS "CMAKE_FORMAT_EXCLUDE integration/templates"
|
||||||
)
|
)
|
||||||
|
2
test/unit/broken_dependency/.gitignore
vendored
Normal file
2
test/unit/broken_dependency/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
/CMakeLists.txt
|
||||||
|
/package-lock.cmake
|
13
test/unit/broken_dependency/CMakeLists.txt.in
Normal file
13
test/unit/broken_dependency/CMakeLists.txt.in
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||||
|
|
||||||
|
project(CPMTest)
|
||||||
|
|
||||||
|
# ---- Dependencies ----
|
||||||
|
|
||||||
|
include(@CPM_PATH@/CPM.cmake)
|
||||||
|
|
||||||
|
CPMAddPackage(
|
||||||
|
NAME BrokenDependency
|
||||||
|
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/dependency
|
||||||
|
EXCLUDE_FROM_ALL @EXCLUDE_FROM_ALL@
|
||||||
|
)
|
3
test/unit/broken_dependency/dependency/CMakeLists.txt
Normal file
3
test/unit/broken_dependency/dependency/CMakeLists.txt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
project(BrokenDependency)
|
||||||
|
|
||||||
|
add_custom_target(error ALL ${CMAKE_COMMAND} -E false)
|
@ -26,6 +26,17 @@ function(reset_test)
|
|||||||
update_cmake_lists()
|
update_cmake_lists()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
function(assert_cache_directory_count directory count)
|
||||||
|
set(version_count 0)
|
||||||
|
file(GLOB potential_versions ${directory})
|
||||||
|
foreach(entry ${potential_versions})
|
||||||
|
if(IS_DIRECTORY ${entry})
|
||||||
|
math(EXPR version_count "${version_count} + 1")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
assert_equal("${version_count}" "${count}")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
set(FIBONACCI_VERSION 1.0)
|
set(FIBONACCI_VERSION 1.0)
|
||||||
|
|
||||||
# Read CPM_SOURCE_CACHE from arguments
|
# Read CPM_SOURCE_CACHE from arguments
|
||||||
@ -33,20 +44,14 @@ set(FIBONACCI_VERSION 1.0)
|
|||||||
reset_test()
|
reset_test()
|
||||||
|
|
||||||
execute_process(
|
execute_process(
|
||||||
COMMAND ${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/remote_dependency" "-B${TEST_BUILD_DIR}"
|
COMMAND ${CMAKE_COMMAND} "-S${CMAKE_CURRENT_LIST_DIR}/remote_dependency" "-B${TEST_BUILD_DIR}"
|
||||||
"-DCPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}" RESULT_VARIABLE ret
|
"-DCPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}" RESULT_VARIABLE ret
|
||||||
)
|
)
|
||||||
|
|
||||||
assert_equal(${ret} "0")
|
assert_equal(${ret} "0")
|
||||||
assert_exists("${CPM_SOURCE_CACHE_DIR}/fibonacci")
|
assert_exists("${CPM_SOURCE_CACHE_DIR}/fibonacci")
|
||||||
|
|
||||||
file(GLOB FIBONACCI_VERSIONs "${CPM_SOURCE_CACHE_DIR}/fibonacci/*")
|
assert_cache_directory_count("${CPM_SOURCE_CACHE_DIR}/fibonacci/*" 1)
|
||||||
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
|
# Update dependency and keep CPM_SOURCE_CACHE
|
||||||
|
|
||||||
@ -54,12 +59,9 @@ set(FIBONACCI_VERSION 2.0)
|
|||||||
update_cmake_lists()
|
update_cmake_lists()
|
||||||
|
|
||||||
execute_process(COMMAND ${CMAKE_COMMAND} ${TEST_BUILD_DIR} RESULT_VARIABLE ret)
|
execute_process(COMMAND ${CMAKE_COMMAND} ${TEST_BUILD_DIR} RESULT_VARIABLE ret)
|
||||||
|
|
||||||
assert_equal(${ret} "0")
|
assert_equal(${ret} "0")
|
||||||
|
|
||||||
file(GLOB FIBONACCI_VERSIONs "${CPM_SOURCE_CACHE_DIR}/fibonacci/*")
|
assert_cache_directory_count("${CPM_SOURCE_CACHE_DIR}/fibonacci/*" 2)
|
||||||
list(LENGTH FIBONACCI_VERSIONs FIBONACCI_VERSION_count)
|
|
||||||
assert_equal(${FIBONACCI_VERSION_count} "2")
|
|
||||||
|
|
||||||
# Clear cache and update
|
# Clear cache and update
|
||||||
|
|
||||||
@ -76,7 +78,7 @@ reset_test()
|
|||||||
|
|
||||||
execute_process(
|
execute_process(
|
||||||
COMMAND ${CMAKE_COMMAND} -E env "CPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}" ${CMAKE_COMMAND}
|
COMMAND ${CMAKE_COMMAND} -E env "CPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}" ${CMAKE_COMMAND}
|
||||||
"-H${CMAKE_CURRENT_LIST_DIR}/remote_dependency" "-B${TEST_BUILD_DIR}" RESULT_VARIABLE ret
|
"-S${CMAKE_CURRENT_LIST_DIR}/remote_dependency" "-B${TEST_BUILD_DIR}" RESULT_VARIABLE ret
|
||||||
)
|
)
|
||||||
|
|
||||||
assert_equal(${ret} "0")
|
assert_equal(${ret} "0")
|
||||||
@ -86,7 +88,7 @@ assert_exists("${CPM_SOURCE_CACHE_DIR}/fibonacci")
|
|||||||
|
|
||||||
execute_process(
|
execute_process(
|
||||||
COMMAND ${CMAKE_COMMAND} -E env "CPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}" ${CMAKE_COMMAND}
|
COMMAND ${CMAKE_COMMAND} -E env "CPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}" ${CMAKE_COMMAND}
|
||||||
"-H${CMAKE_CURRENT_LIST_DIR}/remote_dependency" "-B${TEST_BUILD_DIR}-2"
|
"-S${CMAKE_CURRENT_LIST_DIR}/remote_dependency" "-B${TEST_BUILD_DIR}-2"
|
||||||
RESULT_VARIABLE ret
|
RESULT_VARIABLE ret
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -99,7 +101,7 @@ reset_test()
|
|||||||
execute_process(
|
execute_process(
|
||||||
COMMAND
|
COMMAND
|
||||||
${CMAKE_COMMAND} -E env "CPM_SOURCE_CACHE=${CMAKE_CURRENT_BINARY_DIR}/junk" ${CMAKE_COMMAND}
|
${CMAKE_COMMAND} -E env "CPM_SOURCE_CACHE=${CMAKE_CURRENT_BINARY_DIR}/junk" ${CMAKE_COMMAND}
|
||||||
"-H${CMAKE_CURRENT_LIST_DIR}/remote_dependency" "-B${TEST_BUILD_DIR}"
|
"-S${CMAKE_CURRENT_LIST_DIR}/remote_dependency" "-B${TEST_BUILD_DIR}"
|
||||||
"-DCPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}"
|
"-DCPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}"
|
||||||
RESULT_VARIABLE ret
|
RESULT_VARIABLE ret
|
||||||
)
|
)
|
||||||
@ -116,7 +118,7 @@ reset_test()
|
|||||||
|
|
||||||
execute_process(
|
execute_process(
|
||||||
COMMAND ${CMAKE_COMMAND} -E env "CPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}" ${CMAKE_COMMAND}
|
COMMAND ${CMAKE_COMMAND} -E env "CPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}" ${CMAKE_COMMAND}
|
||||||
"-H${CMAKE_CURRENT_LIST_DIR}/remote_dependency" "-B${TEST_BUILD_DIR}" RESULT_VARIABLE ret
|
"-S${CMAKE_CURRENT_LIST_DIR}/remote_dependency" "-B${TEST_BUILD_DIR}" RESULT_VARIABLE ret
|
||||||
)
|
)
|
||||||
|
|
||||||
assert_equal(${ret} "0")
|
assert_equal(${ret} "0")
|
||||||
@ -130,8 +132,24 @@ update_cmake_lists()
|
|||||||
|
|
||||||
execute_process(
|
execute_process(
|
||||||
COMMAND ${CMAKE_COMMAND} -E env "CPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}" ${CMAKE_COMMAND}
|
COMMAND ${CMAKE_COMMAND} -E env "CPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}" ${CMAKE_COMMAND}
|
||||||
"-H${CMAKE_CURRENT_LIST_DIR}/remote_dependency" "-B${TEST_BUILD_DIR}" RESULT_VARIABLE ret
|
"-S${CMAKE_CURRENT_LIST_DIR}/remote_dependency" "-B${TEST_BUILD_DIR}" RESULT_VARIABLE ret
|
||||||
)
|
)
|
||||||
|
|
||||||
assert_equal(${ret} "0")
|
assert_equal(${ret} "0")
|
||||||
assert_not_exists("${CPM_SOURCE_CACHE_DIR}/fibonacci")
|
assert_not_exists("${CPM_SOURCE_CACHE_DIR}/fibonacci")
|
||||||
|
|
||||||
|
# Use custom cache directory
|
||||||
|
|
||||||
|
set(FIBONACCI_PACKAGE_ARGS
|
||||||
|
"CUSTOM_CACHE_KEY my_custom_unique_dir GIT_TAG e9ebf168ca0fffaa4ef8c6fefc6346aaa22f6ed5"
|
||||||
|
)
|
||||||
|
set(FIBONACCI_VERSION 1.1)
|
||||||
|
update_cmake_lists()
|
||||||
|
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E env "CPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}" ${CMAKE_COMMAND}
|
||||||
|
"-S${CMAKE_CURRENT_LIST_DIR}/remote_dependency" "-B${TEST_BUILD_DIR}" RESULT_VARIABLE ret
|
||||||
|
)
|
||||||
|
|
||||||
|
assert_equal(${ret} "0")
|
||||||
|
assert_exists("${CPM_SOURCE_CACHE_DIR}/fibonacci/my_custom_unique_dir")
|
||||||
|
@ -6,6 +6,7 @@ include(${CPM_PATH}/testing.cmake)
|
|||||||
set(CPM_DRY_RUN ON)
|
set(CPM_DRY_RUN ON)
|
||||||
|
|
||||||
CPMAddPackage(NAME A GIT_TAG 1.2.3)
|
CPMAddPackage(NAME A GIT_TAG 1.2.3)
|
||||||
|
assert_equal("${CPM_LAST_PACKAGE_NAME}" "A")
|
||||||
|
|
||||||
CPMAddPackage(NAME A VERSION 1.2.3)
|
CPMAddPackage(NAME A VERSION 1.2.3)
|
||||||
|
|
||||||
@ -17,6 +18,8 @@ CPMAddPackage(NAME B VERSION 2.4.1)
|
|||||||
CPMAddPackage(NAME B GIT_TAG v2.3.1)
|
CPMAddPackage(NAME B GIT_TAG v2.3.1)
|
||||||
|
|
||||||
CPMGetPackageVersion(B VERSION)
|
CPMGetPackageVersion(B VERSION)
|
||||||
|
assert_equal("${CPM_LAST_PACKAGE_NAME}" "B")
|
||||||
|
|
||||||
assert_equal(${VERSION} "2.4.1")
|
assert_equal(${VERSION} "2.4.1")
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage(
|
||||||
@ -24,6 +27,10 @@ CPMAddPackage(
|
|||||||
GIT_TAG v3.1.2-a
|
GIT_TAG v3.1.2-a
|
||||||
VERSION 3.1.2
|
VERSION 3.1.2
|
||||||
)
|
)
|
||||||
|
assert_equal("${CPM_LAST_PACKAGE_NAME}" "C")
|
||||||
|
|
||||||
CPMGetPackageVersion(C VERSION)
|
CPMGetPackageVersion(C VERSION)
|
||||||
assert_equal(${VERSION} "3.1.2")
|
assert_equal(${VERSION} "3.1.2")
|
||||||
|
|
||||||
|
CPMAddPackage("gh:dry-run/D")
|
||||||
|
assert_equal("${CPM_LAST_PACKAGE_NAME}" "D")
|
||||||
|
49
test/unit/dirty-cache-check.cmake
Normal file
49
test/unit/dirty-cache-check.cmake
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
include(${CPM_PATH}/CPM.cmake)
|
||||||
|
include(${CPM_PATH}/testing.cmake)
|
||||||
|
|
||||||
|
set(baseDir "${CMAKE_CURRENT_BINARY_DIR}/test_dirty_cache")
|
||||||
|
|
||||||
|
find_package(Git REQUIRED)
|
||||||
|
|
||||||
|
function(git_do dir)
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${GIT_EXECUTABLE} -c user.name='User' -c user.email='user@email.org' ${ARGN}
|
||||||
|
RESULT_VARIABLE result
|
||||||
|
OUTPUT_VARIABLE status
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
WORKING_DIRECTORY "${dir}"
|
||||||
|
)
|
||||||
|
if(result)
|
||||||
|
message(FATAL_ERROR "git ${ARGN} fail: ${result} ${status}")
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
file(MAKE_DIRECTORY "${baseDir}")
|
||||||
|
|
||||||
|
file(WRITE "${baseDir}/draft.txt" "this is a test")
|
||||||
|
|
||||||
|
git_do("${baseDir}" init -b main)
|
||||||
|
git_do("${baseDir}" commit --allow-empty -m "empty repo")
|
||||||
|
message(STATUS "empty repo with file")
|
||||||
|
cpm_check_git_working_dir_is_clean(${baseDir} HEAD emptygit_test)
|
||||||
|
assert_falsy(emptygit_test)
|
||||||
|
|
||||||
|
git_do("${baseDir}" add draft.txt)
|
||||||
|
git_do("${baseDir}" commit -m "test change")
|
||||||
|
git_do("${baseDir}" tag v0.0.0)
|
||||||
|
message(STATUS "commit a change")
|
||||||
|
cpm_check_git_working_dir_is_clean(${baseDir} v0.0.0 onecommit_test)
|
||||||
|
assert_truthy(onecommit_test)
|
||||||
|
|
||||||
|
file(WRITE "${baseDir}/draft.txt" "a modification")
|
||||||
|
message(STATUS "dirty repo")
|
||||||
|
cpm_check_git_working_dir_is_clean(${baseDir} v0.0.0 nonemptygit_test)
|
||||||
|
assert_falsy(nonemptygit_test)
|
||||||
|
|
||||||
|
git_do("${baseDir}" add draft.txt)
|
||||||
|
git_do("${baseDir}" commit -m "another change")
|
||||||
|
message(STATUS "repo clean")
|
||||||
|
cpm_check_git_working_dir_is_clean(${baseDir} v0.0.0 twocommit_test)
|
||||||
|
assert_falsy(twocommit_test)
|
||||||
|
|
||||||
|
file(REMOVE_RECURSE "${baseDir}")
|
35
test/unit/exclude_from_all.cmake
Normal file
35
test/unit/exclude_from_all.cmake
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
include(CMakePackageConfigHelpers)
|
||||||
|
include(${CPM_PATH}/testing.cmake)
|
||||||
|
|
||||||
|
set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/exclude_from_all)
|
||||||
|
|
||||||
|
function(init_project EXCLUDE_FROM_ALL)
|
||||||
|
configure_package_config_file(
|
||||||
|
"${CMAKE_CURRENT_LIST_DIR}/broken_dependency/CMakeLists.txt.in"
|
||||||
|
"${CMAKE_CURRENT_LIST_DIR}/broken_dependency/CMakeLists.txt"
|
||||||
|
INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/junk
|
||||||
|
)
|
||||||
|
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${CMAKE_COMMAND} "-S${CMAKE_CURRENT_LIST_DIR}/broken_dependency" "-B${TEST_BUILD_DIR}"
|
||||||
|
RESULT_VARIABLE ret
|
||||||
|
)
|
||||||
|
|
||||||
|
assert_equal(${ret} "0")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(build_project expected_success)
|
||||||
|
execute_process(COMMAND ${CMAKE_COMMAND} "--build" "${TEST_BUILD_DIR}" RESULT_VARIABLE ret)
|
||||||
|
|
||||||
|
if(expected_success)
|
||||||
|
assert_equal(${ret} 0)
|
||||||
|
else()
|
||||||
|
assert_not_equal(${ret} 0)
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
init_project(FALSE)
|
||||||
|
build_project(FALSE)
|
||||||
|
|
||||||
|
init_project(TRUE)
|
||||||
|
build_project(TRUE)
|
38
test/unit/fetchcontent_dependency.cmake
Normal file
38
test/unit/fetchcontent_dependency.cmake
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
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}/fetchcontent_dependency)
|
||||||
|
|
||||||
|
function(clear_cache)
|
||||||
|
message(STATUS "clearing CPM cache")
|
||||||
|
file(REMOVE_RECURSE ${CPM_SOURCE_CACHE_DIR})
|
||||||
|
assert_not_exists("${CPM_SOURCE_CACHE_DIR}")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(update_cmake_lists)
|
||||||
|
configure_package_config_file(
|
||||||
|
"${CMAKE_CURRENT_LIST_DIR}/fetchcontent_dependency/CMakeLists.txt.in"
|
||||||
|
"${CMAKE_CURRENT_LIST_DIR}/fetchcontent_dependency/CMakeLists.txt"
|
||||||
|
INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/junk
|
||||||
|
)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(reset_test)
|
||||||
|
clear_cache()
|
||||||
|
file(REMOVE_RECURSE ${TEST_BUILD_DIR})
|
||||||
|
update_cmake_lists()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# Read CPM_SOURCE_CACHE from arguments
|
||||||
|
|
||||||
|
reset_test()
|
||||||
|
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${CMAKE_COMMAND} "-S${CMAKE_CURRENT_LIST_DIR}/fetchcontent_dependency"
|
||||||
|
"-B${TEST_BUILD_DIR}" "-DCPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}" RESULT_VARIABLE ret
|
||||||
|
)
|
||||||
|
|
||||||
|
assert_equal(${ret} "0")
|
2
test/unit/fetchcontent_dependency/.gitignore
vendored
Normal file
2
test/unit/fetchcontent_dependency/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
/CMakeLists.txt
|
||||||
|
/package-lock.cmake
|
38
test/unit/fetchcontent_dependency/CMakeLists.txt.in
Normal file
38
test/unit/fetchcontent_dependency/CMakeLists.txt.in
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
# ~~~
|
||||||
|
# ┌────────────────────────┐
|
||||||
|
# │ FetchContentDependency │
|
||||||
|
# └─────┬────────────┬─────┘
|
||||||
|
# │1. │3.
|
||||||
|
# │ │
|
||||||
|
# ┌────────▼────┐ ┌───▼─────────┐
|
||||||
|
# │ Dependency ├───► Fibonacci │
|
||||||
|
# └─────────────┘2. └─────────────┘
|
||||||
|
#
|
||||||
|
# 1. Add Project with CPMAddPackage
|
||||||
|
# 2. Dependency will add Fibonacci with FetchContent
|
||||||
|
# 3. Our project add Fibonacci with CPMAddPackage
|
||||||
|
# ~~~
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||||
|
|
||||||
|
project(CPMTest_FetchContentDependency)
|
||||||
|
|
||||||
|
# ---- Dependencies ----
|
||||||
|
|
||||||
|
include(@CPM_PATH@/CPM.cmake)
|
||||||
|
|
||||||
|
# 1 & 2 Dependency will add Fibonacci using FetchContent (1 & 2)
|
||||||
|
CPMAddPackage(NAME Dependency SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/dependency)
|
||||||
|
|
||||||
|
# 3 Add again Fibonacci that have already been populated with FetchContent_MakeAvailable
|
||||||
|
#
|
||||||
|
# * This test should highlight the fact that cpm_add_subdirectory is always called, even when
|
||||||
|
# cpm_fetch_package isn't populating the dependency
|
||||||
|
# * NO_CACHE YES highlight a bug introduced in 32b063eba5c754f833725ed4b9e5f352bc3ca959 where
|
||||||
|
# cpm_fetch_package was checking undefined ${lower_case_name}_POPULATED variable
|
||||||
|
CPMAddPackage(
|
||||||
|
NAME Fibonacci
|
||||||
|
GIT_REPOSITORY https://github.com/cpm-cmake/testpack-fibonacci.git
|
||||||
|
VERSION 2.0
|
||||||
|
NO_CACHE YES
|
||||||
|
)
|
15
test/unit/fetchcontent_dependency/dependency/CMakeLists.txt
Normal file
15
test/unit/fetchcontent_dependency/dependency/CMakeLists.txt
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||||
|
|
||||||
|
project(CPMTest_Dependency)
|
||||||
|
|
||||||
|
# ---- Dependencies ----
|
||||||
|
|
||||||
|
include(FetchContent)
|
||||||
|
|
||||||
|
FetchContent_Declare(
|
||||||
|
Fibonacci
|
||||||
|
GIT_REPOSITORY https://github.com/cpm-cmake/testpack-fibonacci.git
|
||||||
|
GIT_TAG v2.0
|
||||||
|
)
|
||||||
|
|
||||||
|
FetchContent_MakeAvailable(Fibonacci)
|
93
test/unit/get_shortest_hash.cmake
Normal file
93
test/unit/get_shortest_hash.cmake
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||||
|
|
||||||
|
include(${CPM_PATH}/CPM.cmake)
|
||||||
|
include(${CPM_PATH}/testing.cmake)
|
||||||
|
|
||||||
|
# Random suffix
|
||||||
|
string(
|
||||||
|
RANDOM
|
||||||
|
LENGTH 6
|
||||||
|
ALPHABET "0123456789abcdef" tmpdir_suffix
|
||||||
|
)
|
||||||
|
|
||||||
|
# Seconds since epoch
|
||||||
|
string(TIMESTAMP tmpdir_base "%s" UTC)
|
||||||
|
|
||||||
|
set(tmp "${CMAKE_CURRENT_BINARY_DIR}/get_shortest_hash-${tmpdir_base}-${tmpdir_suffix}")
|
||||||
|
|
||||||
|
if(IS_DIRECTORY ${tmp})
|
||||||
|
message(FATAL_ERROR "Test directory ${tmp} already exists")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
file(MAKE_DIRECTORY "${tmp}")
|
||||||
|
|
||||||
|
# 1. Sanity check: none of these directories should exist yet
|
||||||
|
|
||||||
|
assert_not_exists(${tmp}/cccb.hash)
|
||||||
|
assert_not_exists(${tmp}/cccb77ae.hash)
|
||||||
|
assert_not_exists(${tmp}/cccb77ae9609.hash)
|
||||||
|
assert_not_exists(${tmp}/cccb77ae9608.hash)
|
||||||
|
assert_not_exists(${tmp}/cccb77be.hash)
|
||||||
|
|
||||||
|
# 1. The directory is empty, so it should get a 4-character hash
|
||||||
|
cpm_get_shortest_hash(${tmp} "cccb77ae9609d2768ed80dd42cec54f77b1f1455" hash)
|
||||||
|
assert_equal(${hash} "cccb")
|
||||||
|
assert_contents_equal(${tmp}/cccb.hash cccb77ae9609d2768ed80dd42cec54f77b1f1455)
|
||||||
|
|
||||||
|
# 1. Calling the function with a new hash that differs subtly should result in more characters being
|
||||||
|
# used, enough to uniquely identify the hash
|
||||||
|
|
||||||
|
cpm_get_shortest_hash(${tmp} "cccb77ae9609d2768ed80dd42cec54f77b1f1456" hash)
|
||||||
|
assert_equal(${hash} "cccb77ae")
|
||||||
|
assert_contents_equal(${tmp}/cccb77ae.hash cccb77ae9609d2768ed80dd42cec54f77b1f1456)
|
||||||
|
|
||||||
|
cpm_get_shortest_hash(${tmp} "cccb77ae9609d2768ed80dd42cec54f77b1f1457" hash)
|
||||||
|
assert_equal(${hash} "cccb77ae9609")
|
||||||
|
assert_contents_equal(${tmp}/cccb77ae9609.hash cccb77ae9609d2768ed80dd42cec54f77b1f1457)
|
||||||
|
|
||||||
|
cpm_get_shortest_hash(${tmp} "cccb77ae9608d2768ed80dd42cec54f77b1f1455" hash)
|
||||||
|
assert_equal(${hash} "cccb77ae9608")
|
||||||
|
assert_contents_equal(${tmp}/cccb77ae9608.hash cccb77ae9608d2768ed80dd42cec54f77b1f1455)
|
||||||
|
|
||||||
|
cpm_get_shortest_hash(${tmp} "cccb77be9609d2768ed80dd42cec54f77b1f1456" hash)
|
||||||
|
assert_equal(${hash} "cccb77be")
|
||||||
|
assert_contents_equal(${tmp}/cccb77be.hash cccb77be9609d2768ed80dd42cec54f77b1f1456)
|
||||||
|
|
||||||
|
# check that legacy hashs are recognized
|
||||||
|
file(MAKE_DIRECTORY "${tmp}/cccb77be9609d2768ed80dd42cec54f77b1f1457")
|
||||||
|
cpm_get_shortest_hash(${tmp} "cccb77be9609d2768ed80dd42cec54f77b1f1457" hash)
|
||||||
|
assert_equal(${hash} "cccb77be9609d2768ed80dd42cec54f77b1f1457")
|
||||||
|
|
||||||
|
# 1. The old file should still exist, and have the same content
|
||||||
|
assert_contents_equal(${tmp}/cccb.hash cccb77ae9609d2768ed80dd42cec54f77b1f1455)
|
||||||
|
assert_contents_equal(${tmp}/cccb77ae.hash cccb77ae9609d2768ed80dd42cec54f77b1f1456)
|
||||||
|
assert_contents_equal(${tmp}/cccb77ae9609.hash cccb77ae9609d2768ed80dd42cec54f77b1f1457)
|
||||||
|
assert_contents_equal(${tmp}/cccb77ae9608.hash cccb77ae9608d2768ed80dd42cec54f77b1f1455)
|
||||||
|
assert_contents_equal(${tmp}/cccb77be.hash cccb77be9609d2768ed80dd42cec54f77b1f1456)
|
||||||
|
|
||||||
|
# 1. Confirm idempotence: calling any of these function should produce the same hash as before (hash
|
||||||
|
# lookups work correctly once the .hash files are created)
|
||||||
|
|
||||||
|
cpm_get_shortest_hash(${tmp} "cccb77ae9609d2768ed80dd42cec54f77b1f1455" hash)
|
||||||
|
assert_equal(${hash} "cccb")
|
||||||
|
assert_contents_equal(${tmp}/cccb.hash cccb77ae9609d2768ed80dd42cec54f77b1f1455)
|
||||||
|
|
||||||
|
cpm_get_shortest_hash(${tmp} "cccb77ae9609d2768ed80dd42cec54f77b1f1456" hash)
|
||||||
|
assert_equal(${hash} "cccb77ae")
|
||||||
|
assert_contents_equal(${tmp}/cccb77ae.hash cccb77ae9609d2768ed80dd42cec54f77b1f1456)
|
||||||
|
|
||||||
|
cpm_get_shortest_hash(${tmp} "cccb77ae9609d2768ed80dd42cec54f77b1f1457" hash)
|
||||||
|
assert_equal(${hash} "cccb77ae9609")
|
||||||
|
assert_contents_equal(${tmp}/cccb77ae9609.hash cccb77ae9609d2768ed80dd42cec54f77b1f1457)
|
||||||
|
|
||||||
|
cpm_get_shortest_hash(${tmp} "cccb77ae9608d2768ed80dd42cec54f77b1f1455" hash)
|
||||||
|
assert_equal(${hash} "cccb77ae9608")
|
||||||
|
assert_contents_equal(${tmp}/cccb77ae9608.hash cccb77ae9608d2768ed80dd42cec54f77b1f1455)
|
||||||
|
|
||||||
|
cpm_get_shortest_hash(${tmp} "cccb77be9609d2768ed80dd42cec54f77b1f1456" hash)
|
||||||
|
assert_equal(${hash} "cccb77be")
|
||||||
|
assert_contents_equal(${tmp}/cccb77be.hash cccb77be9609d2768ed80dd42cec54f77b1f1456)
|
||||||
|
|
||||||
|
# 1. Cleanup - remove the temporary directory that we created
|
||||||
|
|
||||||
|
file(REMOVE_RECURSE ${tmp})
|
@ -8,6 +8,10 @@ option(ENABLE_TEST_COVERAGE "Enable test coverage" OFF)
|
|||||||
|
|
||||||
# ---- Dependencies ----
|
# ---- Dependencies ----
|
||||||
|
|
||||||
|
if (@TEST_FORCE_MODULE_MODE@)
|
||||||
|
unset(CMAKE_FIND_PACKAGE_REDIRECTS_DIR CACHE)
|
||||||
|
endif()
|
||||||
|
|
||||||
include(@CPM_PATH@/CPM.cmake)
|
include(@CPM_PATH@/CPM.cmake)
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage(
|
||||||
@ -15,20 +19,23 @@ CPMAddPackage(
|
|||||||
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/dependency
|
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/dependency
|
||||||
)
|
)
|
||||||
|
|
||||||
# ---- check if generated modules override find_package ----
|
|
||||||
|
|
||||||
if (@test_check_find_package@)
|
|
||||||
find_package(@TEST_DEPENDENCY_NAME@ REQUIRED)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# ---- Call dependency method to validate correct addition of directory ----
|
# ---- Call dependency method to validate correct addition of directory ----
|
||||||
|
|
||||||
dependency_function()
|
dependency_function()
|
||||||
|
|
||||||
# ---- Check parameters ----
|
# ---- Check newly added ----
|
||||||
|
|
||||||
include(@CPM_PATH@/testing.cmake)
|
include(@CPM_PATH@/testing.cmake)
|
||||||
|
|
||||||
ASSERT_TRUTHY(@TEST_DEPENDENCY_NAME@_ADDED)
|
ASSERT_TRUTHY(@TEST_DEPENDENCY_NAME@_ADDED)
|
||||||
|
|
||||||
|
# ---- Check if generated modules override find_package ----
|
||||||
|
|
||||||
|
if (@TEST_FIND_PACKAGE@)
|
||||||
|
find_package(@TEST_DEPENDENCY_NAME@ @TEST_FIND_PACKAGE_CONFIG@ REQUIRED)
|
||||||
|
find_package(@TEST_CANT_FIND_PACKAGE_NAME@ @TEST_FIND_PACKAGE_CONFIG@ QUIET)
|
||||||
|
ASSERT_FALSY(@TEST_CANT_FIND_PACKAGE_NAME@_FOUND)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# ---- Check parameters ----
|
||||||
ASSERT_DEFINED(@TEST_DEPENDENCY_NAME@_SOURCE_DIR)
|
ASSERT_DEFINED(@TEST_DEPENDENCY_NAME@_SOURCE_DIR)
|
||||||
ASSERT_DEFINED(@TEST_DEPENDENCY_NAME@_BINARY_DIR)
|
ASSERT_DEFINED(@TEST_DEPENDENCY_NAME@_BINARY_DIR)
|
||||||
|
ASSERT_EQUAL("${CPM_LAST_PACKAGE_NAME}" "@TEST_DEPENDENCY_NAME@")
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user