From 69ca701957aec4e2dc3df69fd1bc107b550d7f74 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Wed, 25 Dec 2019 04:28:44 +0200 Subject: [PATCH] Update BoostInstall to use the install variables; set the OUTPUT_NAME, EXPORT_NAME properties of the installed target --- include/BoostInstall.cmake | 206 ++++++++++++++++++++++++++++--------- 1 file changed, 157 insertions(+), 49 deletions(-) diff --git a/include/BoostInstall.cmake b/include/BoostInstall.cmake index b59bbe8..6cbd248 100644 --- a/include/BoostInstall.cmake +++ b/include/BoostInstall.cmake @@ -9,70 +9,178 @@ endif() include(GNUInstallDirs) include(CMakePackageConfigHelpers) -function(boost_install LIB) +function(__boost_install_set_output_name LIB TYPE) - set(CONFIG_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/${LIB}-${PROJECT_VERSION}") + set(name ${LIB}) - install(TARGETS ${LIB} EXPORT ${LIB}-targets) - install(EXPORT ${LIB}-targets DESTINATION "${CONFIG_INSTALL_DIR}" NAMESPACE Boost:: FILE ${LIB}-targets.cmake) + # prefix + if(NOT (WIN32 AND TYPE STREQUAL "SHARED_LIBRARY")) + string(PREPEND name "lib") + endif() - get_target_property(INTERFACE_LINK_LIBRARIES ${LIB} INTERFACE_LINK_LIBRARIES) - get_target_property(TYPE ${LIB} TYPE) + # toolset + if(BOOST_INSTALL_LAYOUT STREQUAL versioned) - set(CONFIG_FILE_NAME "${CMAKE_BINARY_DIR}/${LIB}-config.cmake") - set(CONFIG_FILE_CONTENTS "# Generated by BoostInstall.cmake for ${LIB}-${PROJECT_VERSION}\n\n") + string(TOLOWER ${CMAKE_CXX_COMPILER_ID} toolset) - if(INTERFACE_LINK_LIBRARIES) + if(toolset STREQUAL "msvc") - string(APPEND CONFIG_FILE_CONTENTS "include(CMakeFindDependencyMacro)\n\n") + set(toolset "vc") - foreach(dep IN LISTS INTERFACE_LINK_LIBRARIES) - - if(${dep} MATCHES "^Boost::") - - string(REGEX REPLACE "^Boost::(.*)" "\\1" name "${dep}") - string(APPEND CONFIG_FILE_CONTENTS "find_dependency(boost_${name} ${PROJECT_VERSION} EXACT)\n") - - endif() - - endforeach() - - string(APPEND CONFIG_FILE_CONTENTS "\n") - - endif() - - string(APPEND CONFIG_FILE_CONTENTS "include(\"\${CMAKE_CURRENT_LIST_DIR}/${LIB}-targets.cmake\")\n") - - file(WRITE "${CONFIG_FILE_NAME}" "${CONFIG_FILE_CONTENTS}") - install(FILES "${CONFIG_FILE_NAME}" DESTINATION "${CONFIG_INSTALL_DIR}") - - set(CONFIG_VERSION_FILE_NAME "${PROJECT_BINARY_DIR}/${LIB}-config-version.cmake") - - if(TYPE STREQUAL "INTERFACE_LIBRARY") - - # Header-only libraries are arcitecture-independent - - if(NOT CMAKE_VERSION VERSION_LESS 3.14) - - write_basic_package_version_file("${CONFIG_VERSION_FILE_NAME}" COMPATIBILITY AnyNewerVersion ARCH_INDEPENDENT) + if(CMAKE_CXX_COMPILER_VERSION MATCHES "^([0-9]+)[.]([0-9]+)") + if(CMAKE_MATCH_1 GREATER 18) + math(EXPR major ${CMAKE_MATCH_1}-5) else() - - set(OLD_CMAKE_SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P}) - set(CMAKE_SIZEOF_VOID_P "") - - write_basic_package_version_file("${CONFIG_VERSION_FILE_NAME}" COMPATIBILITY AnyNewerVersion) - - set(CMAKE_SIZEOF_VOID_P ${OLD_CMAKE_SIZEOF_VOID_P}) - + math(EXPR major ${CMAKE_MATCH_1}-6) endif() + math(EXPR minor ${CMAKE_MATCH_2}/10) + + string(APPEND toolset ${major}${minor}) + + endif() + else() - write_basic_package_version_file("${CONFIG_VERSION_FILE_NAME}" COMPATIBILITY AnyNewerVersion) + if(toolset STREQUAL "gnu") + + set(toolset "gcc") + + elseif(toolset STREQUAL "clang") + + if(MSVC) + set(toolset "clangw") + endif() + + endif() + + if(CMAKE_CXX_COMPILER_VERSION MATCHES "^([0-9]+)[.]") + string(APPEND toolset ${CMAKE_MATCH_1}) + endif() endif() - install(FILES "${CONFIG_VERSION_FILE_NAME}" DESTINATION "${CONFIG_INSTALL_DIR}") + string(APPEND name "-${toolset}") + + endif() + + if(BOOST_INSTALL_LAYOUT STREQUAL versioned OR BOOST_INSTALL_LAYOUT STREQUAL tagged) + + # threading + string(APPEND name "-mt") + + # ABI tag + + string(APPEND tag "$<$>,MultiThreaded>:s>") + string(APPEND tag "$<$>,MultiThreadedDebug>:s>") + + string(APPEND tag "$<$>,MultiThreadedDebug>:g>") + string(APPEND tag "$<$>,MultiThreadedDebugDLL>:g>") + + string(APPEND tag "$<$:d>") + + string(APPEND name "$<$:->${tag}") + + # Arch and model + math(EXPR bits ${CMAKE_SIZEOF_VOID_P}*8) + string(APPEND name "-x${bits}") # x86 only for now + + endif() + + if(BOOST_INSTALL_LAYOUT STREQUAL versioned) + string(APPEND name "-${Boost_VERSION_MAJOR}_${Boost_VERSION_MINOR}") + endif() + + set_target_properties(${LIB} PROPERTIES OUTPUT_NAME ${name}) + +endfunction() + +function(boost_install LIB) + + if(NOT BOOST_INSTALL_LIBDIR) + set(BOOST_INSTALL_LIBDIR ${CMAKE_INSTALL_LIBDIR}) + endif() + + if(NOT BOOST_INSTALL_CMAKEDIR) + set(BOOST_INSTALL_CMAKEDIR "${BOOST_INSTALL_LIBDIR}/cmake") + endif() + + get_target_property(INTERFACE_LINK_LIBRARIES ${LIB} INTERFACE_LINK_LIBRARIES) + get_target_property(TYPE ${LIB} TYPE) + + if(TYPE STREQUAL "STATIC_LIBRARY" OR TYPE STREQUAL "SHARED_LIBRARY") + + get_target_property(OUTPUT_NAME ${LIB} OUTPUT_NAME) + + if(NOT OUTPUT_NAME) + __boost_install_set_output_name(${LIB} ${TYPE}) + endif() + + endif() + + if(LIB MATCHES "^boost_(.*)$") + set_target_properties(${LIB} PROPERTIES EXPORT_NAME ${CMAKE_MATCH_1}) + endif() + + set(CONFIG_INSTALL_DIR "${BOOST_INSTALL_CMAKEDIR}/${LIB}-${PROJECT_VERSION}") + + install(TARGETS ${LIB} EXPORT ${LIB}-targets DESTINATION ${BOOST_INSTALL_LIBDIR}) + install(EXPORT ${LIB}-targets DESTINATION "${CONFIG_INSTALL_DIR}" NAMESPACE Boost:: FILE ${LIB}-targets.cmake) + + set(CONFIG_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/${LIB}-config.cmake") + set(CONFIG_FILE_CONTENTS "# Generated by BoostInstall.cmake for ${LIB}-${PROJECT_VERSION}\n\n") + + if(INTERFACE_LINK_LIBRARIES) + + string(APPEND CONFIG_FILE_CONTENTS "include(CMakeFindDependencyMacro)\n\n") + + foreach(dep IN LISTS INTERFACE_LINK_LIBRARIES) + + if(${dep} MATCHES "^Boost::(.*)$") + + string(APPEND CONFIG_FILE_CONTENTS "find_dependency(boost_${CMAKE_MATCH_1} ${PROJECT_VERSION} EXACT)\n") + + endif() + + endforeach() + + string(APPEND CONFIG_FILE_CONTENTS "\n") + + endif() + + string(APPEND CONFIG_FILE_CONTENTS "include(\"\${CMAKE_CURRENT_LIST_DIR}/${LIB}-targets.cmake\")\n") + + file(WRITE "${CONFIG_FILE_NAME}" "${CONFIG_FILE_CONTENTS}") + install(FILES "${CONFIG_FILE_NAME}" DESTINATION "${CONFIG_INSTALL_DIR}") + + set(CONFIG_VERSION_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/${LIB}-config-version.cmake") + + if(TYPE STREQUAL "INTERFACE_LIBRARY") + + # Header-only libraries are arcitecture-independent + + if(NOT CMAKE_VERSION VERSION_LESS 3.14) + + write_basic_package_version_file("${CONFIG_VERSION_FILE_NAME}" COMPATIBILITY AnyNewerVersion ARCH_INDEPENDENT) + + else() + + set(OLD_CMAKE_SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P}) + set(CMAKE_SIZEOF_VOID_P "") + + write_basic_package_version_file("${CONFIG_VERSION_FILE_NAME}" COMPATIBILITY AnyNewerVersion) + + set(CMAKE_SIZEOF_VOID_P ${OLD_CMAKE_SIZEOF_VOID_P}) + + endif() + + else() + + write_basic_package_version_file("${CONFIG_VERSION_FILE_NAME}" COMPATIBILITY AnyNewerVersion) + + endif() + + install(FILES "${CONFIG_VERSION_FILE_NAME}" DESTINATION "${CONFIG_INSTALL_DIR}") endfunction()