Versions tested: from 1.79.0 upto 1.86.0 .
- Add CPM.cmake in your project somehow (or if you know how, use ExternalProject or FetchContent).
- Download
AddBoost.CMake
:
CPMAddPackage(
NAME AddBoost.CMake
GIT_TAG 3.3
GITHUB_REPOSITORY Arniiiii/AddBoost.cmake
)
- Use the
add_boost
macro. Notice NOT wrapping variables TRY_BOOST_VERSION and so on 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;python")
set(BOOST_HEADER_ONLY_COMPONENTS_THAT_YOU_NEED "asio;uuid")
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
${boost_install_targets}
):
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 1)
CPMAddPackage(
NAME PackageProject.cmake
VERSION 1.11.2
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}"
)
- Find local Boost
- Download boost if there's local Boost with lower version than needed or if local 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, 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 setting them before calling function.
- Well tested at Arniiiii/ModernCppStarterExampleBoostCmake
- You can apply your options or by setting it by your self, or by setting
BOOST_MY_OPTIONS
to something like"OPTION value;OPTION2 value;"
for exampleBOOST_ENABLE_PYTHON ON;
. - If you have your own Boost directory, set
BOOST_USE_MY_BOOST_DIRECTORY
to be the path with your Boost. - If you want, you can link Boost libs yourself, since the code is macro, not a function.
- You can link Boost libs automagically to multiple targets just by adding them to the end of the
addboost(...)
macro. - You can use
ADDBOOSTCMAKE_LINK_TYPE
to override default behaviour of linking: if target is INTERFACE, use INTERFACE, if else: PUBLIC - You can apply your patches to Boost. Define variable
BOOST_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