mirror of
https://github.com/cpm-cmake/CPM.cmake.git
synced 2025-11-20 13:17:53 -05:00
Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
aeef56ea85 | ||
|
|
4271d5981f | ||
|
|
d17500b0be | ||
|
|
5e0c3855c7 | ||
|
|
f96cff720e | ||
|
|
c3c7e2d9a3 | ||
|
|
30b98af416 | ||
|
|
5063c7d992 | ||
|
|
3cfb309f3c | ||
|
|
25603ac4ad |
11
.github/workflows/publish.yaml
vendored
11
.github/workflows/publish.yaml
vendored
@@ -11,11 +11,18 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
|
||||
- name: Set CPM version by tag
|
||||
run: |
|
||||
mkdir dist
|
||||
sed "s/0.27.2-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/get_cpm.cmake > dist/get_cpm.cmake
|
||||
|
||||
- name: Upload CPM.cmake to release
|
||||
uses: svenstaro/upload-release-action@v1-release
|
||||
with:
|
||||
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
file: cmake/CPM.cmake
|
||||
asset_name: CPM.cmake
|
||||
tag: ${{ github.ref }}
|
||||
file: dist/*.cmake
|
||||
file_glob: true
|
||||
overwrite: true
|
||||
|
||||
78
README.md
78
README.md
@@ -1,7 +1,7 @@
|
||||
[](https://travis-ci.com/TheLartians/CPM.cmake)
|
||||
[](https://github.com/TheLartians/CPM.cmake/actions)
|
||||
[](https://github.com/TheLartians/CPM.cmake/actions)
|
||||
[](https://github.com/TheLartians/CPM.cmake/actions)
|
||||
[](https://github.com/TheLartians/CPM.cmake/actions) [](https://gitter.im/TheLartians/CPM.cmake?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||
|
||||
<p align="center">
|
||||
<img src="./logo/CPM.png" height="100" />
|
||||
@@ -10,7 +10,7 @@
|
||||
# Setup-free CMake dependency management
|
||||
|
||||
CPM.cmake is a CMake script that adds dependency management capabilities to CMake.
|
||||
It's built as a thin wrapper around CMake's [FetchContent](https://cmake.org/cmake/help/latest/module/FetchContent.html) module that adds version control, caching and a simple API.
|
||||
It's built as a thin wrapper around CMake's [FetchContent](https://cmake.org/cmake/help/latest/module/FetchContent.html) module that adds version control, caching, a simple API [and more](#comparison-to-pure-fetchcontent--externalproject).
|
||||
|
||||
## Manage everything
|
||||
|
||||
@@ -49,6 +49,8 @@ After calling `CPMAddPackage` or `CPMFindPackage`, the following variables are d
|
||||
The difference between `CPMFindPackage` and `CPMAddPackage` is that `CPMFindPackage` will try to find a local dependency via CMake's `find_package` and fallback to `CPMAddPackage` if the dependency is not found.
|
||||
This behaviour can be also modified globally via [CPM options](#options).
|
||||
|
||||
See [this medium article](https://medium.com/swlh/cpm-an-awesome-dependency-manager-for-c-with-cmake-3c53f4376766) for a short tutorial on using CPM.cmake.
|
||||
|
||||
## Full CMakeLists Example
|
||||
|
||||
```cmake
|
||||
@@ -73,18 +75,19 @@ CPMAddPackage(
|
||||
target_link_libraries(tests Catch2)
|
||||
```
|
||||
|
||||
See the [examples directory](https://github.com/TheLartians/CPM.cmake/tree/master/examples) for complete examples with source code or the [wiki](https://github.com/TheLartians/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
|
||||
|
||||
To add CPM to your current project, simply add `cmake/CPM.cmake` to your project's `cmake` directory. The command below will perform this automatically.
|
||||
To add CPM to your current project, simply add the [latest release](https://github.com/TheLartians/CPM.cmake/releases/latest) of `CPM.cmake` or `get_cpm.cmake` to your project's `cmake` directory.
|
||||
The command below will perform this automatically.
|
||||
|
||||
```bash
|
||||
mkdir -p cmake
|
||||
wget -O cmake/CPM.cmake https://github.com/TheLartians/CPM.cmake/releases/latest/download/CPM.cmake
|
||||
wget -O cmake/CPM.cmake https://github.com/TheLartians/CPM.cmake/releases/latest/download/get_cpm.cmake
|
||||
```
|
||||
|
||||
You can also use CMake to download CPM for you. See the [wiki](https://github.com/TheLartians/CPM.cmake/wiki/Downloading-CPM.cmake-in-CMake) for more details.
|
||||
You can also download CPM.cmake directly from your project's `CMakeLists.txt`. See the [wiki](https://github.com/TheLartians/CPM.cmake/wiki/Downloading-CPM.cmake-in-CMake) for more details.
|
||||
|
||||
## Updating CPM
|
||||
|
||||
@@ -111,6 +114,33 @@ For projects with more complex needs and where an extra setup step doesn't matte
|
||||
Dependencies added with `CPMFindPackage` should work with external package managers.
|
||||
Additionally, the option [`CPM_USE_LOCAL_PACKAGES`](#cpmuselocalpackages) will enable `find_package` for all CPM dependencies.
|
||||
|
||||
## Comparison to FindPackage
|
||||
|
||||
The usual way to add libraries in CMake projects is to call `find_package(<PackageName>)` and to link against libraries defined in a `<PackageName>_LIBRARIES` variable.
|
||||
While simple, this may lead to unpredictable builds, as it requires the library to be installed on the system and it is unclear which version of the library has been added.
|
||||
Additionally, it is difficult to cross-compile projects (e.g. for mobile), as the dependencies will need to be rebuilt manually for each targeted architecture.
|
||||
|
||||
CPM.cmake allows dependencies to be unambiguously defined and builds them from source.
|
||||
Note that the behaviour differs from `find_package`, as variables exported to the parent scope (such as `<PackageName>_LIBRARIES`) will not be visible after adding a package using CPM.cmake.
|
||||
The behaviour can be [achieved manually](https://github.com/TheLartians/CPM.cmake/issues/132#issuecomment-644955140), if required.
|
||||
|
||||
## Comparison to pure FetchContent / ExternalProject
|
||||
|
||||
CPM.cmake is a wrapper for CMake's FetchContent module and adds a number of features that turn it into a useful dependency manager.
|
||||
The most notable features are:
|
||||
|
||||
- A simpler to use API
|
||||
- Version checking: CPM.cmake will check the version number of any added dependency and omit a warning if another dependency requires a more recent version.
|
||||
- Options: any Options passed to a dependency are stored and compared on later use, so if another dependency tries to add an existing dependency with incompatible options a warning will be emitted to the user.
|
||||
- Offline builds: CPM.cmake will override CMake's download and update commands, which allows new builds to be configured while offline if all dependencies [are available locally](#cpm_source_cache).
|
||||
- Automatic shallow clone: if a version tag (e.g. `v2.2.0`) is provided and `CPM_SOURCE_CACHE` is used, CPM.cmake will perform a shallow clone of the dependency, which should be significantly faster while using less storage than a full clone.
|
||||
- Overridable: all `CPMAddPackage` can be configured to use `find_package` by setting a [CMake flag](#cpm_use_local_packages), making it easy to integrate into projects that may require local versioning through the system's package manager.
|
||||
- [Package lock files](#package-lock) for easier transitive dependency management.
|
||||
- Dependencies can be overridden [per-build](#local-package-override) using CMake CLI parameters.
|
||||
|
||||
ExternalProject works similarly as FetchContent, however waits with adding dependencies until build time.
|
||||
This has a quite a few disadvantages, especially as it makes using custom toolchains / cross-compiling very difficult and can lead to problems with nested dependencies.
|
||||
|
||||
## Options
|
||||
|
||||
### CPM_SOURCE_CACHE
|
||||
@@ -166,6 +196,41 @@ cmake --build build --target cpm-update-package-lock
|
||||
|
||||
See the [wiki](https://github.com/TheLartians/CPM.cmake/wiki/Package-lock) for more info.
|
||||
|
||||
|
||||
## Built with CPM.cmake
|
||||
|
||||
Some amazing projects that are built using the CPM.cmake package manager.
|
||||
If you know others, feel free to add them here through a PR.
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<a href="https://otto-project.github.io">
|
||||
<p align="center">
|
||||
<img src="https://avatars2.githubusercontent.com/u/40357059?s=200&v=4" alt="otto-project" height=100pt width=100pt />
|
||||
</p>
|
||||
<p align="center"><b>OTTO - The Open Source GrooveBox</b></p>
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="https://maphi.app">
|
||||
<p align="center">
|
||||
<img src="https://user-images.githubusercontent.com/4437447/89892751-71af8000-dbd7-11ea-9d87-4fe107845069.png" alt="maphi" height=100pt width=100pt />
|
||||
</p>
|
||||
<p align="center"><b>Maphi - the Math App</b></p>
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="https://github.com/TheLartians/ModernCppStarter">
|
||||
<p align="center">
|
||||
<img src="https://repository-images.githubusercontent.com/254842585/4dfa7580-7ffb-11ea-99d0-46b8fe2f4170" alt="modern-cpp-starter" height=100pt width=200pt />
|
||||
</p>
|
||||
<p align="center"><b>ModernCppStarter</b></p>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
## Snippets
|
||||
|
||||
These examples demonstrate how to include some well-known projects with CPM.
|
||||
@@ -286,6 +351,7 @@ if (lua_ADDED)
|
||||
# lua has no CMake support, so we create our own target
|
||||
|
||||
FILE(GLOB lua_sources ${lua_SOURCE_DIR}/*.c)
|
||||
list(REMOVE_ITEM lua_sources "${lua_SOURCE_DIR}/lua.c" "${lua_SOURCE_DIR}/luac.c")
|
||||
add_library(lua STATIC ${lua_sources})
|
||||
|
||||
target_include_directories(lua
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
set(CURRENT_CPM_VERSION 0.27.2)
|
||||
set(CURRENT_CPM_VERSION 0.27.2-development-version)
|
||||
|
||||
if(CPM_DIRECTORY)
|
||||
if(NOT CPM_DIRECTORY STREQUAL CMAKE_CURRENT_LIST_DIR)
|
||||
@@ -252,6 +252,7 @@ function(CPMAddPackage)
|
||||
NAME ${CPM_ARGS_NAME}
|
||||
SOURCE_DIR ${PACKAGE_SOURCE}
|
||||
FORCE True
|
||||
OPTIONS ${CPM_ARGS_OPTIONS}
|
||||
)
|
||||
cpm_export_variables(${CPM_ARGS_NAME})
|
||||
return()
|
||||
|
||||
19
cmake/get_cpm.cmake
Normal file
19
cmake/get_cpm.cmake
Normal file
@@ -0,0 +1,19 @@
|
||||
set(CPM_DOWNLOAD_VERSION 0.27.2-development-version)
|
||||
|
||||
if(CPM_SOURCE_CACHE)
|
||||
set(CPM_DOWNLOAD_LOCATION "${CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
|
||||
elseif(DEFINED ENV{CPM_SOURCE_CACHE})
|
||||
set(CPM_DOWNLOAD_LOCATION "$ENV{CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
|
||||
else()
|
||||
set(CPM_DOWNLOAD_LOCATION "${CMAKE_BINARY_DIR}/cmake/CPM_${CPM_DOWNLOAD_VERSION}.cmake")
|
||||
endif()
|
||||
|
||||
if(NOT (EXISTS ${CPM_DOWNLOAD_LOCATION}))
|
||||
message(STATUS "Downloading CPM.cmake to ${CPM_DOWNLOAD_LOCATION}")
|
||||
file(DOWNLOAD
|
||||
https://github.com/TheLartians/CPM.cmake/releases/download/v${CPM_DOWNLOAD_VERSION}/CPM.cmake
|
||||
${CPM_DOWNLOAD_LOCATION}
|
||||
)
|
||||
endif()
|
||||
|
||||
include(${CPM_DOWNLOAD_LOCATION})
|
||||
@@ -17,6 +17,7 @@ if (lua_ADDED)
|
||||
# lua has no CMakeLists, so we create our own target
|
||||
|
||||
FILE(GLOB lua_sources ${lua_SOURCE_DIR}/*.c)
|
||||
list(REMOVE_ITEM lua_sources "${lua_SOURCE_DIR}/lua.c" "${lua_SOURCE_DIR}/luac.c")
|
||||
add_library(lua STATIC ${lua_sources})
|
||||
|
||||
target_include_directories(lua
|
||||
|
||||
19
examples/spdlog/CMakeLists.txt
Normal file
19
examples/spdlog/CMakeLists.txt
Normal file
@@ -0,0 +1,19 @@
|
||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||
|
||||
project(CPMSpdlogExample)
|
||||
|
||||
# ---- Dependencies ----
|
||||
|
||||
include(../../cmake/CPM.cmake)
|
||||
|
||||
CPMAddPackage(
|
||||
NAME spdlog
|
||||
GITHUB_REPOSITORY gabime/spdlog
|
||||
VERSION 1.7.0
|
||||
)
|
||||
|
||||
# ---- Executable ----
|
||||
|
||||
add_executable(CPMSpdlogExample "main.cpp")
|
||||
set_target_properties(CPMSpdlogExample PROPERTIES CXX_STANDARD 17)
|
||||
target_link_libraries(CPMSpdlogExample spdlog)
|
||||
6
examples/spdlog/main.cpp
Normal file
6
examples/spdlog/main.cpp
Normal file
@@ -0,0 +1,6 @@
|
||||
#include <spdlog/spdlog.h>
|
||||
|
||||
int main() {
|
||||
spdlog::info("Hello, world!");
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user