Versions tested: from 1.79.0 upto 1.86.0 .
- Add CPM.cmake in your project.
- Download
AddBoost.CMake
via CPM:
CPMAddPackage(
NAME AddBoost.CMake
GIT_TAG 3.3
GITHUB_REPOSITORY Arniiiii/AddBoost.cmake
)
- Use the
add_boost
macro. Notice NOT wrapping variables like TRY_BOOST_VERSION and so on in${}
when sending arguments to the macro
set(TRY_BOOST_VERSION "1.86.0")
set(BOOST_MY_OPTIONS "BOOST_ENABLE_PYTHON ON;")
set(BOOST_NOT_HEADER_ONLY_COMPONENTS_THAT_YOU_NEED "thread;system")
set(BOOST_HEADER_ONLY_COMPONENTS_THAT_YOU_NEED "asio;beast;uuid;container;cobalt")
add_boost(
TRY_BOOST_VERSION BOOST_HEADER_ONLY_COMPONENTS_THAT_YOU_NEED
BOOST_NOT_HEADER_ONLY_COMPONENTS_THAT_YOU_NEED your_target_name your_target_name2 your_target_name...
)
- Add Boost's install target (notice
${ADDBOOSTCMAKE_PACKAGEPROJECT_INSTALL_TARGETS}
): (Assumed that your target is named${PROJECT_NAME}
)
string(TOLOWER ${PROJECT_NAME}/version.h VERSION_HEADER_LOCATION)
string(TOLOWER ${PROJECT_NAME}/export.h EXPORT_HEADER_LOCATION)
set_property(TARGET ${PROJECT_NAME} PROPERTY VERSION ${PROJECT_VERSION})
set_property(TARGET ${PROJECT_NAME} PROPERTY SOVERSION ${PROJECT_VERSION})
CPMAddPackage(
NAME PackageProject.cmake
VERSION 1.12.0
GITHUB_REPOSITORY "TheLartians/PackageProject.cmake"
)
packageProject(
NAME ${PROJECT_NAME}
VERSION ${PROJECT_VERSION}
NAMESPACE ${PROJECT_NAME}
BINARY_DIR ${PROJECT_BINARY_DIR}
INCLUDE_DIR ${PROJECT_SOURCE_DIR}/include
INCLUDE_DESTINATION include/${PROJECT_NAME}
VERSION_HEADER "${VERSION_HEADER_LOCATION}"
EXPORT_HEADER "${EXPORT_HEADER_LOCATION}"
COMPATIBILITY "AnyNewerVersion" DISABLE_VERSION_SUFFIX ON
DEPENDENCIES "${ADDBOOSTCMAKE_PACKAGEPROJECT_INSTALL_TARGETS}"
)
- Finds local Boost ( you can set
-DCPM_USE_LOCAL_PACKAGES=1
for "looking for local Boost. if failed: download" mode. Set-DCPM_LOCAL_PACKAGES_ONLY=1
to only look for installed Boost and emit error if failed to find) - Downloads boost, if
-DCPM_USE_LOCAL_PACKAGES=1
and there's installed Boost with lower version than needed or if installed Boost doesn't exist on the system or if-DCPM_DOWNLOAD_ALL=1
is set. - Links Boost to what targets you need by itself
- If you don't want to download Boost multiple times (when you deleted
build
folder and going to reconfigure), set-DCPM_SOURCE_CACHE=./.cache/cpm
or something like. - Gives appropriate string for you to add to
PackageProject.cmake
- Makes Boost generate appropriate install targets
- If you download Boost, you can add additional configuring options just by either setting them before calling
functionmacroadd_boost(...)
or by settingBOOST_MY_OPTIONS
to something like"OPTION value;OPTION2 value;"
for exampleBOOST_ENABLE_PYTHON ON;
. - Little bit tested at Arniiiii/ModernCppStarterExampleBoostCmake and at some of my projects.
- If you have your own Boost directory, set
BOOST_USE_MY_BOOST_DIRECTORY
to be the path with your Boost before calling thefunctionmacroadd_boost(...)
. - If you want, you can link Boost libs yourself, since the code is macro, not a function: copy and paste some last parts of the main CMakeLists.txt of the project and adjust for yourself.
- You can link Boost libs automagically to multiple targets just by adding them to the end of the
add_boost(...)
macro. - You can use
ADDBOOSTCMAKE_LINK_TYPE
to override default behaviour of linking: if target is INTERFACE, use INTERFACE, if else: PUBLIC - Internally, this uses my fork of CPM with better logging handling. Waiting until PRs for CPM are going to be reviewed...
- You can apply your patches to Boost. Before calling the
functionmacroadd_boost(...)
, define variableBOOST_ADD_MY_PATCHES
to be a path to folder in which there's*.patch
in such layout:
patches/
└── boost
├── 1.80.0
│ ├── a.patch
│ └── b.patch
├── 1.80.0.beta1
│ └── c.patch
├── 1.81.0
│ └── d.patch
├── 1.81.0.beta1
│ └── d.patch
├── 1.82.0
│ └── e.patch
├── 1.83.0
│ └── f.patch
├── 1.84.0
│ └── g.patch
├── patch_for_all_versions1.patch
└── i_dont_care_to_what_boost_version_itll_apply.patch
Where in folder with specific version will be patches, that will apply only to this version, if it's specified.
MIT