파일
rocm-systems/projects/rocprofiler-systems/cmake/DyninstBoost.cmake
T
Aleksandar Djordjevic f39a60ac25 [rocprofiler-systems] Apply new CMake formatting for the latest gersemi version (#1778)
* Fix cmake formatting

* Updated rev. in `.pre-commit-config.yaml`

* Pin the gersemi used in CI to v0.23.1, matching the pre-commit

---------

Co-authored-by: Aleksandar Djordjevic <adjordje@amd.com>
Co-authored-by: David Galiffi <David.Galiffi@amd.com>
2025-11-10 13:08:44 -05:00

436 라인
15 KiB
CMake

# ========================================================================================================
# Boost.cmake
#
# Configure Boost for Dyninst
#
# ----------------------------------------
#
# Accepts the following CMake variables
#
# Boost_ROOT_DIR - Hint directory that contains the Boost installation
# PATH_BOOST - Alias for Boost_ROOT_DIR Boost_MIN_VERSION - Minimum
# acceptable version of Boost Boost_USE_MULTITHREADED - Use the multithreaded version of
# Boost Boost_USE_STATIC_RUNTIME - Use libraries linked statically to the C++ runtime
#
# Options inherited from Modules/FindBoost.cmake that may be useful
#
# BOOST_INCLUDEDIR - Hint directory that contains the Boost headers files
# BOOST_LIBRARYDIR - Hint directory that contains the Boost library files
#
# Advanced options:
#
# Boost_DEBUG - Enable debug output from FindBoost Boost_NO_SYSTEM_PATHS -
# Disable searching in locations not specified by hint variables
#
# Exports the following CMake cache variables
#
# Boost_ROOT_DIR - Computed base directory the of Boost installation
# Boost_INCLUDE_DIRS - Boost include directories Boost_INCLUDE_DIR - Alias for
# Boost_INCLUDE_DIRS Boost_LIBRARY_DIRS - Link directories for Boost libraries
# Boost_DEFINES - Boost compiler definitions Boost_LIBRARIES - Boost
# library files Boost_<C>_LIBRARY_RELEASE - Release libraries to link for component <C>
# (<C> is upper-case) Boost_<C>_LIBRARY_DEBUG - Debug libraries to link for component
# <C> Boost_THREAD_LIBRARY - The filename of the Boost thread library
# Boost_USE_MULTITHREADED - Use the multithreaded version of Boost
# Boost_USE_STATIC_RUNTIME - Use libraries linked statically to the C++ runtime
#
# NOTE: The exported Boost_ROOT_DIR can be different from the value provided by the user
# in the case that it is determined to build Boost from source. In such a case,
# Boost_ROOT_DIR will contain the directory of the from-source installation.
#
# See Modules/FindBoost.cmake for additional input and exported variables
#
# ========================================================================================================
include_guard(GLOBAL)
if(NOT BUILD_BOOST)
find_package(Boost)
endif()
if(Boost_FOUND)
return()
endif()
# Need at least Boost-1.67 because of deprecated headers
set(_boost_min_version 1.67.0)
# Provide a default, if the user didn't specify
set(Boost_MIN_VERSION ${_boost_min_version} CACHE STRING "Minimum Boost version")
# Enforce minimum version
if(${Boost_MIN_VERSION} VERSION_LESS ${_boost_min_version})
rocprofiler_systems_message(
FATAL_ERROR
"Requested Boost-${Boost_MIN_VERSION} is less than minimum supported version (${_boost_min_version})"
)
endif()
# -------------- RUNTIME CONFIGURATION ----------------------------------------
# Use the multithreaded version of Boost NB: This _must_ be a cache variable as it
# controls the tagged layout of Boost library names
set(Boost_USE_MULTITHREADED ON CACHE BOOL "Enable multithreaded Boost libraries")
# Don't use libraries linked statically to the C++ runtime NB: This _must_ be a cache
# variable as it controls the tagged layout of Boost library names
set(Boost_USE_STATIC_RUNTIME
OFF
CACHE BOOL
"Enable usage of libraries statically linked to C++ runtime"
)
# If using multithreaded Boost, make sure Threads has been intialized
if(Boost_USE_MULTITHREADED AND NOT DEFINED CMAKE_THREAD_LIBS_INIT)
find_package(Threads)
endif()
# Enable debug output from FindBoost
set(Boost_DEBUG OFF CACHE BOOL "Enable debug output from FindBoost")
# -------------- PATHS --------------------------------------------------------
# By default, search system paths
set(Boost_NO_SYSTEM_PATHS
OFF
CACHE BOOL
"Disable searching in locations not specified by hint variables"
)
# A sanity check This must be done _before_ the cache variables are set
if(PATH_BOOST AND Boost_ROOT_DIR)
rocprofiler_systems_message(
FATAL_ERROR
"PATH_BOOST AND Boost_ROOT_DIR both specified. Please provide only one"
)
endif()
# Provide a default root directory
if(NOT PATH_BOOST AND NOT Boost_ROOT_DIR)
set(PATH_BOOST "/usr")
endif()
# Set the default location to look for Boost
set(Boost_ROOT_DIR ${PATH_BOOST} CACHE PATH "Base directory the of Boost installation")
# In FindBoost, Boost_ROOT_DIR is spelled BOOST_ROOT
set(BOOST_ROOT ${Boost_ROOT_DIR})
# -------------- COMPILER DEFINES ---------------------------------------------
set(_boost_defines)
# Disable auto-linking
list(APPEND _boost_defines BOOST_ALL_NO_LIB=1)
# Disable generating serialization code in boost::multi_index
list(APPEND _boost_defines BOOST_MULTI_INDEX_DISABLE_SERIALIZATION)
# There are broken versions of MSVC that won't handle variadic templates correctly
# (despite the C++11 test case passing).
if(MSVC)
list(APPEND _boost_defines BOOST_NO_CXX11_VARIADIC_TEMPLATES)
endif()
set(Boost_DEFINES ${_boost_defines} CACHE STRING "Boost compiler defines")
add_compile_definitions(${Boost_DEFINES})
# -------------- INTERNALS ----------------------------------------------------
# Disable Boost's own CMake as it's known to be buggy NB: This should not be a cache
# variable
set(Boost_NO_BOOST_CMAKE ON)
# The required Boost library components NB: These are just the ones that require
# compilation/linking This should _not_ be a cache variable
set(_boost_components
atomic
chrono
date_time
filesystem
system
thread
timer
)
if(NOT BUILD_BOOST)
find_package(Boost ${Boost_MIN_VERSION} QUIET COMPONENTS ${_boost_components})
endif()
# -------------- SOURCE BUILD -------------------------------------------------
if(Boost_FOUND AND NOT BUILD_BOOST)
# Force the cache entries to be updated Normally, these would not be exported.
# However, we need them in the Testsuite
set(Boost_INCLUDE_DIRS
${Boost_INCLUDE_DIRS}
CACHE PATH
"Boost include directory"
FORCE
)
set(Boost_LIBRARY_DIRS
${Boost_LIBRARY_DIRS}
CACHE PATH
"Boost library directory"
FORCE
)
set(Boost_INCLUDE_DIR ${Boost_INCLUDE_DIR} CACHE PATH "Boost include directory" FORCE)
elseif(NOT Boost_FOUND AND STERILE_BUILD)
rocprofiler_systems_message(
FATAL_ERROR "Boost not found and cannot be downloaded because build is sterile."
)
elseif(NOT BUILD_BOOST)
rocprofiler_systems_message(
FATAL_ERROR
"Boost was not found. Either configure cmake to find Boost properly or set BUILD_BOOST=ON to download and build"
)
else()
rocprofiler_systems_add_option(BOOST_LINK_STATIC "Link to boost libraries statically"
ON
)
# If we didn't find a suitable version on the system, then download one from the web
rocprofiler_systems_add_cache_option(
ROCPROFSYS_BOOST_DOWNLOAD_VERSION "Version of boost to download and install"
STRING "1.79.0"
)
# If the user specifies a version other than ROCPROFSYS_BOOST_DOWNLOAD_VERSION, use
# that version.
if(${ROCPROFSYS_BOOST_DOWNLOAD_VERSION} VERSION_LESS ${Boost_MIN_VERSION})
rocprofiler_systems_message(
FATAL_ERROR
"Boost download version is set to ${ROCPROFSYS_BOOST_DOWNLOAD_VERSION} but Boost minimum version is set to ${Boost_MIN_VERSION}"
)
endif()
rocprofiler_systems_message(
STATUS
"Attempting to build BOOST(${ROCPROFSYS_BOOST_DOWNLOAD_VERSION}) as external project"
)
if(Boost_USE_MULTITHREADED)
set(_boost_threading multi)
else()
set(_boost_threading single)
endif()
if(Boost_USE_STATIC_RUNTIME)
set(_boost_runtime_link static)
else()
set(_boost_runtime_link shared)
endif()
# Change the base directory
set(Boost_ROOT_DIR
${TPL_STAGING_PREFIX}/boost
CACHE PATH
"Base directory the of Boost installation"
FORCE
)
# Update the exported variables
set(Boost_INCLUDE_DIRS
"$<BUILD_INTERFACE:${Boost_ROOT_DIR}/include>;$<INSTALL_INTERFACE:${CMAKE_INSTALL_LIBDIR}/${TPL_INSTALL_INCLUDE_DIR}>"
CACHE PATH
"Boost include directory"
FORCE
)
set(Boost_LIBRARY_DIRS
"$<BUILD_INTERFACE:${Boost_ROOT_DIR}/lib>;$<INSTALL_INTERFACE:${CMAKE_INSTALL_LIBDIR}/${TPL_INSTALL_LIB_DIR}>"
CACHE PATH
"Boost library directory"
FORCE
)
set(Boost_INCLUDE_DIR
${Boost_INCLUDE_DIRS}
CACHE PATH
"Boost include directory"
FORCE
)
file(MAKE_DIRECTORY ${Boost_ROOT_DIR}/include)
file(MAKE_DIRECTORY ${Boost_ROOT_DIR}/lib)
if(BOOST_LINK_STATIC)
set(_BOOST_LINK static)
else()
set(_BOOST_LINK shared)
endif()
set(BOOST_ARGS
link=${_BOOST_LINK}
runtime-link=${_boost_runtime_link}
threading=${_boost_threading}
)
if(WIN32)
# NB: We need to build both debug/release on windows as we don't use
# CMAKE_BUILD_TYPE
set(BOOST_BOOTSTRAP call bootstrap.bat)
set(BOOST_BUILD ".\\b2")
if(CMAKE_SIZEOF_VOID_P STREQUAL "8")
list(APPEND BOOST_ARGS address-model=64)
endif()
else()
set(BOOST_BOOTSTRAP "./bootstrap.sh")
set(BOOST_BUILD "./b2")
if(CMAKE_BUILD_TYPE MATCHES "^(Debug|DEBUG)$")
list(APPEND BOOST_ARGS variant=debug)
else()
list(APPEND BOOST_ARGS variant=release)
endif()
endif()
# Join the component names together to pass to --with-libraries during bootstrap
set(_boost_lib_names "headers,")
foreach(c ${_boost_components})
# list(JOIN ...) is in cmake 3.12
string(CONCAT _boost_lib_names "${_boost_lib_names}${c},")
endforeach()
if(CMAKE_CXX_COMPILER_ID MATCHES "(GNU|Clang|Intel)")
list(APPEND BOOST_ARGS cflags=-fPIC cxxflags=-fPIC)
endif()
string(REPLACE "." "_" _boost_download_filename ${ROCPROFSYS_BOOST_DOWNLOAD_VERSION})
# zip is subject to locales on Unix
set(_boost_download_ext "zip")
if(UNIX)
set(_boost_download_ext "tar.gz")
endif()
set(_LIB_SUFFIX "${CMAKE_SHARED_LIBRARY_SUFFIX}")
if(BOOST_LINK_STATIC)
set(_LIB_SUFFIX "${CMAKE_STATIC_LIBRARY_SUFFIX}")
endif()
if(WIN32)
# We need to specify different library names for debug vs release
set(Boost_LIBRARIES "")
foreach(c ${_boost_components})
list(APPEND Boost_LIBRARIES "optimized libboost_${c} debug libboost_${c}-gd ")
list(
APPEND _boost_build_byproducts
"{Boost_ROOT_DIR}/lib/libboost_${c}${_LIB_SUFFIX}"
)
set(Boost_${c}_LIBRARY
$<BUILD_INTERFACE:${Boost_ROOT_DIR}/lib/libboost_${c}${_LIB_SUFFIX}>
$<INSTALL_INTERFACE:boost_${c}>
)
set(Boost_${c}_LIBRARY_DEBUG
$<BUILD_INTERFACE:${Boost_ROOT_DIR}/lib/libboost_${c}${_LIB_SUFFIX}>
$<INSTALL_INTERFACE:libboost_${c}-gd>
)
# Also export cache variables for the file location of each library
string(TOUPPER ${c} _basename)
set(Boost_${_basename}_LIBRARY_RELEASE
"${Boost_${c}_LIBRARY}"
CACHE FILEPATH
""
FORCE
)
set(Boost_${_basename}_LIBRARY_DEBUG
"${Boost_${c}_LIBRARY_DEBUG}"
CACHE FILEPATH
""
FORCE
)
endforeach()
else()
# Transform the component names into the library filenames e.g., system ->
# boost_system
set(Boost_LIBRARIES "")
foreach(c ${_boost_components})
set(Boost_${c}_LIBRARY
$<BUILD_INTERFACE:${Boost_ROOT_DIR}/lib/libboost_${c}${_LIB_SUFFIX}>
$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${INSTALL_LIB_DIR}/${TPL_INSTALL_LIB_DIR}/libboost_${c}${_LIB_SUFFIX}>
)
list(
APPEND _boost_build_byproducts
"${Boost_ROOT_DIR}/lib/libboost_${c}${_LIB_SUFFIX}"
)
list(APPEND Boost_LIBRARIES "${Boost_${c}_LIBRARY}")
# Also export cache variables for the file location of each library
string(TOUPPER ${c} _basename)
set(Boost_${_basename}_LIBRARY_RELEASE
"${Boost_${c}_LIBRARY}"
CACHE FILEPATH
""
FORCE
)
set(Boost_${_basename}_LIBRARY_DEBUG
"${Boost_${c}_LIBRARY}"
CACHE FILEPATH
""
FORCE
)
endforeach()
endif()
include(ExternalProject)
ExternalProject_Add(
rocprofiler-systems-boost-build
PREFIX ${Boost_ROOT_DIR}
GIT_REPOSITORY https://github.com/boostorg/boost.git
GIT_TAG boost-${ROCPROFSYS_BOOST_DOWNLOAD_VERSION}
BUILD_IN_SOURCE 1
CONFIGURE_COMMAND
${BOOST_BOOTSTRAP} --prefix=${Boost_ROOT_DIR}
--with-libraries=${_boost_lib_names}
BUILD_COMMAND
${BOOST_BUILD} --ignore-site-config --prefix=${Boost_ROOT_DIR} -j2
${BOOST_ARGS} -d0 install
BUILD_BYPRODUCTS ${_boost_build_byproducts}
INSTALL_COMMAND ""
)
# target for re-executing the installation
add_custom_target(
rocprofiler-systems-boost-install
COMMAND ${BOOST_BUILD} ${BOOST_ARGS} -d0 install
WORKING_DIRECTORY ${Boost_ROOT_DIR}/src/Boost-External
COMMENT "Installing Boost..."
)
endif()
# -------------- EXPORT VARIABLES ---------------------------------------------
# Export Boost_THREAD_LIBRARY
list(FIND _boost_components "thread" _building_threads)
if(Boost_USE_MULTITHREADED AND ${_building_threads})
# On Windows, always use the debug version On Linux, we don't use tagged builds, so
# the debug/release filenames are the same
set(Boost_THREAD_LIBRARY
${Boost_THREAD_LIBRARY_DEBUG}
CACHE FILEPATH
"Boost thread library"
)
endif()
# Add the system thread library
if(Boost_USE_MULTITHREADED)
list(APPEND Boost_LIBRARIES ${CMAKE_THREAD_LIBS_INIT})
endif()
# Export the complete set of libraries
set(Boost_LIBRARIES ${Boost_LIBRARIES} CACHE FILEPATH "Boost library files" FORCE)
target_include_directories(
rocprofiler-systems-boost
SYSTEM
INTERFACE ${Boost_INCLUDE_DIRS}
)
target_compile_definitions(rocprofiler-systems-boost INTERFACE ${Boost_DEFINITIONS})
target_link_directories(rocprofiler-systems-boost INTERFACE ${Boost_LIBRARY_DIRS})
target_link_libraries(rocprofiler-systems-boost INTERFACE ${Boost_LIBRARIES})
rocprofiler_systems_message(STATUS "Boost includes: ${Boost_INCLUDE_DIRS}")
rocprofiler_systems_message(STATUS "Boost library dirs: ${Boost_LIBRARY_DIRS}")
rocprofiler_systems_message(STATUS "Boost thread library: ${Boost_THREAD_LIBRARY}")
rocprofiler_systems_message(STATUS "Boost libraries: ${Boost_LIBRARIES}")
# Just the headers (effectively a simplified Boost::headers target)
add_library(Dyninst::Boost_headers INTERFACE IMPORTED)
target_include_directories(Dyninst::Boost_headers SYSTEM INTERFACE ${Boost_INCLUDE_DIRS})