1# Copyright 2019, 2020 Peter Dimov 2# Distributed under the Boost Software License, Version 1.0. 3# See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt 4 5if(NOT CMAKE_VERSION VERSION_LESS 3.10) 6 include_guard() 7endif() 8 9include(BoostMessage) 10include(GNUInstallDirs) 11include(CMakePackageConfigHelpers) 12 13# Variables 14 15if(WIN32) 16 set(__boost_default_layout "versioned") 17else() 18 set(__boost_default_layout "system") 19endif() 20 21set(BOOST_INSTALL_LAYOUT ${__boost_default_layout} CACHE STRING "Installation layout (versioned, tagged, or system)") 22set_property(CACHE BOOST_INSTALL_LAYOUT PROPERTY STRINGS versioned tagged system) 23 24set(BOOST_INSTALL_LIBDIR "${CMAKE_INSTALL_LIBDIR}" CACHE STRING "Installation directory for library files") 25set(BOOST_INSTALL_CMAKEDIR "${BOOST_INSTALL_LIBDIR}/cmake" CACHE STRING "Installation directory for CMake configuration files") 26set(BOOST_INSTALL_INCLUDEDIR "${CMAKE_INSTALL_INCLUDEDIR}" CACHE STRING "Installation directory for header files") 27 28if(BOOST_INSTALL_LAYOUT STREQUAL "versioned") 29 set(BOOST_INSTALL_INCLUDEDIR "$CACHE{BOOST_INSTALL_INCLUDEDIR}/boost-${PROJECT_VERSION_MAJOR}_${PROJECT_VERSION_MINOR}") 30endif() 31 32# 33 34function(__boost_install_set_output_name LIB TYPE VERSION) 35 36 set(name_debug ${LIB}) 37 set(name_release ${LIB}) 38 39 # prefix 40 if(WIN32 AND TYPE STREQUAL "STATIC_LIBRARY") 41 set_target_properties(${LIB} PROPERTIES PREFIX "lib") 42 endif() 43 44 # toolset 45 if(BOOST_INSTALL_LAYOUT STREQUAL versioned) 46 47 string(TOLOWER ${CMAKE_CXX_COMPILER_ID} toolset) 48 49 if(toolset STREQUAL "msvc") 50 51 set(toolset "vc") 52 53 if(CMAKE_CXX_COMPILER_VERSION MATCHES "^([0-9]+)[.]([0-9]+)") 54 55 if(CMAKE_MATCH_1 GREATER 18) 56 math(EXPR major ${CMAKE_MATCH_1}-5) 57 else() 58 math(EXPR major ${CMAKE_MATCH_1}-6) 59 endif() 60 61 math(EXPR minor ${CMAKE_MATCH_2}/10) 62 63 string(APPEND toolset ${major}${minor}) 64 65 endif() 66 67 else() 68 69 if(toolset STREQUAL "gnu") 70 71 set(toolset "gcc") 72 73 elseif(toolset STREQUAL "clang") 74 75 if(MSVC) 76 set(toolset "clangw") 77 endif() 78 79 endif() 80 81 if(CMAKE_CXX_COMPILER_VERSION MATCHES "^([0-9]+)[.]") 82 string(APPEND toolset ${CMAKE_MATCH_1}) 83 endif() 84 85 endif() 86 87 string(APPEND name_debug "-${toolset}") 88 string(APPEND name_release "-${toolset}") 89 90 endif() 91 92 if(BOOST_INSTALL_LAYOUT STREQUAL versioned OR BOOST_INSTALL_LAYOUT STREQUAL tagged) 93 94 # threading 95 string(APPEND name_debug "-mt") 96 string(APPEND name_release "-mt") 97 98 # ABI tag 99 100 if(MSVC) 101 102 get_target_property(MSVC_RUNTIME_LIBRARY ${LIB} MSVC_RUNTIME_LIBRARY) 103 104 if(MSVC_RUNTIME_LIBRARY STREQUAL "MultiThreaded$<$<CONFIG:Debug>:Debug>") 105 106 string(APPEND name_debug "-sgd") 107 string(APPEND name_release "-s") 108 109 else() 110 111 string(APPEND name_debug "-gd") 112 113 endif() 114 115 else() 116 117 string(APPEND name_debug "-d") 118 119 endif() 120 121 # Arch and model 122 math(EXPR bits ${CMAKE_SIZEOF_VOID_P}*8) 123 124 string(APPEND name_debug "-x${bits}") # x86 only for now 125 string(APPEND name_release "-x${bits}") 126 127 endif() 128 129 if(BOOST_INSTALL_LAYOUT STREQUAL versioned) 130 131 string(REGEX REPLACE "^([0-9]+)[.]([0-9]+).*" "\\1_\\2" __ver ${VERSION}) 132 133 string(APPEND name_debug "-${__ver}") 134 string(APPEND name_release "-${__ver}") 135 136 endif() 137 138 set_target_properties(${LIB} PROPERTIES OUTPUT_NAME_DEBUG ${name_debug}) 139 set_target_properties(${LIB} PROPERTIES OUTPUT_NAME ${name_release}) 140 141 if(TYPE STREQUAL "STATIC_LIBRARY") 142 143 set_target_properties(${LIB} PROPERTIES COMPILE_PDB_NAME_DEBUG "${name_debug}") 144 set_target_properties(${LIB} PROPERTIES COMPILE_PDB_NAME "${name_release}") 145 146 endif() 147 148endfunction() 149 150function(__boost_install_update_include_directory lib incdir prop) 151 152 get_target_property(value ${lib} ${prop}) 153 154 if(value STREQUAL incdir) 155 156 set_target_properties(${lib} PROPERTIES ${prop} "$<BUILD_INTERFACE:${incdir}>;$<INSTALL_INTERFACE:${BOOST_INSTALL_INCLUDEDIR}>") 157 158 endif() 159 160endfunction() 161 162# Installs a single target 163# boost_install_target(TARGET target VERSION version [HEADER_DIRECTORY directory]) 164 165function(boost_install_target) 166 167 cmake_parse_arguments(_ "" "TARGET;VERSION;HEADER_DIRECTORY" "" ${ARGN}) 168 169 if(NOT __TARGET) 170 171 message(SEND_ERROR "boost_install_target: TARGET not given.") 172 return() 173 174 endif() 175 176 if(NOT __VERSION) 177 178 message(SEND_ERROR "boost_install_target: VERSION not given, but is required for installation.") 179 return() 180 181 endif() 182 183 set(LIB ${__TARGET}) 184 185 if(NOT __HEADER_DIRECTORY) 186 187 set(__HEADER_DIRECTORY "${PROJECT_SOURCE_DIR}/include") 188 189 endif() 190 191 get_target_property(TYPE ${LIB} TYPE) 192 193 __boost_install_update_include_directory(${LIB} "${__HEADER_DIRECTORY}" INTERFACE_INCLUDE_DIRECTORIES) 194 195 if(TYPE STREQUAL "STATIC_LIBRARY" OR TYPE STREQUAL "SHARED_LIBRARY") 196 197 __boost_install_update_include_directory(${LIB} "${__HEADER_DIRECTORY}" INCLUDE_DIRECTORIES) 198 199 get_target_property(OUTPUT_NAME ${LIB} OUTPUT_NAME) 200 201 if(NOT OUTPUT_NAME) 202 __boost_install_set_output_name(${LIB} ${TYPE} ${__VERSION}) 203 endif() 204 205 endif() 206 207 if(TYPE STREQUAL "SHARED_LIBRARY" OR TYPE STREQUAL "EXECUTABLE") 208 209 get_target_property(VERSION ${LIB} VERSION) 210 211 if(NOT VERSION) 212 set_target_properties(${LIB} PROPERTIES VERSION ${__VERSION}) 213 endif() 214 215 endif() 216 217 if(LIB MATCHES "^boost_(.*)$") 218 set_target_properties(${LIB} PROPERTIES EXPORT_NAME ${CMAKE_MATCH_1}) 219 endif() 220 221 set(CONFIG_INSTALL_DIR "${BOOST_INSTALL_CMAKEDIR}/${LIB}-${__VERSION}") 222 223 install(TARGETS ${LIB} EXPORT ${LIB}-targets DESTINATION ${BOOST_INSTALL_LIBDIR}) 224 225 if(WIN32 AND TYPE STREQUAL "SHARED_LIBRARY") 226 227 install(FILES $<TARGET_PDB_FILE:${LIB}> DESTINATION ${BOOST_INSTALL_LIBDIR} OPTIONAL) 228 229 endif() 230 231 if(WIN32 AND TYPE STREQUAL "STATIC_LIBRARY" AND NOT CMAKE_VERSION VERSION_LESS 3.15) 232 233 install(FILES "$<TARGET_FILE_DIR:${LIB}>/$<TARGET_FILE_PREFIX:${LIB}>$<TARGET_FILE_BASE_NAME:${LIB}>.pdb" DESTINATION ${BOOST_INSTALL_LIBDIR} OPTIONAL) 234 235 endif() 236 237 install(EXPORT ${LIB}-targets DESTINATION "${CONFIG_INSTALL_DIR}" NAMESPACE Boost:: FILE ${LIB}-targets.cmake) 238 239 set(CONFIG_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/tmpinst/${LIB}-config.cmake") 240 set(CONFIG_FILE_CONTENTS "# Generated by BoostInstall.cmake for ${LIB}-${__VERSION}\n\n") 241 242 get_target_property(INTERFACE_LINK_LIBRARIES ${LIB} INTERFACE_LINK_LIBRARIES) 243 244 set(LINK_LIBRARIES "") 245 246 if(TYPE STREQUAL "STATIC_LIBRARY" OR TYPE STREQUAL "SHARED_LIBRARY") 247 get_target_property(LINK_LIBRARIES ${LIB} LINK_LIBRARIES) 248 endif() 249 250 if(INTERFACE_LINK_LIBRARIES OR LINK_LIBRARIES) 251 252 string(APPEND CONFIG_FILE_CONTENTS "include(CMakeFindDependencyMacro)\n\n") 253 254 foreach(dep IN LISTS INTERFACE_LINK_LIBRARIES LINK_LIBRARIES) 255 256 if(${dep} MATCHES "^Boost::(.*)$") 257 258 string(APPEND CONFIG_FILE_CONTENTS "find_dependency(boost_${CMAKE_MATCH_1} ${__VERSION} EXACT)\n") 259 260 endif() 261 262 endforeach() 263 264 string(APPEND CONFIG_FILE_CONTENTS "\n") 265 266 endif() 267 268 string(APPEND CONFIG_FILE_CONTENTS "include(\"\${CMAKE_CURRENT_LIST_DIR}/${LIB}-targets.cmake\")\n") 269 270 file(WRITE "${CONFIG_FILE_NAME}" "${CONFIG_FILE_CONTENTS}") 271 install(FILES "${CONFIG_FILE_NAME}" DESTINATION "${CONFIG_INSTALL_DIR}") 272 273 set(CONFIG_VERSION_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/tmpinst/${LIB}-config-version.cmake") 274 275 if(TYPE STREQUAL "INTERFACE_LIBRARY") 276 277 # Header-only libraries are architecture-independent 278 279 if(NOT CMAKE_VERSION VERSION_LESS 3.14) 280 281 write_basic_package_version_file("${CONFIG_VERSION_FILE_NAME}" COMPATIBILITY AnyNewerVersion ARCH_INDEPENDENT) 282 283 else() 284 285 set(OLD_CMAKE_SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P}) 286 set(CMAKE_SIZEOF_VOID_P "") 287 288 write_basic_package_version_file("${CONFIG_VERSION_FILE_NAME}" COMPATIBILITY AnyNewerVersion) 289 290 set(CMAKE_SIZEOF_VOID_P ${OLD_CMAKE_SIZEOF_VOID_P}) 291 292 endif() 293 294 else() 295 296 write_basic_package_version_file("${CONFIG_VERSION_FILE_NAME}" COMPATIBILITY AnyNewerVersion) 297 298 endif() 299 300 install(FILES "${CONFIG_VERSION_FILE_NAME}" DESTINATION "${CONFIG_INSTALL_DIR}") 301 302endfunction() 303 304# boost_install([VERSION version] [TARGETS targets...] [HEADER_DIRECTORY directory]) 305 306function(boost_install) 307 308 cmake_parse_arguments(_ "" "VERSION;HEADER_DIRECTORY" "TARGETS" ${ARGN}) 309 310 if(NOT __VERSION) 311 312 if(NOT PROJECT_VERSION) 313 314 message(AUTHOR_WARNING "boost_install: VERSION not given, PROJECT_VERSION not set, but a version is required for installation.") 315 return() 316 317 else() 318 319 boost_message(DEBUG "boost_install: VERSION not given, assuming PROJECT_VERSION ('${PROJECT_VERSION}')") 320 set(__VERSION ${PROJECT_VERSION}) 321 322 endif() 323 324 endif() 325 326 if(__UNPARSED_ARGUMENTS) 327 328 message(AUTHOR_WARNING "boost_install: extra arguments ignored: ${__UNPARSED_ARGUMENTS}") 329 330 endif() 331 332 if(__HEADER_DIRECTORY) 333 334 get_filename_component(__HEADER_DIRECTORY "${__HEADER_DIRECTORY}" ABSOLUTE) 335 install(DIRECTORY "${__HEADER_DIRECTORY}/" DESTINATION "${BOOST_INSTALL_INCLUDEDIR}") 336 337 endif() 338 339 foreach(target IN LISTS __TARGETS) 340 341 boost_install_target(TARGET ${target} VERSION ${__VERSION} HEADER_DIRECTORY ${__HEADER_DIRECTORY}) 342 343 endforeach() 344 345endfunction() 346