Compare commits

..

1 Commits

Author SHA1 Message Date
Lars Melchior
9967fea35c add on-demand download script to release 2020-08-20 09:25:05 +02:00
65 changed files with 685 additions and 1180 deletions

View File

@@ -1,16 +0,0 @@
---
BasedOnStyle: Google
AccessModifierOffset: '-2'
AlignTrailingComments: 'true'
AllowAllParametersOfDeclarationOnNextLine: 'false'
AlwaysBreakTemplateDeclarations: 'No'
BreakBeforeBraces: Attach
ColumnLimit: '100'
ConstructorInitializerAllOnOneLineOrOnePerLine: 'true'
IncludeBlocks: Regroup
IndentPPDirectives: AfterHash
IndentWidth: '2'
NamespaceIndentation: All
BreakBeforeBinaryOperators: All
BreakBeforeTernaryOperators: 'true'
...

View File

@@ -1,72 +0,0 @@
format:
tab_size: 2
line_width: 100
dangle_parens: true
parse:
additional_commands:
cpmaddpackage:
pargs:
nargs: '*'
flags: []
spelling: CPMAddPackage
kwargs: &cpmaddpackagekwargs
NAME: 1
FORCE: 1
VERSION: 1
GIT_TAG: 1
DOWNLOAD_ONLY: 1
GITHUB_REPOSITORY: 1
GITLAB_REPOSITORY: 1
GIT_REPOSITORY: 1
SVN_REPOSITORY: 1
SVN_REVISION: 1
SOURCE_DIR: 1
DOWNLOAD_COMMAND: 1
FIND_PACKAGE_ARGUMENTS: 1
NO_CACHE: 1
GIT_SHALLOW: 1
URL: 1
URL_HASH: 1
URL_MD5: 1
DOWNLOAD_NAME: 1
DOWNLOAD_NO_EXTRACT: 1
HTTP_USERNAME: 1
HTTP_PASSWORD: 1
EXCLUDE_FROM_ALL: 1
OPTIONS: +
cpmfindpackage:
pargs:
nargs: '*'
flags: []
spelling: CPMFindPackage
kwargs: *cpmaddpackagekwargs
cpmdeclarepackage:
pargs:
nargs: '*'
flags: []
spelling: CPMDeclarePackage
kwargs: *cpmaddpackagekwargs
packageproject:
pargs:
nargs: '*'
flags: []
spelling: packageProject
kwargs:
NAME: 1
VERSION: 1
INCLUDE_DIR: 1
INCLUDE_DESTINATION: 1
BINARY_DIR: 1
COMPATIBILITY: 1
VERSION_HEADER: 1
DEPENDENCIES: +
cpmusepackagelock:
pargs: 1
spelling: CPMUsePackageLock
cpmregisterpackage:
pargs: 1
spelling: CPMRegisterPackage
cpmgetpackageversion:
pargs: 2
spelling: CPMGetPackageVersion

View File

@@ -15,8 +15,8 @@ jobs:
- 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 "s/0.27.2-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 "s/0.27.2-development-version/${GITHUB_REF/refs\/tags\/v}/g" 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

View File

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

3
.gitignore vendored
View File

@@ -1,4 +1,3 @@
build/
/build* /build*
/.vscode /.vscode
*.DS_Store *.DS_Store

View File

@@ -1,13 +1,11 @@
[![Build Status](https://travis-ci.com/cpm-cmake/CPM.cmake.svg?branch=master)](https://travis-ci.com/cpm-cmake/CPM.cmake) [![Build Status](https://travis-ci.com/TheLartians/CPM.cmake.svg?branch=master)](https://travis-ci.com/TheLartians/CPM.cmake)
[![Actions Status](https://github.com/cpm-cmake/CPM.cmake/workflows/MacOS/badge.svg)](https://github.com/cpm-cmake/CPM.cmake/actions) [![Actions Status](https://github.com/TheLartians/CPM.cmake/workflows/MacOS/badge.svg)](https://github.com/TheLartians/CPM.cmake/actions)
[![Actions Status](https://github.com/cpm-cmake/CPM.cmake/workflows/Windows/badge.svg)](https://github.com/cpm-cmake/CPM.cmake/actions) [![Actions Status](https://github.com/TheLartians/CPM.cmake/workflows/Windows/badge.svg)](https://github.com/TheLartians/CPM.cmake/actions)
[![Actions Status](https://github.com/cpm-cmake/CPM.cmake/workflows/Ubuntu/badge.svg)](https://github.com/cpm-cmake/CPM.cmake/actions) [![Actions Status](https://github.com/TheLartians/CPM.cmake/workflows/Ubuntu/badge.svg)](https://github.com/TheLartians/CPM.cmake/actions)
<br />
<p align="center"> <p align="center">
<img src="./logo/CPM.png" height="100" /> <img src="./logo/CPM.png" height="100" />
</p> </p>
<br />
# Setup-free CMake dependency management # Setup-free CMake dependency management
@@ -20,11 +18,6 @@ Any downloadable project or resource can be added as a version-controlled depend
Projects using modern CMake are automatically configured and their targets can be used immediately. 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).
## Further reading
- [CPM: An Awesome Dependency Manager for C++ with CMake](https://medium.com/swlh/cpm-an-awesome-dependency-manager-for-c-with-cmake-3c53f4376766)
- [CMake and the Future of C++ Package Management](https://ibob.github.io/blog/2020/01/13/cmake-package-management/)
## Usage ## Usage
After `CPM.cmake` has been [added](#adding-cpm) to your project, the function `CPMAddPackage` or `CPMFindPackage` can be used to fetch and configure a dependency. After `CPM.cmake` has been [added](#adding-cpm) to your project, the function `CPMAddPackage` or `CPMFindPackage` can be used to fetch and configure a dependency.
@@ -43,7 +36,7 @@ CPMAddPackage(
The origin may be specified by a `GIT_REPOSITORY`, but other sources, such as direct URLs, are [also supported](https://cmake.org/cmake/help/v3.11/module/ExternalProject.html#external-project-definition). 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. 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. 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. `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). 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).
@@ -71,6 +64,7 @@ add_executable(tests tests.cpp)
include(cmake/CPM.cmake) include(cmake/CPM.cmake)
CPMAddPackage( CPMAddPackage(
NAME Catch2
GITHUB_REPOSITORY catchorg/Catch2 GITHUB_REPOSITORY catchorg/Catch2
VERSION 2.5.0 VERSION 2.5.0
) )
@@ -79,19 +73,18 @@ CPMAddPackage(
target_link_libraries(tests Catch2) target_link_libraries(tests Catch2)
``` ```
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. 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.
## Adding CPM ## Adding CPM
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. To add CPM to your current project, simply add `cmake/CPM.cmake` to your project's `cmake` directory. The command below will perform this automatically.
The command below will perform this automatically.
```bash ```bash
mkdir -p cmake mkdir -p cmake
wget -O cmake/CPM.cmake https://github.com/cpm-cmake/CPM.cmake/releases/latest/download/get_cpm.cmake wget -O cmake/CPM.cmake https://github.com/TheLartians/CPM.cmake/releases/latest/download/CPM.cmake
``` ```
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. You can also use CMake to download CPM for you. See the [wiki](https://github.com/TheLartians/CPM.cmake/wiki/Downloading-CPM.cmake-in-CMake) for more details.
## Updating CPM ## Updating CPM
@@ -111,7 +104,7 @@ 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/cpm-cmake/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/TheLartians/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).
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).
@@ -126,7 +119,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/cpm-cmake/CPM.cmake/issues/132#issuecomment-644955140), if required. The behaviour can be [achieved manually](https://github.com/TheLartians/CPM.cmake/issues/132#issuecomment-644955140), if required.
## Comparison to pure FetchContent / ExternalProject ## Comparison to pure FetchContent / ExternalProject
@@ -142,7 +135,7 @@ The most notable features are:
- [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
@@ -159,8 +152,6 @@ 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/cpm-cmake/CPM.cmake/wiki/Caching-with-CPM.cmake-and-ccache-on-GitHub-Actions) for more info.
### 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`.
@@ -177,7 +168,7 @@ These options can also be set as environmental variables.
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
@@ -200,17 +191,18 @@ cmake -Bbuild
cmake --build build --target cpm-update-package-lock cmake --build build --target cpm-update-package-lock
``` ```
See the [wiki](https://github.com/cpm-cmake/CPM.cmake/wiki/Package-lock) for more info. See the [wiki](https://github.com/TheLartians/CPM.cmake/wiki/Package-lock) for more info.
## 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>
<tr> <tr>
<td> <td>
<a href="https://bitfieldaudio.com"> <a href="https://otto-project.github.io">
<p align="center"> <p align="center">
<img src="https://avatars2.githubusercontent.com/u/40357059?s=200&v=4" alt="otto-project" height=100pt width=100pt /> <img src="https://avatars2.githubusercontent.com/u/40357059?s=200&v=4" alt="otto-project" height=100pt width=100pt />
</p> </p>
@@ -239,7 +231,7 @@ If you know others, feel free to add them here through a PR.
## 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/cpm-cmake/CPM.cmake/wiki/More-Snippets) for more snippets. See the [wiki](https://github.com/TheLartians/CPM.cmake/wiki/More-Snippets) for more snippets.
### [Catch2](https://github.com/catchorg/Catch2) ### [Catch2](https://github.com/catchorg/Catch2)
@@ -283,7 +275,7 @@ CPMAddPackage(
# 0.6.2 uses deprecated CMake syntax # 0.6.2 uses deprecated CMake syntax
VERSION 0.6.3 VERSION 0.6.3
# 0.6.3 is not released yet, so use a recent commit # 0.6.3 is not released yet, so use a recent commit
GIT_TAG 012269756149ae99745b6dafefd415843d7420bb GIT_TAG 012269756149ae99745b6dafefd415843d7420bb
OPTIONS OPTIONS
"YAML_CPP_BUILD_TESTS Off" "YAML_CPP_BUILD_TESTS Off"
"YAML_CPP_BUILD_CONTRIB Off" "YAML_CPP_BUILD_CONTRIB Off"
@@ -313,7 +305,7 @@ endif()
```cmake ```cmake
CPMAddPackage( CPMAddPackage(
NAME nlohmann_json NAME nlohmann_json
VERSION 3.6.1 VERSION 3.6.1
# the git repo is incredibly large, so we download the archived include directory # 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 https://github.com/nlohmann/json/releases/download/v3.6.1/include.zip
URL_HASH SHA256=69cc88207ce91347ea530b227ff0776db82dcb8de6704e1a3d74f4841bc651cf URL_HASH SHA256=69cc88207ce91347ea530b227ff0776db82dcb8de6704e1a3d74f4841bc651cf
@@ -336,7 +328,7 @@ CPMAddPackage(
DOWNLOAD_ONLY True DOWNLOAD_ONLY True
) )
if(range-v3_ADDED) if(range-v3_ADDED)
add_library(range-v3 INTERFACE IMPORTED) add_library(range-v3 INTERFACE IMPORTED)
target_include_directories(range-v3 INTERFACE "${range-v3_SOURCE_DIR}/include") target_include_directories(range-v3 INTERFACE "${range-v3_SOURCE_DIR}/include")
endif() endif()
@@ -356,7 +348,6 @@ if (lua_ADDED)
# lua has no CMake support, so we create our own target # lua has no CMake support, so we create our own target
FILE(GLOB lua_sources ${lua_SOURCE_DIR}/*.c) FILE(GLOB lua_sources ${lua_SOURCE_DIR}/*.c)
list(REMOVE_ITEM lua_sources "${lua_SOURCE_DIR}/lua.c" "${lua_SOURCE_DIR}/luac.c")
add_library(lua STATIC ${lua_sources}) add_library(lua STATIC ${lua_sources})
target_include_directories(lua target_include_directories(lua
@@ -370,4 +361,4 @@ 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/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. 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.

View File

@@ -1,11 +1,11 @@
# CPM.cmake - CMake's missing package manager # CPM.cmake - CMake's missing package manager
# =========================================== # ===========================================
# See https://github.com/cpm-cmake/CPM.cmake for usage and update instructions. # See https://github.com/TheLartians/CPM.cmake for usage and update instructions.
# #
# MIT License # MIT License
# ----------- # -----------
#[[ #[[
Copyright (c) 2021 Lars Melchior and additional contributors Copyright (c) 2019 Lars Melchior
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
@@ -28,75 +28,40 @@
cmake_minimum_required(VERSION 3.14 FATAL_ERROR) cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
set(CURRENT_CPM_VERSION 1.0.0-development-version) set(CURRENT_CPM_VERSION 0.27.2-development-version)
if(CPM_DIRECTORY) if(CPM_DIRECTORY)
if(NOT CPM_DIRECTORY STREQUAL CMAKE_CURRENT_LIST_DIR) if(NOT CPM_DIRECTORY STREQUAL CMAKE_CURRENT_LIST_DIR)
if(CPM_VERSION VERSION_LESS CURRENT_CPM_VERSION) if (CPM_VERSION VERSION_LESS CURRENT_CPM_VERSION)
message( message(AUTHOR_WARNING "${CPM_INDENT} \
AUTHOR_WARNING
"${CPM_INDENT} \
A dependency is using a more recent CPM version (${CURRENT_CPM_VERSION}) than the current project (${CPM_VERSION}). \ A dependency is using a more recent CPM version (${CURRENT_CPM_VERSION}) than the current project (${CPM_VERSION}). \
It is recommended to upgrade CPM to the most recent version. \ It is recommended to upgrade CPM to the most recent version. \
See https://github.com/cpm-cmake/CPM.cmake for more information." See https://github.com/TheLartians/CPM.cmake for more information."
) )
endif() endif()
if(${CMAKE_VERSION} VERSION_LESS "3.17.0")
include(FetchContent)
endif()
return() return()
endif() endif()
get_property( get_property(CPM_INITIALIZED GLOBAL "" PROPERTY CPM_INITIALIZED SET)
CPM_INITIALIZED GLOBAL "" if (CPM_INITIALIZED)
PROPERTY CPM_INITIALIZED
SET
)
if(CPM_INITIALIZED)
return() return()
endif() endif()
endif() endif()
set_property(GLOBAL PROPERTY CPM_INITIALIZED true) set_property(GLOBAL PROPERTY CPM_INITIALIZED true)
option(CPM_USE_LOCAL_PACKAGES "Always try to use `find_package` to get dependencies" option(CPM_USE_LOCAL_PACKAGES "Always try to use `find_package` to get dependencies" $ENV{CPM_USE_LOCAL_PACKAGES})
$ENV{CPM_USE_LOCAL_PACKAGES} option(CPM_LOCAL_PACKAGES_ONLY "Only use `find_package` to get dependencies" $ENV{CPM_LOCAL_PACKAGES_ONLY})
)
option(CPM_LOCAL_PACKAGES_ONLY "Only use `find_package` to get dependencies"
$ENV{CPM_LOCAL_PACKAGES_ONLY}
)
option(CPM_DOWNLOAD_ALL "Always download dependencies from source" $ENV{CPM_DOWNLOAD_ALL}) option(CPM_DOWNLOAD_ALL "Always download dependencies from source" $ENV{CPM_DOWNLOAD_ALL})
option(CPM_DONT_UPDATE_MODULE_PATH "Don't update the module path to allow using find_package" option(CPM_DONT_UPDATE_MODULE_PATH "Don't update the module path to allow using find_package" $ENV{CPM_DONT_UPDATE_MODULE_PATH})
$ENV{CPM_DONT_UPDATE_MODULE_PATH} option(CPM_DONT_CREATE_PACKAGE_LOCK "Don't create a package lock file in the binary path" $ENV{CPM_DONT_CREATE_PACKAGE_LOCK})
) option(CPM_INCLUDE_ALL_IN_PACKAGE_LOCK "Add all packages added through CPM.cmake to the package lock" $ENV{CPM_INCLUDE_ALL_IN_PACKAGE_LOCK})
option(CPM_DONT_CREATE_PACKAGE_LOCK "Don't create a package lock file in the binary path"
$ENV{CPM_DONT_CREATE_PACKAGE_LOCK}
)
option(CPM_INCLUDE_ALL_IN_PACKAGE_LOCK
"Add all packages added through CPM.cmake to the package lock"
$ENV{CPM_INCLUDE_ALL_IN_PACKAGE_LOCK}
)
set(CPM_VERSION set(CPM_VERSION ${CURRENT_CPM_VERSION} CACHE INTERNAL "")
${CURRENT_CPM_VERSION} set(CPM_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} CACHE INTERNAL "")
CACHE INTERNAL "" set(CPM_FILE ${CMAKE_CURRENT_LIST_FILE} CACHE INTERNAL "")
) set(CPM_PACKAGES "" CACHE INTERNAL "")
set(CPM_DIRECTORY set(CPM_DRY_RUN OFF CACHE INTERNAL "Don't download or configure dependencies (for testing)")
${CMAKE_CURRENT_LIST_DIR}
CACHE INTERNAL ""
)
set(CPM_FILE
${CMAKE_CURRENT_LIST_FILE}
CACHE INTERNAL ""
)
set(CPM_PACKAGES
""
CACHE INTERNAL ""
)
set(CPM_DRY_RUN
OFF
CACHE INTERNAL "Don't download or configure dependencies (for testing)"
)
if(DEFINED ENV{CPM_SOURCE_CACHE}) if(DEFINED ENV{CPM_SOURCE_CACHE})
set(CPM_SOURCE_CACHE_DEFAULT $ENV{CPM_SOURCE_CACHE}) set(CPM_SOURCE_CACHE_DEFAULT $ENV{CPM_SOURCE_CACHE})
@@ -104,55 +69,28 @@ else()
set(CPM_SOURCE_CACHE_DEFAULT OFF) set(CPM_SOURCE_CACHE_DEFAULT OFF)
endif() endif()
set(CPM_SOURCE_CACHE set(CPM_SOURCE_CACHE ${CPM_SOURCE_CACHE_DEFAULT} CACHE PATH "Directory to downlaod CPM dependencies")
${CPM_SOURCE_CACHE_DEFAULT}
CACHE PATH "Directory to download CPM dependencies"
)
if(NOT CPM_DONT_UPDATE_MODULE_PATH) if (NOT CPM_DONT_UPDATE_MODULE_PATH)
set(CPM_MODULE_PATH set(CPM_MODULE_PATH "${CMAKE_BINARY_DIR}/CPM_modules" CACHE INTERNAL "")
"${CMAKE_BINARY_DIR}/CPM_modules"
CACHE INTERNAL ""
)
# remove old modules # remove old modules
file(REMOVE_RECURSE ${CPM_MODULE_PATH}) FILE(REMOVE_RECURSE ${CPM_MODULE_PATH})
file(MAKE_DIRECTORY ${CPM_MODULE_PATH}) file(MAKE_DIRECTORY ${CPM_MODULE_PATH})
# locally added CPM modules should override global packages # locally added CPM modules should override global packages
set(CMAKE_MODULE_PATH "${CPM_MODULE_PATH};${CMAKE_MODULE_PATH}") set(CMAKE_MODULE_PATH "${CPM_MODULE_PATH};${CMAKE_MODULE_PATH}")
endif() endif()
if(NOT CPM_DONT_CREATE_PACKAGE_LOCK) if (NOT CPM_DONT_CREATE_PACKAGE_LOCK)
set(CPM_PACKAGE_LOCK_FILE set(CPM_PACKAGE_LOCK_FILE "${CMAKE_BINARY_DIR}/cpm-package-lock.cmake" CACHE INTERNAL "")
"${CMAKE_BINARY_DIR}/cpm-package-lock.cmake" file(WRITE ${CPM_PACKAGE_LOCK_FILE} "# CPM Package Lock\n# This file should be committed to version control\n\n")
CACHE INTERNAL ""
)
file(WRITE ${CPM_PACKAGE_LOCK_FILE}
"# CPM Package Lock\n# This file should be committed to version control\n\n"
)
endif() endif()
include(FetchContent) include(FetchContent)
include(CMakeParseArguments) include(CMakeParseArguments)
# Infer package name from git repository uri (path or url)
function(cpm_package_name_from_git_uri URI RESULT)
string(REGEX MATCH "([^/:]+)/?.git/?$" cpmGitUriMatch "${URI}")
if(DEFINED cpmGitUriMatch)
set(${RESULT}
${CMAKE_MATCH_1}
PARENT_SCOPE
)
else()
unset(${RESULT} PARENT_SCOPE)
endif()
endfunction()
# Initialize logging prefix # Initialize logging prefix
if(NOT CPM_INDENT) if(NOT CPM_INDENT)
set(CPM_INDENT set(CPM_INDENT "CPM:")
"CPM:"
CACHE INTERNAL ""
)
endif() endif()
function(cpm_find_package NAME VERSION) function(cpm_find_package NAME VERSION)
@@ -161,49 +99,45 @@ function(cpm_find_package NAME VERSION)
if(${CPM_ARGS_NAME}_FOUND) if(${CPM_ARGS_NAME}_FOUND)
message(STATUS "${CPM_INDENT} using local package ${CPM_ARGS_NAME}@${VERSION}") message(STATUS "${CPM_INDENT} using local package ${CPM_ARGS_NAME}@${VERSION}")
CPMRegisterPackage(${CPM_ARGS_NAME} "${VERSION}") CPMRegisterPackage(${CPM_ARGS_NAME} "${VERSION}")
set(CPM_PACKAGE_FOUND set(CPM_PACKAGE_FOUND YES PARENT_SCOPE)
YES
PARENT_SCOPE
)
else() else()
set(CPM_PACKAGE_FOUND set(CPM_PACKAGE_FOUND NO PARENT_SCOPE)
NO
PARENT_SCOPE
)
endif() endif()
endfunction() endfunction()
# Create a custom FindXXX.cmake module for a CPM package This prevents `find_package(NAME)` from # Create a custom FindXXX.cmake module for a CPM package
# finding the system library # This prevents `find_package(NAME)` from finding the system library
function(cpm_create_module_file Name) function(CPMCreateModuleFile Name)
if(NOT CPM_DONT_UPDATE_MODULE_PATH) if (NOT CPM_DONT_UPDATE_MODULE_PATH)
# erase any previous modules # erase any previous modules
file(WRITE ${CPM_MODULE_PATH}/Find${Name}.cmake FILE(WRITE ${CPM_MODULE_PATH}/Find${Name}.cmake "include(${CPM_FILE})\n${ARGN}\nset(${Name}_FOUND TRUE)")
"include(${CPM_FILE})\n${ARGN}\nset(${Name}_FOUND TRUE)"
)
endif() endif()
endfunction() endfunction()
# Find a package locally or fallback to CPMAddPackage # Find a package locally or fallback to CPMAddPackage
function(CPMFindPackage) function(CPMFindPackage)
set(oneValueArgs NAME VERSION GIT_TAG FIND_PACKAGE_ARGUMENTS) set(oneValueArgs
NAME
VERSION
FIND_PACKAGE_ARGUMENTS
)
cmake_parse_arguments(CPM_ARGS "" "${oneValueArgs}" "" ${ARGN}) cmake_parse_arguments(CPM_ARGS "" "${oneValueArgs}" "" ${ARGN})
if(NOT DEFINED CPM_ARGS_VERSION) if (NOT DEFINED CPM_ARGS_VERSION)
if(DEFINED CPM_ARGS_GIT_TAG) if (DEFINED CPM_ARGS_GIT_TAG)
cpm_get_version_from_git_tag("${CPM_ARGS_GIT_TAG}" CPM_ARGS_VERSION) cpm_get_version_from_git_tag("${CPM_ARGS_GIT_TAG}" CPM_ARGS_VERSION)
endif() endif()
endif() endif()
if(CPM_DOWNLOAD_ALL) if (CPM_DOWNLOAD_ALL)
CPMAddPackage(${ARGN}) CPMAddPackage(${ARGN})
cpm_export_variables(${CPM_ARGS_NAME}) cpm_export_variables(${CPM_ARGS_NAME})
return() return()
endif() endif()
cpm_check_if_package_already_added(${CPM_ARGS_NAME} "${CPM_ARGS_VERSION}" "${CPM_ARGS_OPTIONS}") CPMCheckIfPackageAlreadyAdded(${CPM_ARGS_NAME} "${CPM_ARGS_VERSION}" "${CPM_ARGS_OPTIONS}")
if(CPM_PACKAGE_ALREADY_ADDED) if (CPM_PACKAGE_ALREADY_ADDED)
cpm_export_variables(${CPM_ARGS_NAME}) cpm_export_variables(${CPM_ARGS_NAME})
return() return()
endif() endif()
@@ -218,38 +152,26 @@ function(CPMFindPackage)
endfunction() endfunction()
# checks if a package has been added before # checks if a package has been added before
function(cpm_check_if_package_already_added CPM_ARGS_NAME CPM_ARGS_VERSION CPM_ARGS_OPTIONS) function(CPMCheckIfPackageAlreadyAdded CPM_ARGS_NAME CPM_ARGS_VERSION CPM_ARGS_OPTIONS)
if("${CPM_ARGS_NAME}" IN_LIST CPM_PACKAGES) if ("${CPM_ARGS_NAME}" IN_LIST CPM_PACKAGES)
CPMGetPackageVersion(${CPM_ARGS_NAME} CPM_PACKAGE_VERSION) CPMGetPackageVersion(${CPM_ARGS_NAME} CPM_PACKAGE_VERSION)
if("${CPM_PACKAGE_VERSION}" VERSION_LESS "${CPM_ARGS_VERSION}") if("${CPM_PACKAGE_VERSION}" VERSION_LESS "${CPM_ARGS_VERSION}")
message( message(WARNING "${CPM_INDENT} requires a newer version of ${CPM_ARGS_NAME} (${CPM_ARGS_VERSION}) than currently included (${CPM_PACKAGE_VERSION}).")
WARNING
"${CPM_INDENT} requires a newer version of ${CPM_ARGS_NAME} (${CPM_ARGS_VERSION}) than currently included (${CPM_PACKAGE_VERSION})."
)
endif() endif()
if(CPM_ARGS_OPTIONS) if (CPM_ARGS_OPTIONS)
foreach(OPTION ${CPM_ARGS_OPTIONS}) foreach(OPTION ${CPM_ARGS_OPTIONS})
cpm_parse_option(${OPTION}) cpm_parse_option(${OPTION})
if(NOT "${${OPTION_KEY}}" STREQUAL "${OPTION_VALUE}") if(NOT "${${OPTION_KEY}}" STREQUAL "${OPTION_VALUE}")
message( message(WARNING "${CPM_INDENT} ignoring package option for ${CPM_ARGS_NAME}: ${OPTION_KEY} = ${OPTION_VALUE} (${${OPTION_KEY}})")
WARNING
"${CPM_INDENT} ignoring package option for ${CPM_ARGS_NAME}: ${OPTION_KEY} = ${OPTION_VALUE} (${${OPTION_KEY}})"
)
endif() endif()
endforeach() endforeach()
endif() endif()
cpm_get_fetch_properties(${CPM_ARGS_NAME}) cpm_get_fetch_properties(${CPM_ARGS_NAME})
set(${CPM_ARGS_NAME}_ADDED NO) SET(${CPM_ARGS_NAME}_ADDED NO)
set(CPM_PACKAGE_ALREADY_ADDED SET(CPM_PACKAGE_ALREADY_ADDED YES PARENT_SCOPE)
YES
PARENT_SCOPE
)
cpm_export_variables(${CPM_ARGS_NAME}) cpm_export_variables(${CPM_ARGS_NAME})
else() else()
set(CPM_PACKAGE_ALREADY_ADDED SET(CPM_PACKAGE_ALREADY_ADDED NO PARENT_SCOPE)
NO
PARENT_SCOPE
)
endif() endif()
endfunction() endfunction()
@@ -257,30 +179,31 @@ endfunction()
function(CPMAddPackage) function(CPMAddPackage)
set(oneValueArgs set(oneValueArgs
NAME NAME
FORCE FORCE
VERSION VERSION
GIT_TAG GIT_TAG
DOWNLOAD_ONLY DOWNLOAD_ONLY
GITHUB_REPOSITORY GITHUB_REPOSITORY
GITLAB_REPOSITORY GITLAB_REPOSITORY
GIT_REPOSITORY GIT_REPOSITORY
SOURCE_DIR SOURCE_DIR
DOWNLOAD_COMMAND DOWNLOAD_COMMAND
FIND_PACKAGE_ARGUMENTS FIND_PACKAGE_ARGUMENTS
NO_CACHE NO_CACHE
GIT_SHALLOW GIT_SHALLOW
EXCLUDE_FROM_ALL
) )
set(multiValueArgs OPTIONS) set(multiValueArgs
OPTIONS
)
cmake_parse_arguments(CPM_ARGS "" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}") cmake_parse_arguments(CPM_ARGS "" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}")
# Set default values for arguments # Set default values for arguments
if(NOT DEFINED CPM_ARGS_VERSION) if (NOT DEFINED CPM_ARGS_VERSION)
if(DEFINED CPM_ARGS_GIT_TAG) if (DEFINED CPM_ARGS_GIT_TAG)
cpm_get_version_from_git_tag("${CPM_ARGS_GIT_TAG}" CPM_ARGS_VERSION) cpm_get_version_from_git_tag("${CPM_ARGS_GIT_TAG}" CPM_ARGS_VERSION)
endif() endif()
endif() endif()
@@ -291,74 +214,57 @@ function(CPMAddPackage)
set(DOWNLOAD_ONLY NO) set(DOWNLOAD_ONLY NO)
endif() endif()
if(DEFINED CPM_ARGS_GITHUB_REPOSITORY) if (DEFINED CPM_ARGS_GITHUB_REPOSITORY)
set(CPM_ARGS_GIT_REPOSITORY "https://github.com/${CPM_ARGS_GITHUB_REPOSITORY}.git") set(CPM_ARGS_GIT_REPOSITORY "https://github.com/${CPM_ARGS_GITHUB_REPOSITORY}.git")
endif() endif()
if(DEFINED CPM_ARGS_GITLAB_REPOSITORY) if (DEFINED CPM_ARGS_GITLAB_REPOSITORY)
set(CPM_ARGS_GIT_REPOSITORY "https://gitlab.com/${CPM_ARGS_GITLAB_REPOSITORY}.git") set(CPM_ARGS_GIT_REPOSITORY "https://gitlab.com/${CPM_ARGS_GITLAB_REPOSITORY}.git")
endif() endif()
if(DEFINED CPM_ARGS_GIT_REPOSITORY) if (DEFINED CPM_ARGS_GIT_REPOSITORY)
list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS GIT_REPOSITORY ${CPM_ARGS_GIT_REPOSITORY}) list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS GIT_REPOSITORY ${CPM_ARGS_GIT_REPOSITORY})
if(NOT DEFINED CPM_ARGS_GIT_TAG) if (NOT DEFINED CPM_ARGS_GIT_TAG)
set(CPM_ARGS_GIT_TAG v${CPM_ARGS_VERSION}) set(CPM_ARGS_GIT_TAG v${CPM_ARGS_VERSION})
endif() endif()
# If a name wasn't provided, try to infer it from the git repo
if(NOT DEFINED CPM_ARGS_NAME)
cpm_package_name_from_git_uri(${CPM_ARGS_GIT_REPOSITORY} CPM_ARGS_NAME)
endif()
endif() endif()
set(CPM_SKIP_FETCH FALSE) if (DEFINED CPM_ARGS_GIT_TAG)
if(DEFINED CPM_ARGS_GIT_TAG)
list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS GIT_TAG ${CPM_ARGS_GIT_TAG}) list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS GIT_TAG ${CPM_ARGS_GIT_TAG})
# If GIT_SHALLOW is explicitly specified, honor the value. # If GIT_SHALLOW is explicitly specified, honor the value.
if(DEFINED CPM_ARGS_GIT_SHALLOW) if (DEFINED CPM_ARGS_GIT_SHALLOW)
list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS GIT_SHALLOW ${CPM_ARGS_GIT_SHALLOW}) list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS GIT_SHALLOW ${CPM_ARGS_GIT_SHALLOW})
endif() endif()
endif() endif()
# Check for required arguments
if(NOT DEFINED CPM_ARGS_NAME)
message(
FATAL_ERROR
"CPM: 'NAME' was not provided and couldn't be automatically inferred for package added with arguments: '${ARGN}'"
)
endif()
# Check if package has been added before # Check if package has been added before
cpm_check_if_package_already_added(${CPM_ARGS_NAME} "${CPM_ARGS_VERSION}" "${CPM_ARGS_OPTIONS}") CPMCheckIfPackageAlreadyAdded(${CPM_ARGS_NAME} "${CPM_ARGS_VERSION}" "${CPM_ARGS_OPTIONS}")
if(CPM_PACKAGE_ALREADY_ADDED) if (CPM_PACKAGE_ALREADY_ADDED)
cpm_export_variables(${CPM_ARGS_NAME}) cpm_export_variables(${CPM_ARGS_NAME})
return() return()
endif() endif()
# Check for manual overrides # Check for manual overrides
if(NOT CPM_ARGS_FORCE AND NOT "${CPM_${CPM_ARGS_NAME}_SOURCE}" STREQUAL "") if (NOT CPM_ARGS_FORCE AND NOT "${CPM_${CPM_ARGS_NAME}_SOURCE}" STREQUAL "")
set(PACKAGE_SOURCE ${CPM_${CPM_ARGS_NAME}_SOURCE}) set(PACKAGE_SOURCE ${CPM_${CPM_ARGS_NAME}_SOURCE})
set(CPM_${CPM_ARGS_NAME}_SOURCE "") set(CPM_${CPM_ARGS_NAME}_SOURCE "")
CPMAddPackage( CPMAddPackage(
NAME ${CPM_ARGS_NAME} NAME ${CPM_ARGS_NAME}
SOURCE_DIR ${PACKAGE_SOURCE} SOURCE_DIR ${PACKAGE_SOURCE}
FORCE True FORCE True
OPTIONS ${CPM_ARGS_OPTIONS}
) )
cpm_export_variables(${CPM_ARGS_NAME}) cpm_export_variables(${CPM_ARGS_NAME})
return() return()
endif() endif()
# Check for available declaration # Check for available declaration
if(NOT CPM_ARGS_FORCE AND NOT "${CPM_DECLARATION_${CPM_ARGS_NAME}}" STREQUAL "") if (NOT CPM_ARGS_FORCE AND NOT "${CPM_DECLARATION_${CPM_ARGS_NAME}}" STREQUAL "")
set(declaration ${CPM_DECLARATION_${CPM_ARGS_NAME}}) set(declaration ${CPM_DECLARATION_${CPM_ARGS_NAME}})
set(CPM_DECLARATION_${CPM_ARGS_NAME} "") set(CPM_DECLARATION_${CPM_ARGS_NAME} "")
CPMAddPackage(${declaration}) CPMAddPackage(${declaration})
cpm_export_variables(${CPM_ARGS_NAME}) cpm_export_variables(${CPM_ARGS_NAME})
# checking again to ensure version and option compatibility # checking again to ensure version and option compatibility
cpm_check_if_package_already_added(${CPM_ARGS_NAME} "${CPM_ARGS_VERSION}" "${CPM_ARGS_OPTIONS}") CPMCheckIfPackageAlreadyAdded(${CPM_ARGS_NAME} "${CPM_ARGS_VERSION}" "${CPM_ARGS_OPTIONS}")
return() return()
endif() endif()
@@ -371,76 +277,62 @@ function(CPMAddPackage)
endif() endif()
if(CPM_LOCAL_PACKAGES_ONLY) if(CPM_LOCAL_PACKAGES_ONLY)
message( message(SEND_ERROR "CPM: ${CPM_ARGS_NAME} not found via find_package(${CPM_ARGS_NAME} ${CPM_ARGS_VERSION})")
SEND_ERROR
"CPM: ${CPM_ARGS_NAME} not found via find_package(${CPM_ARGS_NAME} ${CPM_ARGS_VERSION})"
)
endif() endif()
endif() endif()
CPMRegisterPackage("${CPM_ARGS_NAME}" "${CPM_ARGS_VERSION}") CPMRegisterPackage("${CPM_ARGS_NAME}" "${CPM_ARGS_VERSION}")
if(CPM_ARGS_OPTIONS) if (CPM_ARGS_OPTIONS)
foreach(OPTION ${CPM_ARGS_OPTIONS}) foreach(OPTION ${CPM_ARGS_OPTIONS})
cpm_parse_option(${OPTION}) cpm_parse_option(${OPTION})
set(${OPTION_KEY} set(${OPTION_KEY} ${OPTION_VALUE} CACHE INTERNAL "")
${OPTION_VALUE}
CACHE INTERNAL ""
)
endforeach() endforeach()
endif() endif()
if(DEFINED CPM_ARGS_GIT_TAG) if (DEFINED CPM_ARGS_GIT_TAG)
set(PACKAGE_INFO "${CPM_ARGS_GIT_TAG}") set(PACKAGE_INFO "${CPM_ARGS_GIT_TAG}")
elseif(DEFINED CPM_ARGS_SOURCE_DIR) elseif (DEFINED CPM_ARGS_SOURCE_DIR)
set(PACKAGE_INFO "${CPM_ARGS_SOURCE_DIR}") set(PACKAGE_INFO "${CPM_ARGS_SOURCE_DIR}")
else() else()
set(PACKAGE_INFO "${CPM_ARGS_VERSION}") set(PACKAGE_INFO "${CPM_ARGS_VERSION}")
endif() endif()
if(DEFINED CPM_ARGS_DOWNLOAD_COMMAND) if (DEFINED CPM_ARGS_DOWNLOAD_COMMAND)
list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS DOWNLOAD_COMMAND ${CPM_ARGS_DOWNLOAD_COMMAND}) list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS DOWNLOAD_COMMAND ${CPM_ARGS_DOWNLOAD_COMMAND})
elseif(DEFINED CPM_ARGS_SOURCE_DIR) elseif (DEFINED CPM_ARGS_SOURCE_DIR)
list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS SOURCE_DIR ${CPM_ARGS_SOURCE_DIR}) list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS SOURCE_DIR ${CPM_ARGS_SOURCE_DIR})
elseif(CPM_SOURCE_CACHE AND NOT CPM_ARGS_NO_CACHE) elseif (CPM_SOURCE_CACHE AND NOT CPM_ARGS_NO_CACHE)
string(TOLOWER ${CPM_ARGS_NAME} lower_case_name) string(TOLOWER ${CPM_ARGS_NAME} lower_case_name)
set(origin_parameters ${CPM_ARGS_UNPARSED_ARGUMENTS}) set(origin_parameters ${CPM_ARGS_UNPARSED_ARGUMENTS})
list(SORT origin_parameters) list(SORT origin_parameters)
string(SHA1 origin_hash "${origin_parameters}") string(SHA1 origin_hash "${origin_parameters}")
set(download_directory ${CPM_SOURCE_CACHE}/${lower_case_name}/${origin_hash}) set(download_directory ${CPM_SOURCE_CACHE}/${lower_case_name}/${origin_hash})
list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS SOURCE_DIR ${download_directory}) list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS SOURCE_DIR ${download_directory})
if(EXISTS ${download_directory}) if (EXISTS ${download_directory})
# avoid FetchContent modules to improve performance # disable the download command to allow offline builds
set(${CPM_ARGS_NAME}_BINARY_DIR ${CMAKE_BINARY_DIR}/_deps/${lower_case_name}-build) list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS DOWNLOAD_COMMAND "${CMAKE_COMMAND}")
set(${CPM_ARGS_NAME}_ADDED YES) set(PACKAGE_INFO "${download_directory}")
set(${CPM_ARGS_NAME}_SOURCE_DIR ${download_directory})
if(NOT CPM_ARGS_DOWNLOAD_ONLY AND EXISTS ${download_directory}/CMakeLists.txt)
cpm_add_subdirectory(
${download_directory} ${${CPM_ARGS_NAME}_BINARY_DIR} "${CPM_ARGS_EXCLUDE_FROM_ALL}"
)
endif()
set(CPM_SKIP_FETCH TRUE)
set(PACKAGE_INFO "${PACKAGE_INFO} at ${download_directory}")
else() else()
# Enable shallow clone when GIT_TAG is not a commit hash. Our guess may not be accurate, but # Enable shallow clone when GIT_TAG is not a commit hash.
# it should guarantee no commit hash get mis-detected. # Our guess may not be accurate, but it should guarantee no commit hash get mis-detected.
if(NOT DEFINED CPM_ARGS_GIT_SHALLOW) if (NOT DEFINED CPM_ARGS_GIT_SHALLOW)
cpm_is_git_tag_commit_hash("${CPM_ARGS_GIT_TAG}" IS_HASH) cpm_is_git_tag_commit_hash("${CPM_ARGS_GIT_TAG}" IS_HASH)
if(NOT ${IS_HASH}) if (NOT ${IS_HASH})
list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS GIT_SHALLOW TRUE) list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS GIT_SHALLOW TRUE)
endif() endif()
endif() endif()
# remove timestamps so CMake will re-download the dependency # remove timestamps so CMake will re-download the dependency
file(REMOVE_RECURSE ${CMAKE_BINARY_DIR}/_deps/${lower_case_name}-subbuild) file(REMOVE_RECURSE ${CMAKE_BINARY_DIR}/_deps/${lower_case_name}-subbuild)
set(PACKAGE_INFO "${PACKAGE_INFO} to ${download_directory}") set(PACKAGE_INFO "${PACKAGE_INFO} -> ${download_directory}")
endif() endif()
endif() endif()
cpm_create_module_file(${CPM_ARGS_NAME} "CPMAddPackage(${ARGN})") CPMCreateModuleFile(${CPM_ARGS_NAME} "CPMAddPackage(${ARGN})")
if(CPM_PACKAGE_LOCK_ENABLED) if (CPM_PACKAGE_LOCK_ENABLED)
if((CPM_ARGS_VERSION AND NOT CPM_ARGS_SOURCE_DIR) OR CPM_INCLUDE_ALL_IN_PACKAGE_LOCK) if ((CPM_ARGS_VERSION AND NOT CPM_ARGS_SOURCE_DIR) OR CPM_INCLUDE_ALL_IN_PACKAGE_LOCK)
cpm_add_to_package_lock(${CPM_ARGS_NAME} "${ARGN}") cpm_add_to_package_lock(${CPM_ARGS_NAME} "${ARGN}")
elseif(CPM_ARGS_SOURCE_DIR) elseif(CPM_ARGS_SOURCE_DIR)
cpm_add_comment_to_package_lock(${CPM_ARGS_NAME} "local directory") cpm_add_comment_to_package_lock(${CPM_ARGS_NAME} "local directory")
@@ -449,84 +341,64 @@ function(CPMAddPackage)
endif() endif()
endif() endif()
message( cpm_declare_fetch("${CPM_ARGS_NAME}" "${CPM_ARGS_VERSION}" "${PACKAGE_INFO}" "${CPM_ARGS_UNPARSED_ARGUMENTS}")
STATUS "${CPM_INDENT} adding package ${CPM_ARGS_NAME}@${CPM_ARGS_VERSION} (${PACKAGE_INFO})" cpm_fetch_package("${CPM_ARGS_NAME}" "${DOWNLOAD_ONLY}")
) cpm_get_fetch_properties("${CPM_ARGS_NAME}")
if(NOT CPM_SKIP_FETCH) SET(${CPM_ARGS_NAME}_ADDED YES)
cpm_declare_fetch(
"${CPM_ARGS_NAME}" "${CPM_ARGS_VERSION}" "${PACKAGE_INFO}" "${CPM_ARGS_UNPARSED_ARGUMENTS}"
)
cpm_fetch_package("${CPM_ARGS_NAME}" "${DOWNLOAD_ONLY}" "${CPM_ARGS_EXCLUDE_FROM_ALL}")
cpm_get_fetch_properties("${CPM_ARGS_NAME}")
endif()
set(${CPM_ARGS_NAME}_ADDED YES)
cpm_export_variables("${CPM_ARGS_NAME}") cpm_export_variables("${CPM_ARGS_NAME}")
endfunction() endfunction()
# Fetch a previously declared package # Fetch a previously declared package
macro(CPMGetPackage Name) macro(CPMGetPackage Name)
if(DEFINED "CPM_DECLARATION_${Name}") if (DEFINED "CPM_DECLARATION_${Name}")
CPMAddPackage(NAME ${Name}) CPMAddPackage(
NAME ${Name}
)
else() else()
message(SEND_ERROR "Cannot retrieve package ${Name}: no declaration available") message(SEND_ERROR "Cannot retrieve package ${Name}: no declaration available")
endif() endif()
endmacro() endmacro()
# export variables available to the caller to the parent scope expects ${CPM_ARGS_NAME} to be set # export variables available to the caller to the parent scope
# expects ${CPM_ARGS_NAME} to be set
macro(cpm_export_variables name) macro(cpm_export_variables name)
set(${name}_SOURCE_DIR SET(${name}_SOURCE_DIR "${${name}_SOURCE_DIR}" PARENT_SCOPE)
"${${name}_SOURCE_DIR}" SET(${name}_BINARY_DIR "${${name}_BINARY_DIR}" PARENT_SCOPE)
PARENT_SCOPE SET(${name}_ADDED "${${name}_ADDED}" PARENT_SCOPE)
)
set(${name}_BINARY_DIR
"${${name}_BINARY_DIR}"
PARENT_SCOPE
)
set(${name}_ADDED
"${${name}_ADDED}"
PARENT_SCOPE
)
endmacro() endmacro()
# declares a package, so that any call to CPMAddPackage for the package name will use these # declares a package, so that any call to CPMAddPackage for the
# arguments instead. Previous declarations will not be overriden. # package name will use these arguments instead.
# Previous declarations will not be overriden.
macro(CPMDeclarePackage Name) macro(CPMDeclarePackage Name)
if(NOT DEFINED "CPM_DECLARATION_${Name}") if (NOT DEFINED "CPM_DECLARATION_${Name}")
set("CPM_DECLARATION_${Name}" "${ARGN}") set("CPM_DECLARATION_${Name}" "${ARGN}")
endif() endif()
endmacro() endmacro()
function(cpm_add_to_package_lock Name) function(cpm_add_to_package_lock Name)
if(NOT CPM_DONT_CREATE_PACKAGE_LOCK) if (NOT CPM_DONT_CREATE_PACKAGE_LOCK)
cpm_prettify_package_arguments(PRETTY_ARGN false ${ARGN}) file(APPEND ${CPM_PACKAGE_LOCK_FILE} "# ${Name}\nCPMDeclarePackage(${Name} \"${ARGN}\")\n")
file(APPEND ${CPM_PACKAGE_LOCK_FILE} "# ${Name}\nCPMDeclarePackage(${Name}\n${PRETTY_ARGN})\n")
endif() endif()
endfunction() endfunction()
function(cpm_add_comment_to_package_lock Name) function(cpm_add_comment_to_package_lock Name)
if(NOT CPM_DONT_CREATE_PACKAGE_LOCK) if (NOT CPM_DONT_CREATE_PACKAGE_LOCK)
cpm_prettify_package_arguments(PRETTY_ARGN true ${ARGN}) file(APPEND ${CPM_PACKAGE_LOCK_FILE} "# ${Name} (unversioned)\n# CPMDeclarePackage(${Name} \"${ARGN}\")\n")
file(APPEND ${CPM_PACKAGE_LOCK_FILE}
"# ${Name} (unversioned)\n# CPMDeclarePackage(${Name}\n${PRETTY_ARGN}#)\n"
)
endif() endif()
endfunction() endfunction()
# includes the package lock file if it exists and creates a target `cpm-write-package-lock` to # includes the package lock file if it exists and creates a target
# update it # `cpm-write-package-lock` to update it
macro(CPMUsePackageLock file) macro(CPMUsePackageLock file)
if(NOT CPM_DONT_CREATE_PACKAGE_LOCK) if (NOT CPM_DONT_CREATE_PACKAGE_LOCK)
get_filename_component(CPM_ABSOLUTE_PACKAGE_LOCK_PATH ${file} ABSOLUTE) get_filename_component(CPM_ABSOLUTE_PACKAGE_LOCK_PATH ${file} ABSOLUTE)
if(EXISTS ${CPM_ABSOLUTE_PACKAGE_LOCK_PATH}) if(EXISTS ${CPM_ABSOLUTE_PACKAGE_LOCK_PATH})
include(${CPM_ABSOLUTE_PACKAGE_LOCK_PATH}) include(${CPM_ABSOLUTE_PACKAGE_LOCK_PATH})
endif() endif()
if(NOT TARGET cpm-update-package-lock) if (NOT TARGET cpm-update-package-lock)
add_custom_target( add_custom_target(cpm-update-package-lock COMMAND ${CMAKE_COMMAND} -E copy ${CPM_PACKAGE_LOCK_FILE} ${CPM_ABSOLUTE_PACKAGE_LOCK_PATH})
cpm-update-package-lock COMMAND ${CMAKE_COMMAND} -E copy ${CPM_PACKAGE_LOCK_FILE}
${CPM_ABSOLUTE_PACKAGE_LOCK_PATH}
)
endif() endif()
set(CPM_PACKAGE_LOCK_ENABLED true) set(CPM_PACKAGE_LOCK_ENABLED true)
endif() endif()
@@ -535,80 +407,57 @@ endmacro()
# registers a package that has been added to CPM # registers a package that has been added to CPM
function(CPMRegisterPackage PACKAGE VERSION) function(CPMRegisterPackage PACKAGE VERSION)
list(APPEND CPM_PACKAGES ${PACKAGE}) list(APPEND CPM_PACKAGES ${PACKAGE})
set(CPM_PACKAGES set(CPM_PACKAGES ${CPM_PACKAGES} CACHE INTERNAL "")
${CPM_PACKAGES} set("CPM_PACKAGE_${PACKAGE}_VERSION" ${VERSION} CACHE INTERNAL "")
CACHE INTERNAL ""
)
set("CPM_PACKAGE_${PACKAGE}_VERSION"
${VERSION}
CACHE INTERNAL ""
)
endfunction() endfunction()
# retrieve the current version of the package to ${OUTPUT} # retrieve the current version of the package to ${OUTPUT}
function(CPMGetPackageVersion PACKAGE OUTPUT) function(CPMGetPackageVersion PACKAGE OUTPUT)
set(${OUTPUT} set(${OUTPUT} "${CPM_PACKAGE_${PACKAGE}_VERSION}" PARENT_SCOPE)
"${CPM_PACKAGE_${PACKAGE}_VERSION}"
PARENT_SCOPE
)
endfunction() endfunction()
# declares a package in FetchContent_Declare # declares a package in FetchContent_Declare
function(cpm_declare_fetch PACKAGE VERSION INFO) function (cpm_declare_fetch PACKAGE VERSION INFO)
if(${CPM_DRY_RUN}) message(STATUS "${CPM_INDENT} adding package ${PACKAGE}@${VERSION} (${INFO})")
if (${CPM_DRY_RUN})
message(STATUS "${CPM_INDENT} package not declared (dry run)") message(STATUS "${CPM_INDENT} package not declared (dry run)")
return() return()
endif() endif()
FetchContent_Declare(${PACKAGE} ${ARGN}) FetchContent_Declare(${PACKAGE}
${ARGN}
)
endfunction() endfunction()
# returns properties for a package previously defined by cpm_declare_fetch # returns properties for a package previously defined by cpm_declare_fetch
function(cpm_get_fetch_properties PACKAGE) function (cpm_get_fetch_properties PACKAGE)
if(${CPM_DRY_RUN}) if (${CPM_DRY_RUN})
return() return()
endif() endif()
FetchContent_GetProperties(${PACKAGE}) FetchContent_GetProperties(${PACKAGE})
string(TOLOWER ${PACKAGE} lpackage) string(TOLOWER ${PACKAGE} lpackage)
set(${PACKAGE}_SOURCE_DIR SET(${PACKAGE}_SOURCE_DIR "${${lpackage}_SOURCE_DIR}" PARENT_SCOPE)
"${${lpackage}_SOURCE_DIR}" SET(${PACKAGE}_BINARY_DIR "${${lpackage}_BINARY_DIR}" PARENT_SCOPE)
PARENT_SCOPE
)
set(${PACKAGE}_BINARY_DIR
"${${lpackage}_BINARY_DIR}"
PARENT_SCOPE
)
endfunction()
function(cpm_add_subdirectory SOURCE_DIR BINARY_DIR EXCLUDE)
if(EXCLUDE)
set(addSubdirectoryExtraArgs EXCLUDE_FROM_ALL)
else()
set(addSubdirectoryExtraArgs "")
endif()
add_subdirectory(${SOURCE_DIR} ${BINARY_DIR} ${addSubdirectoryExtraArgs})
endfunction() endfunction()
# downloads a previously declared package via FetchContent # downloads a previously declared package via FetchContent
function(cpm_fetch_package PACKAGE DOWNLOAD_ONLY EXCLUDE) function (cpm_fetch_package PACKAGE DOWNLOAD_ONLY)
if(${CPM_DRY_RUN}) if (${CPM_DRY_RUN})
message(STATUS "${CPM_INDENT} package ${PACKAGE} not fetched (dry run)") message(STATUS "${CPM_INDENT} package ${PACKAGE} not fetched (dry run)")
return() return()
endif() endif()
FetchContent_GetProperties(${PACKAGE}) if(DOWNLOAD_ONLY)
string(TOLOWER "${PACKAGE}" lower_case_name) FetchContent_GetProperties(${PACKAGE})
if(NOT ${PACKAGE}_POPULATED)
if(NOT ${lower_case_name}_POPULATED) FetchContent_Populate(${PACKAGE})
FetchContent_Populate(${PACKAGE})
if(NOT DOWNLOAD_ONLY AND EXISTS ${${lower_case_name}_SOURCE_DIR}/CMakeLists.txt)
set(CPM_OLD_INDENT "${CPM_INDENT}")
set(CPM_INDENT "${CPM_INDENT} ${PACKAGE}:")
cpm_add_subdirectory(
${${lower_case_name}_SOURCE_DIR} ${${lower_case_name}_BINARY_DIR} "${EXCLUDE}"
)
set(CPM_INDENT "${CPM_OLD_INDENT}")
endif() endif()
else()
set(CPM_OLD_INDENT "${CPM_INDENT}")
set(CPM_INDENT "${CPM_INDENT} ${PACKAGE}:")
FetchContent_MakeAvailable(${PACKAGE})
set(CPM_INDENT "${CPM_OLD_INDENT}")
endif() endif()
endfunction() endfunction()
@@ -617,38 +466,26 @@ function(cpm_parse_option OPTION)
string(REGEX MATCH "^[^ ]+" OPTION_KEY ${OPTION}) string(REGEX MATCH "^[^ ]+" OPTION_KEY ${OPTION})
string(LENGTH ${OPTION} OPTION_LENGTH) string(LENGTH ${OPTION} OPTION_LENGTH)
string(LENGTH ${OPTION_KEY} OPTION_KEY_LENGTH) string(LENGTH ${OPTION_KEY} OPTION_KEY_LENGTH)
if(OPTION_KEY_LENGTH STREQUAL OPTION_LENGTH) if (OPTION_KEY_LENGTH STREQUAL OPTION_LENGTH)
# no value for key provided, assume user wants to set option to "ON" # no value for key provided, assume user wants to set option to "ON"
set(OPTION_VALUE "ON") set(OPTION_VALUE "ON")
else() else()
math(EXPR OPTION_KEY_LENGTH "${OPTION_KEY_LENGTH}+1") math(EXPR OPTION_KEY_LENGTH "${OPTION_KEY_LENGTH}+1")
string(SUBSTRING ${OPTION} "${OPTION_KEY_LENGTH}" "-1" OPTION_VALUE) string(SUBSTRING ${OPTION} "${OPTION_KEY_LENGTH}" "-1" OPTION_VALUE)
endif() endif()
set(OPTION_KEY set(OPTION_KEY "${OPTION_KEY}" PARENT_SCOPE)
"${OPTION_KEY}" set(OPTION_VALUE "${OPTION_VALUE}" PARENT_SCOPE)
PARENT_SCOPE
)
set(OPTION_VALUE
"${OPTION_VALUE}"
PARENT_SCOPE
)
endfunction() endfunction()
# guesses the package version from a git tag # guesses the package version from a git tag
function(cpm_get_version_from_git_tag GIT_TAG RESULT) function(cpm_get_version_from_git_tag GIT_TAG RESULT)
string(LENGTH ${GIT_TAG} length) string(LENGTH ${GIT_TAG} length)
if(length EQUAL 40) if (length EQUAL 40)
# GIT_TAG is probably a git hash # GIT_TAG is probably a git hash
set(${RESULT} SET(${RESULT} 0 PARENT_SCOPE)
0
PARENT_SCOPE
)
else() else()
string(REGEX MATCH "v?([0123456789.]*).*" _ ${GIT_TAG}) string(REGEX MATCH "v?([0123456789.]*).*" _ ${GIT_TAG})
set(${RESULT} SET(${RESULT} ${CMAKE_MATCH_1} PARENT_SCOPE)
${CMAKE_MATCH_1}
PARENT_SCOPE
)
endif() endif()
endfunction() endfunction()
@@ -656,87 +493,13 @@ endfunction()
function(cpm_is_git_tag_commit_hash GIT_TAG RESULT) function(cpm_is_git_tag_commit_hash GIT_TAG RESULT)
string(LENGTH "${GIT_TAG}" length) string(LENGTH "${GIT_TAG}" length)
# full hash has 40 characters, and short hash has at least 7 characters. # full hash has 40 characters, and short hash has at least 7 characters.
if(length LESS 7 OR length GREATER 40) if (length LESS 7 OR length GREATER 40)
set(${RESULT} SET(${RESULT} 0 PARENT_SCOPE)
0
PARENT_SCOPE
)
else() else()
if(${GIT_TAG} MATCHES "^[a-fA-F0-9]+$") if (${GIT_TAG} MATCHES "^[a-fA-F0-9]+$")
set(${RESULT} SET(${RESULT} 1 PARENT_SCOPE)
1
PARENT_SCOPE
)
else() else()
set(${RESULT} SET(${RESULT} 0 PARENT_SCOPE)
0
PARENT_SCOPE
)
endif() endif()
endif() endif()
endfunction() endfunction()
function(cpm_prettify_package_arguments OUT_VAR IS_IN_COMMENT)
set(oneValueArgs
NAME
FORCE
VERSION
GIT_TAG
DOWNLOAD_ONLY
GITHUB_REPOSITORY
GITLAB_REPOSITORY
GIT_REPOSITORY
SOURCE_DIR
DOWNLOAD_COMMAND
FIND_PACKAGE_ARGUMENTS
NO_CACHE
GIT_SHALLOW
)
set(multiValueArgs OPTIONS)
cmake_parse_arguments(CPM_ARGS "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
foreach(oneArgName ${oneValueArgs})
if(DEFINED CPM_ARGS_${oneArgName})
if(${IS_IN_COMMENT})
string(APPEND PRETTY_OUT_VAR "#")
endif()
if(${oneArgName} STREQUAL "SOURCE_DIR")
string(REPLACE ${CMAKE_SOURCE_DIR} "\${CMAKE_SOURCE_DIR}" CPM_ARGS_${oneArgName}
${CPM_ARGS_${oneArgName}}
)
endif()
string(APPEND PRETTY_OUT_VAR " ${oneArgName} ${CPM_ARGS_${oneArgName}}\n")
endif()
endforeach()
foreach(multiArgName ${multiValueArgs})
if(DEFINED CPM_ARGS_${multiArgName})
if(${IS_IN_COMMENT})
string(APPEND PRETTY_OUT_VAR "#")
endif()
string(APPEND PRETTY_OUT_VAR " ${multiArgName}\n")
foreach(singleOption ${CPM_ARGS_${multiArgName}})
if(${IS_IN_COMMENT})
string(APPEND PRETTY_OUT_VAR "#")
endif()
string(APPEND PRETTY_OUT_VAR " \"${singleOption}\"\n")
endforeach()
endif()
endforeach()
if(NOT "${CPM_ARGS_UNPARSED_ARGUMENTS}" STREQUAL "")
if(${IS_IN_COMMENT})
string(APPEND PRETTY_OUT_VAR "#")
endif()
string(APPEND PRETTY_OUT_VAR " ")
foreach(CPM_ARGS_UNPARSED_ARGUMENT ${CPM_ARGS_UNPARSED_ARGUMENTS})
string(APPEND PRETTY_OUT_VAR " ${CPM_ARGS_UNPARSED_ARGUMENT}")
endforeach()
string(APPEND PRETTY_OUT_VAR "\n")
endif()
set(${OUT_VAR}
${PRETTY_OUT_VAR}
PARENT_SCOPE
)
endfunction()

View File

@@ -1,8 +1,6 @@
set(CPM_DOWNLOAD_VERSION 1.0.0-development-version) set(CPM_DOWNLOAD_VERSION 0.27.2-development-version)
if(CPM_SOURCE_CACHE) if(CPM_SOURCE_CACHE)
# Expand relative path. This is important if the provided path contains a tilde (~)
get_filename_component(CPM_SOURCE_CACHE ${CPM_SOURCE_CACHE} ABSOLUTE)
set(CPM_DOWNLOAD_LOCATION "${CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake") set(CPM_DOWNLOAD_LOCATION "${CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
elseif(DEFINED ENV{CPM_SOURCE_CACHE}) elseif(DEFINED ENV{CPM_SOURCE_CACHE})
set(CPM_DOWNLOAD_LOCATION "$ENV{CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake") set(CPM_DOWNLOAD_LOCATION "$ENV{CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
@@ -13,7 +11,7 @@ endif()
if(NOT (EXISTS ${CPM_DOWNLOAD_LOCATION})) if(NOT (EXISTS ${CPM_DOWNLOAD_LOCATION}))
message(STATUS "Downloading CPM.cmake to ${CPM_DOWNLOAD_LOCATION}") message(STATUS "Downloading CPM.cmake to ${CPM_DOWNLOAD_LOCATION}")
file(DOWNLOAD file(DOWNLOAD
https://github.com/cpm-cmake/CPM.cmake/releases/download/v${CPM_DOWNLOAD_VERSION}/CPM.cmake https://github.com/TheLartians/CPM.cmake/releases/download/v${CPM_DOWNLOAD_VERSION}/CPM.cmake
${CPM_DOWNLOAD_LOCATION} ${CPM_DOWNLOAD_LOCATION}
) )
endif() endif()

View File

@@ -1,73 +1,34 @@
function(ASSERT_EQUAL) function(ASSERT_EQUAL)
if(NOT ARGC EQUAL 2) if (NOT ARGC EQUAL 2)
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}'")
endif() endif()
endfunction() endfunction()
function(ASSERT_DEFINED KEY)
if(DEFINED ${KEY})
message(STATUS "test passed: '${KEY}' is defined")
else()
message(FATAL_ERROR "assertion failed: '${KEY}' is not defiend")
endif()
endfunction()
function(ASSERT_NOT_DEFINED KEY)
if(DEFINED ${KEY})
message(FATAL_ERROR "assertion failed: '${KEY}' is defiend")
else()
message(STATUS "test passed: '${KEY}' is not defined")
endif()
endfunction()
function(ASSERT_TRUTHY KEY)
if(${${KEY}})
message(STATUS "test passed: '${KEY}' is set truthy")
else()
message(FATAL_ERROR "assertion failed: value of '${KEY}' is not true (${${KEY}})")
endif()
endfunction()
function(ASSERTION_FAILED) function(ASSERTION_FAILED)
message(FATAL_ERROR "assertion failed: ${ARGN}") message(FATAL_ERROR "assertion failed: ${ARGN}")
endfunction() endfunction()
function(ASSERT_EXISTS file) function(ASSERT_EXISTS file)
if(EXISTS ${file}) if (NOT EXISTS ${file})
message(STATUS "test passed: '${file}' exists")
else()
message(FATAL_ERROR "assertion failed: file ${file} does not exist") message(FATAL_ERROR "assertion failed: file ${file} does not exist")
endif() endif()
endfunction() endfunction()
function(ASSERT_NOT_EXISTS file) function(ASSERT_NOT_EXISTS file)
if(NOT EXISTS ${file}) if (EXISTS ${file})
message(STATUS "test passed: '${file}' does not exist")
else()
message(FATAL_ERROR "assertion failed: file ${file} exists") message(FATAL_ERROR "assertion failed: file ${file} exists")
endif() endif()
endfunction() endfunction()

View File

@@ -10,38 +10,46 @@ find_package(Threads REQUIRED)
CPMAddPackage( CPMAddPackage(
NAME asio NAME asio
VERSION 1.18.1 VERSION 1.16.1
GITHUB_REPOSITORY chriskohlhoff/asio GITHUB_REPOSITORY chriskohlhoff/asio
GIT_TAG asio-1-18-1 # asio uses non-standard version tag, we must specify GIT_TAG 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:
# 1) If _WIN32_WINNT is not set, ASIO assumes _WIN32_WINNT=0x0501, i.e. Windows XP target, which is # 1) If _WIN32_WINNT is not set, ASIO assumes _WIN32_WINNT=0x0501, i.e. Windows XP target,
# definitely not the platform which most users target. # which is definitely not the platform which most users target.
#
# 2) WIN32_LEAN_AND_MEAN is defined to make Winsock2 work. # 2) WIN32_LEAN_AND_MEAN is defined to make Winsock2 work.
if(asio_ADDED) if(asio_ADDED)
add_library(asio INTERFACE) add_library(asio INTERFACE)
target_include_directories(asio SYSTEM INTERFACE ${asio_SOURCE_DIR}/asio/include) target_include_directories(asio
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
)
target_link_libraries(asio INTERFACE Threads::Threads) target_link_libraries(asio
INTERFACE
Threads::Threads
)
if(WIN32) if(WIN32)
# macro see @ https://stackoverflow.com/a/40217291/1746503 # macro see @ https://stackoverflow.com/a/40217291/1746503
macro(get_win32_winnt version) macro(get_win32_winnt version)
if(CMAKE_SYSTEM_VERSION) if (CMAKE_SYSTEM_VERSION)
set(ver ${CMAKE_SYSTEM_VERSION}) set(ver ${CMAKE_SYSTEM_VERSION})
string(REGEX MATCH "^([0-9]+).([0-9])" ver ${ver}) string(REGEX MATCH "^([0-9]+).([0-9])" ver ${ver})
string(REGEX MATCH "^([0-9]+)" verMajor ${ver}) string(REGEX MATCH "^([0-9]+)" verMajor ${ver})
# Check for Windows 10, b/c we'll need to convert to hex 'A'. # Check for Windows 10, b/c we'll need to convert to hex 'A'.
if("${verMajor}" MATCHES "10") if ("${verMajor}" MATCHES "10")
set(verMajor "A") set(verMajor "A")
string(REGEX REPLACE "^([0-9]+)" ${verMajor} ver ${ver}) string(REGEX REPLACE "^([0-9]+)" ${verMajor} ver ${ver})
endif("${verMajor}" MATCHES "10") endif ("${verMajor}" MATCHES "10")
# Remove all remaining '.' characters. # Remove all remaining '.' characters.
string(REPLACE "." "" ver ${ver}) string(REPLACE "." "" ver ${ver})
# Prepend each digit with a zero. # Prepend each digit with a zero.
@@ -57,7 +65,11 @@ if(asio_ADDED)
message(STATUS "Set _WIN32_WINNET=${_WIN32_WINNT}") message(STATUS "Set _WIN32_WINNET=${_WIN32_WINNT}")
target_compile_definitions(asio INTERFACE _WIN32_WINNT=${_WIN32_WINNT} WIN32_LEAN_AND_MEAN) target_compile_definitions(asio
INTERFACE
_WIN32_WINNT=${_WIN32_WINNT}
WIN32_LEAN_AND_MEAN
)
endif() endif()
endif() endif()
@@ -65,4 +77,3 @@ 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)

View File

@@ -20,31 +20,45 @@
using asio::ip::tcp; using asio::ip::tcp;
class session : public std::enable_shared_from_this<session> { class session
: public std::enable_shared_from_this<session>
{
public: public:
session(tcp::socket socket) : socket_(std::move(socket)) {} session(tcp::socket socket)
: socket_(std::move(socket))
void start() { do_read(); } {
private:
void do_read() {
auto self(shared_from_this());
socket_.async_read_some(asio::buffer(data_, max_length),
[this, self](std::error_code ec, std::size_t length) {
if (!ec) {
do_write(length);
}
});
} }
void do_write(std::size_t length) { void start()
{
do_read();
}
private:
void do_read()
{
auto self(shared_from_this());
socket_.async_read_some(asio::buffer(data_, max_length),
[this, self](std::error_code ec, std::size_t length)
{
if (!ec)
{
do_write(length);
}
});
}
void do_write(std::size_t length)
{
auto self(shared_from_this()); auto self(shared_from_this());
asio::async_write(socket_, asio::buffer(data_, length), asio::async_write(socket_, asio::buffer(data_, length),
[this, self](std::error_code ec, std::size_t /*length*/) { [this, self](std::error_code ec, std::size_t /*length*/)
if (!ec) { {
do_read(); if (!ec)
} {
}); do_read();
}
});
} }
tcp::socket socket_; tcp::socket socket_;
@@ -52,30 +66,39 @@ private:
char data_[max_length]; char data_[max_length];
}; };
class server { class server
{
public: public:
server(asio::io_context& io_context, short port) server(asio::io_context& io_context, short port)
: acceptor_(io_context, tcp::endpoint(tcp::v4(), port)) { : acceptor_(io_context, tcp::endpoint(tcp::v4(), port))
{
do_accept(); do_accept();
} }
private: private:
void do_accept() { void do_accept()
acceptor_.async_accept([this](std::error_code ec, tcp::socket socket) { {
if (!ec) { acceptor_.async_accept(
std::make_shared<session>(std::move(socket))->start(); [this](std::error_code ec, tcp::socket socket)
} {
if (!ec)
{
std::make_shared<session>(std::move(socket))->start();
}
do_accept(); do_accept();
}); });
} }
tcp::acceptor acceptor_; tcp::acceptor acceptor_;
}; };
int main(int argc, char* argv[]) { int main(int argc, char* argv[])
try { {
if (argc != 2) { try
{
if (argc != 2)
{
std::cerr << "Usage: async_tcp_echo_server <port>\n"; std::cerr << "Usage: async_tcp_echo_server <port>\n";
return 1; return 1;
} }
@@ -85,7 +108,9 @@ int main(int argc, char* argv[]) {
server s(io_context, std::atoi(argv[1])); server s(io_context, std::atoi(argv[1]));
io_context.run(); io_context.run();
} catch (std::exception& e) { }
catch (std::exception& e)
{
std::cerr << "Exception: " << e.what() << "\n"; std::cerr << "Exception: " << e.what() << "\n";
} }

View File

@@ -15,17 +15,18 @@ CPMAddPackage(
CPMAddPackage( CPMAddPackage(
NAME benchmark NAME benchmark
GITHUB_REPOSITORY google/benchmark GITHUB_REPOSITORY google/benchmark
VERSION 1.5.2 VERSION 1.5.0
OPTIONS "BENCHMARK_ENABLE_TESTING Off" OPTIONS
"BENCHMARK_ENABLE_TESTING Off"
) )
if(benchmark_ADDED) if (benchmark_ADDED)
# Don't use C++14 because it doesn't work in some configurations. # patch google benchmark target
set_target_properties(benchmark PROPERTIES CXX_STANDARD 11) set_target_properties(benchmark PROPERTIES CXX_STANDARD 17)
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)

View File

@@ -1,13 +1,14 @@
#include <benchmark/benchmark.h> #include <benchmark/benchmark.h>
#include <fibonacci.h> #include <vector>
#include <algorithm> #include <algorithm>
#include <random> #include <random>
#include <vector>
std::vector<unsigned> createTestNumbers() { #include <fibonacci.h>
std::vector<unsigned> createTestNumbers(){
std::vector<unsigned> v; std::vector<unsigned> v;
for (int i = 0; i < 25; ++i) v.emplace_back(i); for (int i=0;i<25;++i) v.emplace_back(i);
std::random_device rd; std::random_device rd;
std::mt19937 g(rd()); std::mt19937 g(rd());
std::shuffle(v.begin(), v.end(), g); std::shuffle(v.begin(), v.end(), g);
@@ -17,7 +18,7 @@ std::vector<unsigned> createTestNumbers() {
void fibonacci(benchmark::State& state) { void fibonacci(benchmark::State& state) {
auto numbers = createTestNumbers(); auto numbers = createTestNumbers();
for (auto _ : state) { for (auto _ : state) {
for (auto v : numbers) benchmark::DoNotOptimize(fibonacci(v)); for (auto v: numbers) benchmark::DoNotOptimize(fibonacci(v));
} }
} }
@@ -26,7 +27,7 @@ BENCHMARK(fibonacci);
void fastFibonacci(benchmark::State& state) { void fastFibonacci(benchmark::State& state) {
auto numbers = createTestNumbers(); auto numbers = createTestNumbers();
for (auto _ : state) { for (auto _ : state) {
for (auto v : numbers) benchmark::DoNotOptimize(fastFibonacci(v)); for (auto v: numbers) benchmark::DoNotOptimize(fastFibonacci(v));
} }
} }

View File

@@ -5,7 +5,7 @@ project(CPMExampleBoost)
# ---- Create binary ---- # ---- Create binary ----
add_executable(CPMExampleBoost main.cpp) add_executable(CPMExampleBoost main.cpp)
target_compile_features(CPMExampleBoost PRIVATE cxx_std_17) set_target_properties(CPMExampleBoost PROPERTIES CXX_STANDARD 17)
# ---- Dependencies ---- # ---- Dependencies ----
@@ -18,6 +18,4 @@ CPMFindPackage(
FIND_PACKAGE_ARGUMENTS "COMPONENTS system" FIND_PACKAGE_ARGUMENTS "COMPONENTS system"
) )
find_package(Threads REQUIRED) target_link_libraries(CPMExampleBoost PRIVATE Boost::system pthread)
target_link_libraries(CPMExampleBoost PRIVATE Boost::system Threads::Threads)

View File

@@ -8,13 +8,17 @@
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
// //
#include <iostream>
#include <boost/asio.hpp> #include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp> #include <boost/date_time/posix_time/posix_time.hpp>
#include <iostream>
void print(const boost::system::error_code& /*e*/) { std::cout << "Hello, world!" << std::endl; } void print(const boost::system::error_code& /*e*/)
{
std::cout << "Hello, world!" << std::endl;
}
int main() { int main()
{
boost::asio::io_service io; boost::asio::io_service io;
boost::asio::deadline_timer t(io, boost::posix_time::seconds(1)); boost::asio::deadline_timer t(io, boost::posix_time::seconds(1));

View File

@@ -1,7 +1,5 @@
#!/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
@@ -11,16 +9,14 @@ 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)
@@ -28,6 +24,6 @@ for example in examples:
project = Path(".") / 'build' / example.name project = Path(".") / 'build' / example.name
configure = runCommand('cmake -H%s -B%s' % (example, project)) configure = runCommand('cmake -H%s -B%s' % (example, project))
print(' ' + '\n '.join([line for line in configure.split('\n') if 'CPM:' in line])) print(' ' + '\n '.join([line for line in configure.split('\n') if 'CPM:' in line]))
build = runCommand('cmake --build %s -- -j%i' % (project, os.cpu_count() / 2)) build = runCommand('cmake --build %s -j4' % (project))
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('')

View File

@@ -15,16 +15,16 @@ CPMAddPackage(
CPMAddPackage( CPMAddPackage(
NAME Catch2 NAME Catch2
GITHUB_REPOSITORY catchorg/Catch2 GITHUB_REPOSITORY catchorg/Catch2
VERSION 2.13.4 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)
target_compile_features(CPMExampleCatch2 PRIVATE cxx_std_17) set_target_properties(CPMExampleCatch2 PROPERTIES CXX_STANDARD 17)
# ---- Enable testing ---- # ---- Enable testing ----
enable_testing() ENABLE_TESTING()
add_test(CPMExampleCatch2 CPMExampleCatch2) ADD_TEST(CPMExampleCatch2 CPMExampleCatch2)

View File

@@ -1,10 +1,9 @@
#define CATCH_CONFIG_MAIN #define CATCH_CONFIG_MAIN
#include <catch2/catch.hpp>
#include <fibonacci.h> #include <fibonacci.h>
#include <catch2/catch.hpp> TEST_CASE("fibonacci"){
TEST_CASE("fibonacci") {
REQUIRE(fibonacci(0) == 0); REQUIRE(fibonacci(0) == 0);
REQUIRE(fibonacci(1) == 1); REQUIRE(fibonacci(1) == 1);
REQUIRE(fibonacci(2) == 1); REQUIRE(fibonacci(2) == 1);
@@ -14,8 +13,8 @@ TEST_CASE("fibonacci") {
REQUIRE(fibonacci(13) == 233); REQUIRE(fibonacci(13) == 233);
} }
TEST_CASE("fastFibonacci") { TEST_CASE("fastFibonacci"){
for (unsigned i = 0; i < 25; ++i) { for (unsigned i=0; i<25; ++i){
REQUIRE(fibonacci(i) == fastFibonacci(i)); REQUIRE(fibonacci(i) == fastFibonacci(i));
} }
} }

View File

@@ -8,13 +8,15 @@ include(../../cmake/CPM.cmake)
CPMAddPackage( CPMAddPackage(
NAME cereal NAME cereal
VERSION 1.3.0 VERSION 1.2.2
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"
) )
# ---- Create binary ---- # ---- Create binary ----
add_executable(CPMExampleCereal main.cpp) add_executable(CPMExampleCereal main.cpp)
target_link_libraries(CPMExampleCereal cereal) target_link_libraries(CPMExampleCereal cereal )
target_compile_features(CPMExampleCereal PRIVATE cxx_std_17) set_target_properties(CPMExampleCereal PROPERTIES CXX_STANDARD 17)

View File

@@ -1,20 +1,28 @@
#define CATCH_CONFIG_MAIN #define CATCH_CONFIG_MAIN
#include <cereal/archives/json.hpp>
#include <cereal/cereal.hpp> #include <cereal/cereal.hpp>
#include <sstream> #include <cereal/archives/json.hpp>
#include <string>
struct player_data { #include <string>
#include <sstream>
struct player_data
{
int id{-1}; int id{-1};
std::string name{}; std::string name{};
}; };
template <typename Archive> void serialize(Archive &archive, player_data const &data) { template<typename Archive>
archive(cereal::make_nvp("id", data.id), cereal::make_nvp("name", data.name)); void serialize(Archive& archive, player_data const &data)
{
archive(
cereal::make_nvp("id", data.id),
cereal::make_nvp("name", data.name)
);
} }
int main(int argc, char const *argv[]) { int main(int argc, char const *argv[])
{
player_data player{3, "Gamer One"}; player_data player{3, "Gamer One"};
std::ostringstream oss; std::ostringstream oss;
cereal::JSONOutputArchive output(oss); cereal::JSONOutputArchive output(oss);

View File

@@ -10,11 +10,13 @@ CPMAddPackage(
NAME cxxopts NAME cxxopts
GITHUB_REPOSITORY jarro2783/cxxopts GITHUB_REPOSITORY jarro2783/cxxopts
VERSION 2.2.0 VERSION 2.2.0
OPTIONS "CXXOPTS_BUILD_EXAMPLES Off" "CXXOPTS_BUILD_TESTS Off" 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)
target_compile_features(CPMExampleCXXOpts PRIVATE cxx_std_17) set_target_properties(CPMExampleCXXOpts PROPERTIES CXX_STANDARD 17)

View File

@@ -1,19 +1,21 @@
#include <cxxopts.hpp> #include <cxxopts.hpp>
#include <iostream> #include <iostream>
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")( options.add_options()
"f,file", "File name", cxxopts::value<std::string>()); ("h,help", "Show help")
("d,debug", "Enable debugging")
("f,file", "File name", cxxopts::value<std::string>());
auto result = options.parse(argc, argv); auto result = options.parse(argc, argv);
if (result["help"].as<bool>()) { if (result["help"].as<bool>()) {
std::cout << options.help() << std::endl; std::cout << options.help() << std::endl;
return 0; return 0;
} }
for (auto arg : result.arguments()) { for (auto arg: result.arguments()) {
std::cout << "option: " << arg.key() << ": " << arg.value() << std::endl; std::cout << "option: " << arg.key() << ": " << arg.value() << std::endl;
} }

View File

@@ -15,16 +15,16 @@ CPMAddPackage(
CPMAddPackage( CPMAddPackage(
NAME doctest NAME doctest
GITHUB_REPOSITORY onqtam/doctest GITHUB_REPOSITORY onqtam/doctest
GIT_TAG 2.4.5 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)
target_compile_features(CPMExampleDoctest PRIVATE cxx_std_17) set_target_properties(CPMExampleDoctest PROPERTIES CXX_STANDARD 17)
# ---- Enable testing ---- # ---- Enable testing ----
enable_testing() ENABLE_TESTING()
add_test(CPMExampleDoctest CPMExampleDoctest) ADD_TEST(CPMExampleDoctest CPMExampleDoctest)

View File

@@ -3,7 +3,7 @@
#include <doctest/doctest.h> #include <doctest/doctest.h>
#include <fibonacci.h> #include <fibonacci.h>
TEST_CASE("fibonacci") { TEST_CASE("fibonacci"){
CHECK(fibonacci(0) == 0); CHECK(fibonacci(0) == 0);
CHECK(fibonacci(1) == 1); CHECK(fibonacci(1) == 1);
CHECK(fibonacci(2) == 1); CHECK(fibonacci(2) == 1);
@@ -13,8 +13,8 @@ TEST_CASE("fibonacci") {
CHECK(fibonacci(13) == 233); CHECK(fibonacci(13) == 233);
} }
TEST_CASE("fastfibonacci") { TEST_CASE("fastfibonacci"){
for (unsigned i = 0; i < 25; ++i) { for (unsigned i=0; i<25; ++i){
CHECK(fibonacci(i) == fastFibonacci(i)); CHECK(fibonacci(i) == fastFibonacci(i));
} }
} }

View File

@@ -14,13 +14,13 @@ CPMAddPackage(
DOWNLOAD_ONLY True DOWNLOAD_ONLY True
) )
if(EnTT_ADDED) if (EnTT_ADDED)
add_library(EnTT INTERFACE) add_library(EnTT INTERFACE)
target_include_directories(EnTT SYSTEM INTERFACE ${EnTT_SOURCE_DIR}/src) target_include_directories(EnTT INTERFACE ${EnTT_SOURCE_DIR}/src)
endif() endif()
# ---- Executable ---- # ---- Executable ----
add_executable(CPMEnTTExample main.cpp) add_executable(CPMEnTTExample "main.cpp")
target_compile_features(CPMEnTTExample PRIVATE cxx_std_17) set_target_properties(CPMEnTTExample PROPERTIES CXX_STANDARD 17)
target_link_libraries(CPMEnTTExample EnTT) target_link_libraries(CPMEnTTExample EnTT)

View File

@@ -1,56 +1,54 @@
#include <cstdint>
#include <entt/entt.hpp> #include <entt/entt.hpp>
#include <cstdint>
struct position { struct position {
float x; float x;
float y; float y;
}; };
struct velocity { struct velocity {
float dx; float dx;
float dy; float dy;
}; };
void update(entt::registry &registry) { void update(entt::registry &registry) {
auto view = registry.view<position, velocity>(); auto view = registry.view<position, velocity>();
for (auto entity : view) { for(auto entity: view) {
// gets only the components that are going to be used ... // gets only the components that are going to be used ...
auto &vel = view.get<velocity>(entity); auto &vel = view.get<velocity>(entity);
vel.dx = 0.; vel.dx = 0.;
vel.dy = 0.; vel.dy = 0.;
// ... // ...
} }
} }
void update(std::uint64_t dt, entt::registry &registry) { void update(std::uint64_t dt, entt::registry &registry) {
registry.view<position, velocity>().each([dt](auto &pos, auto &vel) { registry.view<position, velocity>().each([dt](auto &pos, auto &vel) {
// gets all the components of the view at once ... // gets all the components of the view at once ...
pos.x += vel.dx * dt; pos.x += vel.dx * dt;
pos.y += vel.dy * dt; pos.y += vel.dy * dt;
// ... // ...
}); });
} }
int main() { int main() {
entt::registry registry; entt::registry registry;
std::uint64_t dt = 16; std::uint64_t dt = 16;
for (auto i = 0; i < 10; ++i) { for(auto i = 0; i < 10; ++i) {
auto entity = registry.create(); auto entity = registry.create();
registry.assign<position>(entity, i * 1.f, i * 1.f); registry.assign<position>(entity, i * 1.f, i * 1.f);
if (i % 2 == 0) { if(i % 2 == 0) { registry.assign<velocity>(entity, i * .1f, i * .1f); }
registry.assign<velocity>(entity, i * .1f, i * .1f);
} }
}
update(dt, registry); update(dt, registry);
update(registry); update(registry);
// ... // ...
} }

View File

@@ -8,12 +8,12 @@ include(../../cmake/CPM.cmake)
CPMAddPackage( CPMAddPackage(
NAME fmt NAME fmt
GIT_TAG 7.1.3 GIT_TAG 6.1.2
GITHUB_REPOSITORY fmtlib/fmt GITHUB_REPOSITORY fmtlib/fmt
) )
# ---- Executable ---- # ---- Executable ----
add_executable(CPMFmtExample main.cpp) add_executable(CPMFmtExample "main.cpp")
target_compile_features(CPMFmtExample PRIVATE cxx_std_17) set_target_properties(CPMFmtExample PROPERTIES CXX_STANDARD 17)
target_link_libraries(CPMFmtExample fmt) target_link_libraries(CPMFmtExample fmt)

View File

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

View File

@@ -15,18 +15,20 @@ CPMAddPackage(
CPMAddPackage( CPMAddPackage(
NAME googletest NAME googletest
GITHUB_REPOSITORY google/googletest GITHUB_REPOSITORY google/googletest
GIT_TAG release-1.10.0 GIT_TAG release-1.8.1
VERSION 1.10.0 VERSION 1.8.1
OPTIONS "INSTALL_GTEST OFF" "gtest_force_shared_crt" OPTIONS
"INSTALL_GTEST OFF"
"gtest_force_shared_crt"
) )
# ---- Create binary ---- # ---- Create binary ----
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)
target_compile_features(CPMExampleGtest PRIVATE cxx_std_17) set_target_properties(CPMExampleGtest PROPERTIES CXX_STANDARD 17)
# ---- Enable testing ---- # ---- Enable testing ----
enable_testing() enable_testing()
add_test(CPMExampleGtest CPMExampleGtest) add_test(CPMExampleGtest CPMExampleGtest)

View File

@@ -1,7 +1,8 @@
#include <fibonacci.h>
#include <gtest/gtest.h> #include <gtest/gtest.h>
#include <fibonacci.h>
TEST(FibonacciTests, BasicChecks) { TEST(FibonacciTests, BasicChecks)
{
ASSERT_TRUE(fibonacci(0) == 0); ASSERT_TRUE(fibonacci(0) == 0);
ASSERT_TRUE(fibonacci(1) == 1); ASSERT_TRUE(fibonacci(1) == 1);
ASSERT_TRUE(fibonacci(2) == 1); ASSERT_TRUE(fibonacci(2) == 1);

View File

@@ -8,19 +8,19 @@ include(../../cmake/CPM.cmake)
CPMAddPackage( CPMAddPackage(
NAME nlohmann_json NAME nlohmann_json
VERSION 3.9.1 VERSION 3.6.1
# not using the repo as it takes forever to clone # not using the repo as it takes forever to clone
URL https://github.com/nlohmann/json/releases/download/v3.9.1/include.zip URL https://github.com/nlohmann/json/releases/download/v3.6.1/include.zip
URL_HASH SHA256=6bea5877b1541d353bd77bdfbdb2696333ae5ed8f9e8cc22df657192218cad91 URL_HASH SHA256=69cc88207ce91347ea530b227ff0776db82dcb8de6704e1a3d74f4841bc651cf
) )
if(nlohmann_json_ADDED) if(nlohmann_json_ADDED)
add_library(nlohmann_json INTERFACE) add_library(nlohmann_json INTERFACE)
target_include_directories(nlohmann_json SYSTEM INTERFACE ${nlohmann_json_SOURCE_DIR}/include) target_include_directories(nlohmann_json INTERFACE ${nlohmann_json_SOURCE_DIR})
endif() endif()
# ---- Executable ---- # ---- Executable ----
add_executable(CPMJSONExample main.cpp) add_executable(CPMJSONExample "main.cpp")
target_compile_features(CPMJSONExample PRIVATE cxx_std_17) set_target_properties(CPMJSONExample PROPERTIES CXX_STANDARD 17)
target_link_libraries(CPMJSONExample nlohmann_json) target_link_libraries(CPMJSONExample nlohmann_json)

View File

@@ -1,15 +1,23 @@
#include <iomanip>
#include <iostream>
#include <nlohmann/json.hpp> #include <nlohmann/json.hpp>
#include <iostream>
#include <iomanip>
int main() { int main(){
nlohmann::json json = {{"pi", 3.141},
{"happy", true}, nlohmann::json json = {
{"name", "Niels"}, {"pi", 3.141},
{"nothing", nullptr}, {"happy", true},
{"answer", {{"everything", 42}}}, {"name", "Niels"},
{"list", {1, 0, 2}}, {"nothing", nullptr},
{"object", {{"currency", "USD"}, {"value", 42.99}}}}; {"answer", {
{"everything", 42}
}},
{"list", {1, 0, 2}},
{"object", {
{"currency", "USD"},
{"value", 42.99}
}}
};
std::cout << "declared JSON object: " << std::setw(2) << json << std::endl; std::cout << "declared JSON object: " << std::setw(2) << json << std::endl;

View File

@@ -14,11 +14,11 @@ CPMAddPackage(
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 SYSTEM PUBLIC ${linenoise_SOURCE_DIR}) target_include_directories(linenoise PUBLIC ${linenoise_SOURCE_DIR})
endif() endif()
# ---- Executable ---- # ---- Executable ----
add_executable(CPMlinenoiseExample main.cpp) add_executable(CPMlinenoiseExample "main.cpp")
target_compile_features(CPMlinenoiseExample PRIVATE cxx_std_17) set_target_properties(CPMlinenoiseExample PROPERTIES CXX_STANDARD 17)
target_link_libraries(CPMlinenoiseExample linenoise) target_link_libraries(CPMlinenoiseExample linenoise)

View File

@@ -1,64 +1,64 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "linenoise.h" #include "linenoise.h"
void completion(const char *buf, linenoiseCompletions *lc) { void completion(const char *buf, linenoiseCompletions *lc) {
if (buf[0] == 'h') { if (buf[0] == 'h') {
linenoiseAddCompletion(lc, "hello"); linenoiseAddCompletion(lc,"hello");
linenoiseAddCompletion(lc, "hello there"); linenoiseAddCompletion(lc,"hello there");
} }
} }
int main(int argc, char **argv) { int main(int argc, char **argv) {
char *line; char *line;
char *prgname = argv[0]; char *prgname = argv[0];
/* Parse options, with --multiline we enable multi line editing. */ /* Parse options, with --multiline we enable multi line editing. */
while (argc > 1) { while(argc > 1) {
argc--; argc--;
argv++; argv++;
if (!strcmp(*argv, "--multiline")) { if (!strcmp(*argv,"--multiline")) {
linenoiseSetMultiLine(1); linenoiseSetMultiLine(1);
printf("Multi-line mode enabled.\n"); printf("Multi-line mode enabled.\n");
} else if (!strcmp(*argv, "--keycodes")) { } else if (!strcmp(*argv,"--keycodes")) {
linenoisePrintKeyCodes(); linenoisePrintKeyCodes();
exit(0); exit(0);
} else { } else {
fprintf(stderr, "Usage: %s [--multiline] [--keycodes]\n", prgname); fprintf(stderr, "Usage: %s [--multiline] [--keycodes]\n", prgname);
exit(1); exit(1);
}
} }
}
/* Set the completion callback. This will be called every time the /* Set the completion callback. This will be called every time the
* user uses the <tab> key. */ * user uses the <tab> key. */
linenoiseSetCompletionCallback(completion); linenoiseSetCompletionCallback(completion);
/* Load history from file. The history file is just a plain text file /* Load history from file. The history file is just a plain text file
* where entries are separated by newlines. */ * where entries are separated by newlines. */
linenoiseHistoryLoad("history.txt"); /* Load the history at startup */ linenoiseHistoryLoad("history.txt"); /* Load the history at startup */
/* Now this is the main loop of the typical linenoise-based application. /* Now this is the main loop of the typical linenoise-based application.
* The call to linenoise() will block as long as the user types something * The call to linenoise() will block as long as the user types something
* and presses enter. * and presses enter.
* *
* The typed string is returned as a malloc() allocated string by * The typed string is returned as a malloc() allocated string by
* linenoise, so the user needs to free() it. */ * linenoise, so the user needs to free() it. */
while ((line = linenoise("hello> ")) != NULL) { while((line = linenoise("hello> ")) != NULL) {
/* Do something with the string. */ /* Do something with the string. */
if (line[0] != '\0' && line[0] != '/') { if (line[0] != '\0' && line[0] != '/') {
printf("echo: '%s'\n", line); printf("echo: '%s'\n", line);
linenoiseHistoryAdd(line); /* Add to the history. */ linenoiseHistoryAdd(line); /* Add to the history. */
linenoiseHistorySave("history.txt"); /* Save the history on disk. */ linenoiseHistorySave("history.txt"); /* Save the history on disk. */
} else if (!strncmp(line, "/historylen", 11)) { } else if (!strncmp(line,"/historylen",11)) {
/* The "/historylen" command will change the history len. */ /* The "/historylen" command will change the history len. */
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("Unreconized command: %s\n", line);
}
free(line);
} }
free(line); return 0;
}
return 0;
} }

View File

@@ -8,19 +8,19 @@ include(../../cmake/CPM.cmake)
CPMAddPackage( CPMAddPackage(
NAME range-v3 NAME range-v3
URL https://github.com/ericniebler/range-v3/archive/0.11.0.zip URL https://github.com/ericniebler/range-v3/archive/0.5.0.zip
VERSION 0.11.0 VERSION 0.5.0
# the range-v3 CMakeLists screws with configuration options # the range-v3 CMakeLists screws with configuration options
DOWNLOAD_ONLY True DOWNLOAD_ONLY True
) )
if(range-v3_ADDED) if(range-v3_ADDED)
add_library(range-v3 INTERFACE IMPORTED) add_library(range-v3 INTERFACE IMPORTED)
target_include_directories(range-v3 SYSTEM INTERFACE "${range-v3_SOURCE_DIR}/include") target_include_directories(range-v3 INTERFACE "${range-v3_SOURCE_DIR}/include")
endif() endif()
# ---- Executable ---- # ---- Executable ----
add_executable(CPMRangev3Example main.cpp) add_executable(CPMRangev3Example "main.cpp")
target_compile_features(CPMRangev3Example PRIVATE cxx_std_17) set_target_properties(CPMRangev3Example PROPERTIES CXX_STANDARD 17)
target_link_libraries(CPMRangev3Example range-v3) target_link_libraries(CPMRangev3Example range-v3)

View File

@@ -18,24 +18,27 @@
// vector all_of is_six: false // vector all_of is_six: false
// vector none_of is_six: false // vector none_of is_six: false
#include <iostream>
#include <range/v3/algorithm/all_of.hpp> #include <range/v3/algorithm/all_of.hpp>
#include <range/v3/algorithm/any_of.hpp> #include <range/v3/algorithm/any_of.hpp>
#include <range/v3/algorithm/for_each.hpp> #include <range/v3/algorithm/for_each.hpp>
#include <range/v3/algorithm/none_of.hpp> #include <range/v3/algorithm/none_of.hpp>
#include <range/v3/view/all.hpp> #include <range/v3/view/all.hpp>
#include <iostream>
#include <vector> #include <vector>
using std::cout; using std::cout;
auto is_six = [](int i) { return i == 6; }; auto is_six = [](int i) { return i == 6; };
int main() { int
std::vector<int> v{6, 2, 3, 4, 5, 6}; main()
cout << std::boolalpha; {
cout << "vector: " << ranges::view::all(v) << '\n'; std::vector<int> v{6, 2, 3, 4, 5, 6};
cout << std::boolalpha;
cout << "vector: " << ranges::view::all(v) << '\n';
cout << "vector any_of is_six: " << ranges::any_of(v, is_six) << '\n'; cout << "vector 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';
cout << "vector none_of is_six: " << ranges::none_of(v, is_six) << '\n'; cout << "vector none_of is_six: " << ranges::none_of(v, is_six) << '\n';
} }
//[any_all_none_of]] //[any_all_none_of]]

View File

@@ -15,11 +15,12 @@ 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 SYSTEM INTERFACE "${simple_match_SOURCE_DIR}/include") target_include_directories(simple_match INTERFACE "${simple_match_SOURCE_DIR}/include")
endif() endif()
# ---- Executable ---- # ---- Executable ----
add_executable(CPMSimpleMatchExample main.cpp) add_executable(CPMSimpleMatchExample "main.cpp")
target_compile_features(CPMSimpleMatchExample PRIVATE cxx_std_17) set_target_properties(CPMSimpleMatchExample PROPERTIES CXX_STANDARD 17)
target_link_libraries(CPMSimpleMatchExample simple_match) target_link_libraries(CPMSimpleMatchExample simple_match)

View File

@@ -1,7 +1,8 @@
#include <iostream>
#include <simple_match/simple_match.hpp> #include <simple_match/simple_match.hpp>
int main(int argc, char** argv) { #include <iostream>
int main(int argc, char ** argv){
using namespace simple_match; using namespace simple_match;
using namespace simple_match::placeholders; using namespace simple_match::placeholders;
@@ -11,23 +12,22 @@ int main(int argc, char** argv) {
while (true) { while (true) {
std::cout << "> "; std::cout << "> ";
std::getline(std::cin, input); std::getline(std::cin, input);
if (input == "quit") { if (input == "quit") { break; }
break;
}
int x; int x;
try { try {
x = std::stoi(input); x = std::stoi(input);
} catch (std::invalid_argument&) { } catch(std::invalid_argument &) {
std::cout << "invalid input" << std::endl; std::cout << "invalid input" << std::endl;
continue; continue;
} }
match( match(x,
x, 1, []() { std::cout << "The answer is one\n"; }, 2, 1, []() {std::cout << "The answer is one\n"; },
[]() { std::cout << "The answer is two\n"; }, _x < 10, 2, []() {std::cout << "The answer is two\n"; },
[](auto&& a) { std::cout << "The answer " << a << " is less than 10\n"; }, 10 < _x < 20, _x < 10, [](auto&& a) {std::cout << "The answer " << a << " is less than 10\n"; },
[](auto&& a) { std::cout << "The answer " << a << " is between 10 and 20 exclusive\n"; }, _, 10 < _x < 20, [](auto&& a) {std::cout << "The answer " << a << " is between 10 and 20 exclusive\n"; },
[]() { std::cout << "Did not match\n"; }); _, []() {std::cout << "Did not match\n"; }
);
} }
return 0; return 0;

View File

@@ -13,16 +13,19 @@ CPMAddPackage(
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")
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 URL https://github.com/ThePhD/sol2/archive/v3.0.2.zip
@@ -30,14 +33,15 @@ CPMAddPackage(
DOWNLOAD_ONLY YES DOWNLOAD_ONLY YES
) )
if(sol2_ADDED) if (sol2_ADDED)
add_library(sol2 INTERFACE IMPORTED) add_library(sol2 INTERFACE IMPORTED)
target_include_directories(sol2 SYSTEM INTERFACE ${sol2_SOURCE_DIR}/include) target_include_directories(sol2 INTERFACE ${sol2_SOURCE_DIR}/include)
target_link_libraries(sol2 INTERFACE lua) target_link_libraries(sol2 INTERFACE lua)
endif() endif()
# ---- Executable ---- # ---- Executable ----
add_executable(CPMSol2Example main.cpp) add_executable(CPMSol2Example "main.cpp")
target_compile_features(CPMSol2Example PRIVATE cxx_std_17) set_target_properties(CPMSol2Example PROPERTIES CXX_STANDARD 17)
target_link_libraries(CPMSol2Example sol2) target_link_libraries(CPMSol2Example sol2)

View File

@@ -1,17 +1,16 @@
#include <cassert>
#include <sol/sol.hpp> #include <sol/sol.hpp>
#include <cassert>
struct vars { struct vars {
int boop = 0; int boop = 0;
}; };
int main() { int main() {
sol::state lua; sol::state lua;
lua.open_libraries(sol::lib::base); lua.open_libraries( sol::lib::base );
lua.new_usertype<vars>("vars", "boop", &vars::boop); lua.new_usertype<vars>("vars", "boop", &vars::boop);
lua.script( lua.script("beep = vars.new()\n"
"beep = vars.new()\n" "beep.boop = 1\n"
"beep.boop = 1\n" "print('beep boop')");
"print('beep boop')"); assert(lua.get<vars>("beep").boop == 1);
assert(lua.get<vars>("beep").boop == 1);
} }

View File

@@ -1,19 +0,0 @@
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
project(CPMSpdlogExample)
# ---- Dependencies ----
include(../../cmake/CPM.cmake)
CPMAddPackage(
NAME spdlog
GITHUB_REPOSITORY gabime/spdlog
VERSION 1.8.2
)
# ---- Executable ----
add_executable(CPMSpdlogExample main.cpp)
target_compile_features(CPMSpdlogExample PRIVATE cxx_std_17)
target_link_libraries(CPMSpdlogExample spdlog)

View File

@@ -1,6 +0,0 @@
#include <spdlog/spdlog.h>
int main() {
spdlog::info("Hello, world!");
return 0;
}

View File

@@ -9,13 +9,19 @@ include(../../cmake/CPM.cmake)
CPMAddPackage( CPMAddPackage(
NAME yaml-cpp NAME yaml-cpp
GIT_REPOSITORY https://github.com/jbeder/yaml-cpp.git GIT_REPOSITORY https://github.com/jbeder/yaml-cpp.git
VERSION 0.6.3 # 0.6.2 uses deprecated CMake syntax
GIT_TAG yaml-cpp-0.6.3 VERSION 0.6.3
OPTIONS "YAML_CPP_BUILD_TESTS Off" "YAML_CPP_BUILD_CONTRIB Off" "YAML_CPP_BUILD_TOOLS Off" # 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")
target_compile_features(CPMYamlExample PRIVATE cxx_std_17) set_target_properties(CPMYamlExample PROPERTIES CXX_STANDARD 17)
target_link_libraries(CPMYamlExample yaml-cpp) target_link_libraries(CPMYamlExample yaml-cpp)

View File

@@ -1,8 +1,7 @@
#include <yaml-cpp/yaml.h> #include <yaml-cpp/yaml.h>
#include <iostream> #include <iostream>
int main(int argc, char** argv) { int main(int argc, char ** argv){
if (argc != 2) { if (argc != 2) {
std::cout << "usage: " << argv[0] << " <path to yaml file>" << std::endl; std::cout << "usage: " << argv[0] << " <path to yaml file>" << std::endl;
return 1; return 1;

View File

@@ -8,8 +8,9 @@ enable_testing()
foreach(test ${tests}) foreach(test ${tests})
message(STATUS "adding test: ${test}") message(STATUS "adding test: ${test}")
add_test(NAME ${test} COMMAND ${CMAKE_COMMAND} -DCPM_PATH=${CMAKE_CURRENT_SOURCE_DIR}/../cmake -P add_test(
"${test}" NAME ${test}
COMMAND ${CMAKE_COMMAND} -DCPM_PATH=${CMAKE_CURRENT_SOURCE_DIR}/../cmake -P "${test}"
) )
endforeach() endforeach()

View File

@@ -1,12 +0,0 @@
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
project(CPMStyleCheck)
include(${CMAKE_CURRENT_LIST_DIR}/../../cmake/CPM.cmake)
CPMAddPackage(
NAME Format.cmake
VERSION 1.6
GITHUB_REPOSITORY TheLartians/Format.cmake
OPTIONS "FORMAT_CHECK_CMAKE ON"
)

View File

@@ -1,2 +0,0 @@
/CMakeLists.txt
/package-lock.cmake

View File

@@ -1,13 +0,0 @@
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@
)

View File

@@ -1,3 +0,0 @@
project(BrokenDependency)
add_custom_target(error ALL ${CMAKE_COMMAND} -E false)

View File

@@ -8,8 +8,8 @@ set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/remote_dependency)
function(clear_cache) function(clear_cache)
message(STATUS "clearing CPM cache") message(STATUS "clearing CPM cache")
file(REMOVE_RECURSE ${CPM_SOURCE_CACHE_DIR}) FILE(REMOVE_RECURSE ${CPM_SOURCE_CACHE_DIR})
assert_not_exists("${CPM_SOURCE_CACHE_DIR}") ASSERT_NOT_EXISTS("${CPM_SOURCE_CACHE_DIR}")
endfunction() endfunction()
function(update_cmake_lists) function(update_cmake_lists)
@@ -22,92 +22,100 @@ endfunction()
function(reset_test) function(reset_test)
clear_cache() clear_cache()
file(REMOVE_RECURSE ${TEST_BUILD_DIR}) FILE(REMOVE_RECURSE ${TEST_BUILD_DIR})
update_cmake_lists() update_cmake_lists()
endfunction() endfunction()
set(FIBONACCI_VERSION 1.0) set(FIBONACCI_VERSION 1.0)
# Read CPM_SOURCE_CACHE from arguments ## Read CPM_SOURCE_CACHE from arguments
reset_test() reset_test()
execute_process( execute_process(
COMMAND ${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/remote_dependency" "-B${TEST_BUILD_DIR}" COMMAND
"-DCPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}" RESULT_VARIABLE ret ${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/remote_dependency" "-B${TEST_BUILD_DIR}" "-DCPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}"
RESULT_VARIABLE ret
) )
assert_equal(${ret} "0") ASSERT_EQUAL(${ret} "0")
assert_exists("${CPM_SOURCE_CACHE_DIR}/fibonacci") ASSERT_EXISTS("${CPM_SOURCE_CACHE_DIR}/fibonacci")
file(GLOB FIBONACCI_VERSIONs "${CPM_SOURCE_CACHE_DIR}/fibonacci/*") FILE(GLOB FIBONACCI_VERSIONs "${CPM_SOURCE_CACHE_DIR}/fibonacci/*")
list(LENGTH FIBONACCI_VERSIONs FIBONACCI_VERSION_count) list(LENGTH FIBONACCI_VERSIONs FIBONACCI_VERSION_count)
assert_equal(${FIBONACCI_VERSION_count} "1") ASSERT_EQUAL(${FIBONACCI_VERSION_count} "1")
file(GLOB fibonacci_versions "${CPM_SOURCE_CACHE_DIR}/fibonacci/*") FILE(GLOB fibonacci_versions "${CPM_SOURCE_CACHE_DIR}/fibonacci/*")
list(LENGTH fibonacci_versions fibonacci_version_count) list(LENGTH fibonacci_versions fibonacci_version_count)
assert_equal(${fibonacci_version_count} "1") ASSERT_EQUAL(${fibonacci_version_count} "1")
# Update dependency and keep CPM_SOURCE_CACHE ## Update dependency and keep CPM_SOURCE_CACHE
set(FIBONACCI_VERSION 2.0) 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/*") FILE(GLOB FIBONACCI_VERSIONs "${CPM_SOURCE_CACHE_DIR}/fibonacci/*")
list(LENGTH FIBONACCI_VERSIONs FIBONACCI_VERSION_count) list(LENGTH FIBONACCI_VERSIONs FIBONACCI_VERSION_count)
assert_equal(${FIBONACCI_VERSION_count} "2") ASSERT_EQUAL(${FIBONACCI_VERSION_count} "2")
# Clear cache and update ## Clear cache and update
clear_cache() clear_cache()
execute_process(COMMAND ${CMAKE_COMMAND} ${TEST_BUILD_DIR} RESULT_VARIABLE ret) execute_process(
COMMAND
${CMAKE_COMMAND} ${TEST_BUILD_DIR}
RESULT_VARIABLE ret
)
assert_equal(${ret} "0") ASSERT_EQUAL(${ret} "0")
assert_exists("${CPM_SOURCE_CACHE_DIR}/fibonacci") ASSERT_EXISTS("${CPM_SOURCE_CACHE_DIR}/fibonacci")
# Read CPM_SOURCE_CACHE from environment ## Read CPM_SOURCE_CACHE from environment
reset_test() reset_test()
execute_process( execute_process(
COMMAND ${CMAKE_COMMAND} -E env "CPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}" ${CMAKE_COMMAND} COMMAND
"-H${CMAKE_CURRENT_LIST_DIR}/remote_dependency" "-B${TEST_BUILD_DIR}" RESULT_VARIABLE ret ${CMAKE_COMMAND} -E env "CPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}" ${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/remote_dependency" "-B${TEST_BUILD_DIR}"
)
assert_equal(${ret} "0")
assert_exists("${CPM_SOURCE_CACHE_DIR}/fibonacci")
# Reuse cached packages for other build
execute_process(
COMMAND ${CMAKE_COMMAND} -E env "CPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}" ${CMAKE_COMMAND}
"-H${CMAKE_CURRENT_LIST_DIR}/remote_dependency" "-B${TEST_BUILD_DIR}-2"
RESULT_VARIABLE ret RESULT_VARIABLE ret
) )
assert_equal(${ret} "0") ASSERT_EQUAL(${ret} "0")
ASSERT_EXISTS("${CPM_SOURCE_CACHE_DIR}/fibonacci")
# Overwrite CPM_SOURCE_CACHE with argument ## Reuse cached packages for other build
execute_process(
COMMAND
${CMAKE_COMMAND} -E env "CPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}" ${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/remote_dependency" "-B${TEST_BUILD_DIR}-2"
RESULT_VARIABLE ret
)
ASSERT_EQUAL(${ret} "0")
## Overwrite CPM_SOURCE_CACHE with argument
reset_test() 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}" "-DCPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}"
"-H${CMAKE_CURRENT_LIST_DIR}/remote_dependency" "-B${TEST_BUILD_DIR}"
"-DCPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}"
RESULT_VARIABLE ret 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")
# Use NO_CACHE option ## Use NO_CACHE option
set(FIBONACCI_PACKAGE_ARGS "NO_CACHE YES") set(FIBONACCI_PACKAGE_ARGS "NO_CACHE YES")
set(FIBONACCI_VERSION 1.0) set(FIBONACCI_VERSION 1.0)
@@ -115,23 +123,25 @@ update_cmake_lists()
reset_test() reset_test()
execute_process( execute_process(
COMMAND ${CMAKE_COMMAND} -E env "CPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}" ${CMAKE_COMMAND} COMMAND
"-H${CMAKE_CURRENT_LIST_DIR}/remote_dependency" "-B${TEST_BUILD_DIR}" RESULT_VARIABLE ret ${CMAKE_COMMAND} -E env "CPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}" ${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/remote_dependency" "-B${TEST_BUILD_DIR}"
RESULT_VARIABLE ret
) )
assert_equal(${ret} "0") ASSERT_EQUAL(${ret} "0")
assert_not_exists("${CPM_SOURCE_CACHE_DIR}/fibonacci") ASSERT_NOT_EXISTS("${CPM_SOURCE_CACHE_DIR}/fibonacci")
# Use commit hash after version ## Use commit hash after version
set(FIBONACCI_PACKAGE_ARGS "NO_CACHE YES GIT_TAG e9ebf168ca0fffaa4ef8c6fefc6346aaa22f6ed5") set(FIBONACCI_PACKAGE_ARGS "NO_CACHE YES GIT_TAG e9ebf168ca0fffaa4ef8c6fefc6346aaa22f6ed5")
set(FIBONACCI_VERSION 1.1) set(FIBONACCI_VERSION 1.1)
update_cmake_lists() update_cmake_lists()
execute_process( execute_process(
COMMAND ${CMAKE_COMMAND} -E env "CPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}" ${CMAKE_COMMAND} COMMAND
"-H${CMAKE_CURRENT_LIST_DIR}/remote_dependency" "-B${TEST_BUILD_DIR}" RESULT_VARIABLE ret ${CMAKE_COMMAND} -E env "CPM_SOURCE_CACHE=${CPM_SOURCE_CACHE_DIR}" ${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/remote_dependency" "-B${TEST_BUILD_DIR}"
RESULT_VARIABLE ret
) )
assert_equal(${ret} "0") ASSERT_EQUAL(${ret} "0")
assert_not_exists("${CPM_SOURCE_CACHE_DIR}/fibonacci") ASSERT_NOT_EXISTS("${CPM_SOURCE_CACHE_DIR}/fibonacci")

View File

@@ -5,19 +5,31 @@ 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
)
CPMAddPackage(NAME A VERSION 1.2.3) CPMAddPackage(
NAME A
VERSION 1.2.3
)
CPMGetPackageVersion(A VERSION) CPMGetPackageVersion(A VERSION)
assert_equal(${VERSION} "1.2.3") ASSERT_EQUAL(${VERSION} "1.2.3")
CPMAddPackage(NAME B VERSION 2.4.1) CPMAddPackage(
NAME B
VERSION 2.4.1
)
CPMAddPackage(NAME B GIT_TAG v2.3.1) CPMAddPackage(
NAME B
GIT_TAG v2.3.1
)
CPMGetPackageVersion(B VERSION) CPMGetPackageVersion(B VERSION)
assert_equal(${VERSION} "2.4.1") ASSERT_EQUAL(${VERSION} "2.4.1")
CPMAddPackage( CPMAddPackage(
NAME C NAME C
@@ -26,4 +38,4 @@ CPMAddPackage(
) )
CPMGetPackageVersion(C VERSION) CPMGetPackageVersion(C VERSION)
assert_equal(${VERSION} "3.1.2") ASSERT_EQUAL(${VERSION} "3.1.2")

View File

@@ -1,35 +0,0 @@
include(CMakePackageConfigHelpers)
include(${CPM_PATH}/testing.cmake)
set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/exclude_from_all)
function(init_project EXCLUDE_FROM_ALL)
configure_package_config_file(
"${CMAKE_CURRENT_LIST_DIR}/broken_dependency/CMakeLists.txt.in"
"${CMAKE_CURRENT_LIST_DIR}/broken_dependency/CMakeLists.txt"
INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/junk
)
execute_process(
COMMAND ${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/broken_dependency" "-B${TEST_BUILD_DIR}"
RESULT_VARIABLE ret
)
assert_equal(${ret} "0")
endfunction()
function(build_project expected_success)
execute_process(COMMAND ${CMAKE_COMMAND} "--build" "${TEST_BUILD_DIR}" RESULT_VARIABLE ret)
if(expected_success)
assert_equal(${ret} 0)
else()
assert_not_equal(${ret} 0)
endif()
endfunction()
init_project(FALSE)
build_project(FALSE)
init_project(TRUE)
build_project(TRUE)

View File

@@ -3,20 +3,20 @@ cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
include(${CPM_PATH}/CPM.cmake) include(${CPM_PATH}/CPM.cmake)
include(${CPM_PATH}/testing.cmake) include(${CPM_PATH}/testing.cmake)
cpm_is_git_tag_commit_hash("v1.2.3" RESULT) CPM_IS_GIT_TAG_COMMIT_HASH("v1.2.3" RESULT)
assert_equal("0" ${RESULT}) ASSERT_EQUAL("0" ${RESULT})
cpm_is_git_tag_commit_hash("asio-1-12-1" RESULT) CPM_IS_GIT_TAG_COMMIT_HASH("asio-1-12-1" RESULT)
assert_equal("0" ${RESULT}) ASSERT_EQUAL("0" ${RESULT})
cpm_is_git_tag_commit_hash("513039e3cba83284cec71287fd829865b9f423bc" RESULT) CPM_IS_GIT_TAG_COMMIT_HASH("513039e3cba83284cec71287fd829865b9f423bc" RESULT)
assert_equal("1" ${RESULT}) ASSERT_EQUAL("1" ${RESULT})
cpm_is_git_tag_commit_hash("513039E3CBA83284CEC71287FD829865B9F423BC" RESULT) CPM_IS_GIT_TAG_COMMIT_HASH("513039E3CBA83284CEC71287FD829865B9F423BC" RESULT)
assert_equal("1" ${RESULT}) ASSERT_EQUAL("1" ${RESULT})
cpm_is_git_tag_commit_hash("513039E" RESULT) CPM_IS_GIT_TAG_COMMIT_HASH("513039E" RESULT)
assert_equal("1" ${RESULT}) ASSERT_EQUAL("1" ${RESULT})
cpm_is_git_tag_commit_hash("513039E3CBA8" RESULT) CPM_IS_GIT_TAG_COMMIT_HASH("513039E3CBA8" RESULT)
assert_equal("1" ${RESULT}) ASSERT_EQUAL("1" ${RESULT})

View File

@@ -24,11 +24,3 @@ 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 ----
include(@CPM_PATH@/testing.cmake)
ASSERT_TRUTHY(@TEST_DEPENDENCY_NAME@_ADDED)
ASSERT_DEFINED(@TEST_DEPENDENCY_NAME@_SOURCE_DIR)
ASSERT_DEFINED(@TEST_DEPENDENCY_NAME@_BINARY_DIR)

View File

@@ -17,11 +17,3 @@ CPMAddPackage(
# ---- Call dependency method to validate correct addition of directory ---- # ---- Call dependency method to validate correct addition of directory ----
dependency_function() dependency_function()
# ---- Check parameters ----
include(@CPM_PATH@/testing.cmake)
ASSERT_TRUTHY(Dependency_ADDED)
ASSERT_DEFINED(Dependency_SOURCE_DIR)
ASSERT_DEFINED(Dependency_BINARY_DIR)

View File

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

View File

@@ -1,9 +1,10 @@
include(CMakePackageConfigHelpers) include(CMakePackageConfigHelpers)
include(${CPM_PATH}/testing.cmake) include(${CPM_PATH}/testing.cmake)
set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/modules) set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/modules)
function(init_project_with_dependency TEST_DEPENDENCY_NAME) function(initProjectWithDependency TEST_DEPENDENCY_NAME)
configure_package_config_file( configure_package_config_file(
"${CMAKE_CURRENT_LIST_DIR}/local_dependency/ModuleCMakeLists.txt.in" "${CMAKE_CURRENT_LIST_DIR}/local_dependency/ModuleCMakeLists.txt.in"
"${CMAKE_CURRENT_LIST_DIR}/local_dependency/CMakeLists.txt" "${CMAKE_CURRENT_LIST_DIR}/local_dependency/CMakeLists.txt"
@@ -11,18 +12,19 @@ function(init_project_with_dependency TEST_DEPENDENCY_NAME)
) )
execute_process( execute_process(
COMMAND ${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/local_dependency" "-B${TEST_BUILD_DIR}" COMMAND
${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/local_dependency" "-B${TEST_BUILD_DIR}"
RESULT_VARIABLE ret RESULT_VARIABLE ret
) )
assert_equal(${ret} "0") ASSERT_EQUAL(${ret} "0")
endfunction() endfunction()
init_project_with_dependency(A) initProjectWithDependency(A)
assert_exists(${TEST_BUILD_DIR}/CPM_modules) ASSERT_EXISTS(${TEST_BUILD_DIR}/CPM_modules)
assert_exists(${TEST_BUILD_DIR}/CPM_modules/FindA.cmake) ASSERT_EXISTS(${TEST_BUILD_DIR}/CPM_modules/FindA.cmake)
assert_not_exists(${TEST_BUILD_DIR}/CPM_modules/FindB.cmake) ASSERT_NOT_EXISTS(${TEST_BUILD_DIR}/CPM_modules/FindB.cmake)
init_project_with_dependency(B) initProjectWithDependency(B)
assert_not_exists(${TEST_BUILD_DIR}/CPM_modules/FindA.cmake) ASSERT_NOT_EXISTS(${TEST_BUILD_DIR}/CPM_modules/FindA.cmake)
assert_exists(${TEST_BUILD_DIR}/CPM_modules/FindB.cmake) ASSERT_EXISTS(${TEST_BUILD_DIR}/CPM_modules/FindB.cmake)

View File

@@ -1,18 +1,17 @@
include(CMakePackageConfigHelpers) include(CMakePackageConfigHelpers)
include(${CPM_PATH}/testing.cmake) include(${CPM_PATH}/testing.cmake)
set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/package-lock) set(TEST_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/package-lock)
function(configure_with_declare DECLARE_DEPENDENCY) function(configureWithDeclare DECLARE_DEPENDENCY)
execute_process(COMMAND ${CMAKE_COMMAND} -E rm -rf ${TEST_BUILD_DIR}) execute_process(COMMAND ${CMAKE_COMMAND} -E rm -rf ${TEST_BUILD_DIR})
if(DECLARE_DEPENDENCY) if (DECLARE_DEPENDENCY)
set(PREPARE_CODE set(PREPARE_CODE "CPMDeclarePackage(Dependency
"CPMDeclarePackage(Dependency NAME Dependency
NAME Dependency
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/local_dependency/dependency SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/local_dependency/dependency
)" )")
)
else() else()
set(PREPARE_CODE "") set(PREPARE_CODE "")
endif() endif()
@@ -24,30 +23,27 @@ function(configure_with_declare DECLARE_DEPENDENCY)
) )
execute_process( execute_process(
COMMAND ${CMAKE_COMMAND} -H${CMAKE_CURRENT_LIST_DIR}/local_dependency -B${TEST_BUILD_DIR} COMMAND ${CMAKE_COMMAND} -H${CMAKE_CURRENT_LIST_DIR}/local_dependency -B${TEST_BUILD_DIR} -DCPM_INCLUDE_ALL_IN_PACKAGE_LOCK=1
-DCPM_INCLUDE_ALL_IN_PACKAGE_LOCK=1 RESULT_VARIABLE ret RESULT_VARIABLE ret
) )
assert_equal(${ret} "0") ASSERT_EQUAL(${ret} "0")
endfunction() endfunction()
function(update_package_lock) function(updatePackageLock)
execute_process( execute_process(
COMMAND ${CMAKE_COMMAND} --build ${TEST_BUILD_DIR} --target cpm-update-package-lock COMMAND ${CMAKE_COMMAND} --build ${TEST_BUILD_DIR} --target cpm-update-package-lock
RESULT_VARIABLE ret RESULT_VARIABLE ret
) )
assert_equal(${ret} "0") ASSERT_EQUAL(${ret} "0")
endfunction() endfunction()
execute_process( execute_process(COMMAND ${CMAKE_COMMAND} -E rm -f ${CMAKE_CURRENT_LIST_DIR}/local_dependency/package-lock.cmake)
COMMAND ${CMAKE_COMMAND} -E rm -f ${CMAKE_CURRENT_LIST_DIR}/local_dependency/package-lock.cmake configureWithDeclare(YES)
) ASSERT_NOT_EXISTS(${CMAKE_CURRENT_LIST_DIR}/local_dependency/package-lock.cmake)
configure_with_declare(YES) updatePackageLock()
assert_not_exists(${CMAKE_CURRENT_LIST_DIR}/local_dependency/package-lock.cmake) ASSERT_EXISTS(${CMAKE_CURRENT_LIST_DIR}/local_dependency/package-lock.cmake)
update_package_lock() configureWithDeclare(NO)
assert_exists(${CMAKE_CURRENT_LIST_DIR}/local_dependency/package-lock.cmake) execute_process(COMMAND ${CMAKE_COMMAND} -E rm -f ${CMAKE_CURRENT_LIST_DIR}/local_dependency/package-lock.cmake)
configure_with_declare(NO)
execute_process(
COMMAND ${CMAKE_COMMAND} -E rm -f ${CMAKE_CURRENT_LIST_DIR}/local_dependency/package-lock.cmake
)

View File

@@ -1,42 +0,0 @@
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
include(${CPM_PATH}/CPM.cmake)
include(${CPM_PATH}/testing.cmake)
# cmake-format: off
cpm_prettify_package_arguments(PRETTY_ARGN false
NAME Dependency
SOURCE_DIR ${CMAKE_SOURCE_DIR}/local_dependency/dependency
UPDATE_DISCONNECTED ON
TESTCUSTOMDATA TRUE
)
# cmake-format: on
set(EXPECTED_UNCOMMENTED
" NAME Dependency
SOURCE_DIR \${CMAKE_SOURCE_DIR}/local_dependency/dependency
UPDATE_DISCONNECTED ON TESTCUSTOMDATA TRUE
"
)
assert_equal(${PRETTY_ARGN} ${EXPECTED_UNCOMMENTED})
# cmake-format: off
cpm_prettify_package_arguments(PRETTY_ARGN true
NAME Dependency
SOURCE_DIR ${CMAKE_SOURCE_DIR}/local_dependency/dependency
UPDATE_DISCONNECTED ON
TESTCUSTOMDATA TRUE
)
# cmake-format: on
set(EXPECTED_COMMENTED
"# NAME Dependency
# SOURCE_DIR \${CMAKE_SOURCE_DIR}/local_dependency/dependency
# UPDATE_DISCONNECTED ON TESTCUSTOMDATA TRUE
"
)
assert_equal(${PRETTY_ARGN} ${EXPECTED_COMMENTED})
cpm_prettify_package_arguments(PRETTY_ARGN true "local directory")
set(EXPECTED_COMMENTED_LOCALDIR "# local directory
"
)
assert_equal(${PRETTY_ARGN} ${EXPECTED_COMMENTED_LOCALDIR})

View File

@@ -1,3 +1,4 @@
include(CMakePackageConfigHelpers) include(CMakePackageConfigHelpers)
include(${CPM_PATH}/testing.cmake) include(${CPM_PATH}/testing.cmake)
@@ -12,9 +13,8 @@ configure_package_config_file(
) )
execute_process( execute_process(
COMMAND ${CMAKE_COMMAND} -H${CMAKE_CURRENT_LIST_DIR}/local_dependency -B${TEST_BUILD_DIR} COMMAND ${CMAKE_COMMAND} -H${CMAKE_CURRENT_LIST_DIR}/local_dependency -B${TEST_BUILD_DIR} -DCPM_Dependency_SOURCE=${CMAKE_CURRENT_LIST_DIR}/local_dependency/dependency
-DCPM_Dependency_SOURCE=${CMAKE_CURRENT_LIST_DIR}/local_dependency/dependency
RESULT_VARIABLE ret RESULT_VARIABLE ret
) )
assert_equal(${ret} "0") ASSERT_EQUAL(${ret} "0")

View File

@@ -1,28 +0,0 @@
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
include(${CPM_PATH}/CPM.cmake)
include(${CPM_PATH}/testing.cmake)
cpm_package_name_from_git_uri("https://github.com/cpm-cmake/CPM.cmake.git" name)
assert_equal("CPM.cmake" ${name})
cpm_package_name_from_git_uri("ssh://user@host.xz:123/path/to/pkg.git/" name)
assert_equal("pkg" ${name})
cpm_package_name_from_git_uri("git://host.xz/path/to/pkg.git" name)
assert_equal("pkg" ${name})
cpm_package_name_from_git_uri("git@host.xz:cool-pkg.git" name)
assert_equal("cool-pkg" ${name})
cpm_package_name_from_git_uri("file:///path/to/pkg33.git" name)
assert_equal("pkg33" ${name})
cpm_package_name_from_git_uri("../local-repo/.git" name)
assert_equal("local-repo" ${name})
cpm_package_name_from_git_uri("asdf" name)
assert_not_defined(name)
cpm_package_name_from_git_uri("/something.git/stuff" name)
assert_not_defined(name)

View File

@@ -22,11 +22,3 @@ CPMAddPackage(
add_executable(CPMExampleCatch2 main.cpp) add_executable(CPMExampleCatch2 main.cpp)
target_link_libraries(CPMExampleCatch2 fibonacci) target_link_libraries(CPMExampleCatch2 fibonacci)
set_target_properties(CPMExampleCatch2 PROPERTIES CXX_STANDARD 17 COMPILE_FLAGS "-Wall -pedantic -Wextra -Werror") set_target_properties(CPMExampleCatch2 PROPERTIES CXX_STANDARD 17 COMPILE_FLAGS "-Wall -pedantic -Wextra -Werror")
# ---- Check parameters ----
include(@CPM_PATH@/testing.cmake)
ASSERT_TRUTHY(fibonacci_ADDED)
ASSERT_DEFINED(fibonacci_SOURCE_DIR)
ASSERT_DEFINED(fibonacci_BINARY_DIR)

View File

@@ -1,10 +1,9 @@
#define CATCH_CONFIG_MAIN #define CATCH_CONFIG_MAIN
#include <fibonacci.h> #include <fibonacci.h>
#include <iostream> #include <iostream>
int main() { int main(){
std::cout << "fib(10) = " << fastFibonacci(10) << std::endl; std::cout << "fib(10) = " << fastFibonacci(10) << std::endl;
return 0; return 0;
} }

View File

@@ -1,3 +1,4 @@
include(CMakePackageConfigHelpers) include(CMakePackageConfigHelpers)
include(${CPM_PATH}/testing.cmake) include(${CPM_PATH}/testing.cmake)
@@ -12,8 +13,9 @@ configure_package_config_file(
) )
execute_process( execute_process(
COMMAND ${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/local_dependency" "-B${TEST_BUILD_DIR}" COMMAND
${CMAKE_COMMAND} "-H${CMAKE_CURRENT_LIST_DIR}/local_dependency" "-B${TEST_BUILD_DIR}"
RESULT_VARIABLE ret RESULT_VARIABLE ret
) )
assert_equal(${ret} "0") ASSERT_EQUAL(${ret} "0")

View File

@@ -3,14 +3,14 @@ cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
include(${CPM_PATH}/CPM.cmake) include(${CPM_PATH}/CPM.cmake)
include(${CPM_PATH}/testing.cmake) include(${CPM_PATH}/testing.cmake)
cpm_get_version_from_git_tag("1.2.3" VERSION) CPM_GET_VERSION_FROM_GIT_TAG("1.2.3" VERSION)
assert_equal("1.2.3" ${VERSION}) ASSERT_EQUAL("1.2.3" ${VERSION})
cpm_get_version_from_git_tag("v1.2.3" VERSION) CPM_GET_VERSION_FROM_GIT_TAG("v1.2.3" VERSION)
assert_equal("1.2.3" ${VERSION}) ASSERT_EQUAL("1.2.3" ${VERSION})
cpm_get_version_from_git_tag("1.2.3-a" VERSION) CPM_GET_VERSION_FROM_GIT_TAG("1.2.3-a" VERSION)
assert_equal("1.2.3" ${VERSION}) ASSERT_EQUAL("1.2.3" ${VERSION})
cpm_get_version_from_git_tag("v1.2.3-a" VERSION) CPM_GET_VERSION_FROM_GIT_TAG("v1.2.3-a" VERSION)
assert_equal("1.2.3" ${VERSION}) ASSERT_EQUAL("1.2.3" ${VERSION})