mirror of
https://github.com/cpm-cmake/CPM.cmake.git
synced 2025-11-24 13:18:07 -05:00
Update README.md (#64)
* Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md
This commit is contained in:
39
README.md
39
README.md
@@ -4,25 +4,26 @@
|
|||||||
<img src="./logo/CPM.png" height="100" />
|
<img src="./logo/CPM.png" height="100" />
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
# CPM
|
# Setup-free CMake dependency management
|
||||||
|
|
||||||
CPM is a CMake script that adds dependency management capabilities to CMake.
|
CPM is a CMake script that adds dependency management capabilities to CMake.
|
||||||
It's built as an extension of CMake's [FetchContent](https://cmake.org/cmake/help/latest/module/FetchContent.html) module that adds version control and simpler usage.
|
It's built as a wrapper around CMake's [FetchContent](https://cmake.org/cmake/help/latest/module/FetchContent.html) module that adds version control and a simple API.
|
||||||
|
|
||||||
## Supported projects
|
## Manage everything
|
||||||
|
|
||||||
Any project that you can add via `add_subdirectory` should already work with CPM.
|
Anything can be added as a version-controlled dependency though CPM, no packaging required.
|
||||||
For everything else, targets must be created manually (see below).
|
Projects using CMake are automatically configured and their targets can be used immediately.
|
||||||
|
For everything else, a target can be created manually (see below).
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
After `CPM.cmake` has been added to your project, the function `CPMAddPackage` can be used to fetch and configure all dependencies.
|
After `CPM.cmake` has been added to your project, the function `CPMAddPackage` can be used to fetch and configure a dependency.
|
||||||
Afterwards all targets defined in the dependencies can be used.
|
Afterwards, any targets defined in the dependency can be used directly.
|
||||||
`CPMAddPackage` takes the following named arguments.
|
`CPMAddPackage` takes the following named paramters.
|
||||||
|
|
||||||
```cmake
|
```cmake
|
||||||
CPMAddPackage(
|
CPMAddPackage(
|
||||||
NAME # The unique name of the dependency (usually the main target's name)
|
NAME # The unique name of the dependency (should be the main target's name)
|
||||||
VERSION # The minimum version of the dependency (optional, defaults to 0)
|
VERSION # The minimum version of the dependency (optional, defaults to 0)
|
||||||
OPTIONS # Configuration options passed to the dependency (optional)
|
OPTIONS # Configuration options passed to the dependency (optional)
|
||||||
DOWNLOAD_ONLY # If set, the project is downloaded, but not configured (optional)
|
DOWNLOAD_ONLY # If set, the project is downloaded, but not configured (optional)
|
||||||
@@ -30,9 +31,9 @@ CPMAddPackage(
|
|||||||
)
|
)
|
||||||
```
|
```
|
||||||
|
|
||||||
The origin is usually specified by a `GIT_REPOSITORY`, but [svn revisions and 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 github projects.
|
If `GIT_TAG` hasn't been explicitly specified it defaults to `v(VERSION)`, a common convention for git projects.
|
||||||
`GIT_TAG` can also be set to a branch name such as `master` to download the most recent version.
|
`GIT_TAG` can also be set to a specific commit or a branch name such as `master` to download the most recent version.
|
||||||
|
|
||||||
Besides downloading and to configuring the dependency, the following variables are defined in the local scope, where `(DEPENDENCY)` is the name of the dependency.
|
Besides downloading and to configuring the dependency, the following variables are defined in the local scope, where `(DEPENDENCY)` is the name of the dependency.
|
||||||
|
|
||||||
@@ -40,7 +41,7 @@ Besides downloading and to configuring the dependency, the following variables a
|
|||||||
- `(DEPENDENCY)_BINARY_DIR` is the path to the build directory of the dependency.
|
- `(DEPENDENCY)_BINARY_DIR` is the path to the build directory of the dependency.
|
||||||
- `(DEPENDENCY)_ADDED` is set to `YES` if the dependency has not been added before, otherwise it is set to `NO`.
|
- `(DEPENDENCY)_ADDED` is set to `YES` if the dependency has not been added before, otherwise it is set to `NO`.
|
||||||
|
|
||||||
## Full Example
|
## Full CMakeLists Example
|
||||||
|
|
||||||
```cmake
|
```cmake
|
||||||
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
||||||
@@ -48,6 +49,10 @@ cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
|
|||||||
# create project
|
# create project
|
||||||
project(MyProject)
|
project(MyProject)
|
||||||
|
|
||||||
|
# add executable
|
||||||
|
add_executable(myProject myProject.cpp)
|
||||||
|
set_target_properties(myProject PROPERTIES CXX_STANDARD 17)
|
||||||
|
|
||||||
# add dependencies
|
# add dependencies
|
||||||
include(cmake/CPM.cmake)
|
include(cmake/CPM.cmake)
|
||||||
|
|
||||||
@@ -59,9 +64,6 @@ CPMAddPackage(
|
|||||||
"LARS_PARSER_BUILD_GLUE_EXTENSION ON"
|
"LARS_PARSER_BUILD_GLUE_EXTENSION ON"
|
||||||
)
|
)
|
||||||
|
|
||||||
# add executable
|
|
||||||
add_executable(myProject myProject.cpp)
|
|
||||||
set_target_properties(myProject PROPERTIES CXX_STANDARD 17)
|
|
||||||
target_link_libraries(myProject LarsParser)
|
target_link_libraries(myProject LarsParser)
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -82,7 +84,7 @@ To update CPM to the newest version, simply update the script in the project's c
|
|||||||
|
|
||||||
## Advantages
|
## Advantages
|
||||||
|
|
||||||
- **Small and reusable projects** CPM takes care of project dependencies, no matter where they reside, allowing developers to focus on creating small, well-tested frameworks.
|
- **Small and reusable projects** CPM takes care of all project dependencies, allowing developers to focus on creating small, well-tested frameworks.
|
||||||
- **Cross-Plattform** CPM adds projects via `add_subdirectory`, which is compatible with all cmake toolchains and generators.
|
- **Cross-Plattform** CPM adds projects via `add_subdirectory`, which is compatible with all cmake toolchains and generators.
|
||||||
- **Reproducable builds** By using versioning via git tags it is ensured that a project will always be in the same state everywhere.
|
- **Reproducable builds** By using versioning via git tags it is ensured that a project will always be in the same state everywhere.
|
||||||
- **Recursive dependencies** Ensures that no dependency is added twice and is added in the minimum required version.
|
- **Recursive dependencies** Ensures that no dependency is added twice and is added in the minimum required version.
|
||||||
@@ -97,11 +99,12 @@ To update CPM to the newest version, simply update the script in the project's c
|
|||||||
- **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 an error. This can be resolved by updating the outermost dependency version.
|
- **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 an error. This can be resolved by updating the outermost dependency version.
|
||||||
|
|
||||||
For projects with more complex needs and where an extra setup step doesn't matter, it is worth to check out fully featured C++ package managers such as [conan](https://conan.io), [vcpkg](https://github.com/microsoft/vcpkg) or [hunter](https://github.com/ruslo/hunter).
|
For projects with more complex needs and where an extra setup step doesn't matter, it is worth to check out fully featured C++ package managers such as [conan](https://conan.io), [vcpkg](https://github.com/microsoft/vcpkg) or [hunter](https://github.com/ruslo/hunter).
|
||||||
|
Support for package managers is also [planned](https://github.com/TheLartians/CPM/issues/51) for a future version of CPM.
|
||||||
|
|
||||||
## Local packages
|
## Local packages
|
||||||
|
|
||||||
CPM can be configured to use `find_package` to search for locally installed dependencies first by setting the CMake option `CPM_USE_LOCAL_PACKAGES`.
|
CPM can be configured to use `find_package` to search for locally installed dependencies first by setting the CMake option `CPM_USE_LOCAL_PACKAGES`.
|
||||||
If the option `CPM_LOCAL_PACKAGES_ONLY` is set, CPM will emit an error when dependency is not found locally.
|
If the option `CPM_LOCAL_PACKAGES_ONLY` is set, CPM will emit an error if the dependency is not found locally.
|
||||||
|
|
||||||
## Snipplets
|
## Snipplets
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user