Files
TheRock/rocm-systems/projects/rocprofiler-systems/cmake/DyninstTBB.cmake
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

233 lines
9.5 KiB
CMake

# Copyright (c) Advanced Micro Devices, Inc.
# SPDX-License-Identifier: MIT
# =====================================================================================
# DyninstTBB.cmake
#
# Configure Threading Building Blocks (TBB) for Dyninst.
#
# ROCPROFSYS_BUILD_TBB=ON → build oneTBB 2022.3.0 from external/onetbb submodule (always build Release)
# ROCPROFSYS_BUILD_TBB=OFF → use system TBB (e.g. libtbb-dev)
#
# Outputs (both paths):
# TBB::tbb, TBB::tbbmalloc, TBB::tbbmalloc_proxy — imported targets
# Dyninst::TBB — aggregated interface for Dyninst
# rocprofiler-systems-tbb — interface target for this project
# TBB_ROOT / TBB_ROOT_DIR — hint for Dyninst's own find_package
# =====================================================================================
include_guard(GLOBAL)
set(_tbb_components tbb tbbmalloc tbbmalloc_proxy)
if(ROCPROFSYS_BUILD_TBB)
# =============================================================================
# Bundled build: oneTBB 2022.3.0 from submodule
# =============================================================================
if(NOT UNIX)
rocprofiler_systems_message(
FATAL_ERROR "Building TBB from source is only supported on Unix"
)
endif()
rocprofiler_systems_checkout_git_submodule(
RELATIVE_PATH external/onetbb
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
TEST_FILE CMakeLists.txt
REPO_URL https://github.com/uxlfoundation/oneTBB.git
REPO_BRANCH "v2022.3.0"
)
rocprofiler_systems_message(STATUS "Building TBB from external/onetbb submodule (Release)")
# Always build/install bundled oneTBB as Release, independent of the main project's
# CMAKE_BUILD_TYPE (preserves previous behavior).
set(_tbb_bundled_build_type "Release")
set(TBB_ROOT_DIR "${TPL_STAGING_PREFIX}/tbb" CACHE PATH "TBB root directory" FORCE)
file(MAKE_DIRECTORY "${TBB_ROOT_DIR}/include" "${TBB_ROOT_DIR}/lib")
# Build byproducts for Ninja dependency tracking.
# SOVERSIONs from oneTBB 2022.3.0:
# libtbb: __TBB_BINARY_VERSION in include/oneapi/tbb/version.h (= 12)
# libtbbmalloc*: TBBMALLOC_BINARY_VERSION in CMakeLists.txt (= 2)
set(_tbb_build_byproducts
"${TBB_ROOT_DIR}/lib/libtbb${CMAKE_SHARED_LIBRARY_SUFFIX}"
"${TBB_ROOT_DIR}/lib/libtbb${CMAKE_SHARED_LIBRARY_SUFFIX}.12"
"${TBB_ROOT_DIR}/lib/libtbbmalloc${CMAKE_SHARED_LIBRARY_SUFFIX}"
"${TBB_ROOT_DIR}/lib/libtbbmalloc${CMAKE_SHARED_LIBRARY_SUFFIX}.2"
"${TBB_ROOT_DIR}/lib/libtbbmalloc_proxy${CMAKE_SHARED_LIBRARY_SUFFIX}"
"${TBB_ROOT_DIR}/lib/libtbbmalloc_proxy${CMAKE_SHARED_LIBRARY_SUFFIX}.2"
)
include(ExternalProject)
ExternalProject_Add(
rocprofiler-systems-tbb-build
PREFIX "${TBB_ROOT_DIR}"
SOURCE_DIR "${PROJECT_SOURCE_DIR}/external/onetbb"
BINARY_DIR "${TBB_ROOT_DIR}/build"
BUILD_BYPRODUCTS ${_tbb_build_byproducts}
CONFIGURE_COMMAND
${CMAKE_COMMAND} -S <SOURCE_DIR> -B <BINARY_DIR>
-DCMAKE_BUILD_TYPE=${_tbb_bundled_build_type}
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
-DCMAKE_C_COMPILER_LAUNCHER=${CMAKE_C_COMPILER_LAUNCHER}
-DCMAKE_CXX_COMPILER_LAUNCHER=${CMAKE_CXX_COMPILER_LAUNCHER}
-DCMAKE_INSTALL_PREFIX=${TBB_ROOT_DIR} -DCMAKE_INSTALL_LIBDIR=lib
-DCMAKE_BUILD_RPATH=\$ORIGIN -DCMAKE_INSTALL_RPATH=\$ORIGIN -DTBB_TEST=OFF
-DTBB_STRICT=OFF -DTBB_DISABLE_HWLOC_AUTOMATIC_SEARCH=ON
BUILD_COMMAND
${CMAKE_COMMAND} --build <BINARY_DIR> --config ${_tbb_bundled_build_type}
--target tbb tbbmalloc tbbmalloc_proxy
INSTALL_COMMAND
${CMAKE_COMMAND} --install <BINARY_DIR> --config ${_tbb_bundled_build_type}
)
install(
DIRECTORY "${TBB_ROOT_DIR}/lib/"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}"
FILES_MATCHING
PATTERN "*${CMAKE_SHARED_LIBRARY_SUFFIX}*"
)
# IMPORTED targets backed by ExternalProject output.
# Build ordering is managed via external-prebuild in DyninstExternals.cmake.
foreach(c ${_tbb_components})
add_library(TBB::${c} UNKNOWN IMPORTED)
set_target_properties(
TBB::${c}
PROPERTIES
IMPORTED_LOCATION
"${TBB_ROOT_DIR}/lib/lib${c}${CMAKE_SHARED_LIBRARY_SUFFIX}"
INTERFACE_INCLUDE_DIRECTORIES "${TBB_ROOT_DIR}/include"
)
endforeach()
# FindTBB.cmake-compatible variables so other modules see a consistent TBB package
# (avoids mixing stale cache entries from a prior system TBB configure).
set(_tbb_bundled_incdir "${TBB_ROOT_DIR}/include")
set(_tbb_bundled_libdir "${TBB_ROOT_DIR}/lib")
set(_tbb_bundled_libs_release "")
foreach(c ${_tbb_components})
set(_tbb_lib "${_tbb_bundled_libdir}/lib${c}${CMAKE_SHARED_LIBRARY_SUFFIX}")
list(APPEND _tbb_bundled_libs_release "${_tbb_lib}")
set(TBB_${c}_LIBRARY_RELEASE
"${_tbb_lib}"
CACHE FILEPATH
"Bundled oneTBB: ${c}"
FORCE
)
set(TBB_${c}_FOUND TRUE CACHE BOOL "" FORCE)
endforeach()
set(TBB_INCLUDE_DIRS
"${_tbb_bundled_incdir}"
CACHE PATH
"TBB include directories"
FORCE
)
set(TBB_INCLUDE_DIR "${_tbb_bundled_incdir}" CACHE PATH "TBB include directory" FORCE)
set(TBB_LIBRARY_DIRS
"${_tbb_bundled_libdir}"
CACHE PATH
"TBB library directories"
FORCE
)
set(TBB_LIBRARY
"${_tbb_bundled_libdir}"
CACHE PATH
"TBB library directory hint"
FORCE
)
set(TBB_LIBRARIES "${_tbb_bundled_libs_release}" CACHE STRING "TBB libraries" FORCE)
set(TBB_DEFINITIONS "" CACHE STRING "TBB compile definitions" FORCE)
set(TBB_VERSION "2022.3.0" CACHE STRING "Bundled oneTBB version" FORCE)
set(TBB_FOUND TRUE CACHE BOOL "Bundled oneTBB is used" FORCE)
else()
# =============================================================================
# System package
# =============================================================================
set(TBB_USE_DEBUG_BUILD OFF CACHE BOOL "Use debug versions of TBB libraries")
set(TBB_MIN_VERSION "2018.6" CACHE STRING "Minimum TBB version")
set(TBB_ROOT_DIR "/usr" CACHE PATH "TBB root directory")
set(TBB_LIBRARY "${TBB_ROOT_DIR}/lib")
set(TBB_INCLUDE_DIR "${TBB_ROOT_DIR}/include")
find_package(TBB ${TBB_MIN_VERSION} COMPONENTS ${_tbb_components})
if(NOT TBB_FOUND)
if(STERILE_BUILD)
rocprofiler_systems_message(
FATAL_ERROR
"TBB not found and cannot be downloaded because build is sterile"
)
else()
rocprofiler_systems_message(
FATAL_ERROR
"TBB not found. Install a system TBB package (e.g. libtbb-dev) or set ROCPROFSYS_BUILD_TBB=ON."
)
endif()
endif()
# Derive TBB_ROOT_DIR from the found location for Dyninst's find_package hint.
if(TBB_INCLUDE_DIRS)
list(GET TBB_INCLUDE_DIRS 0 _tbb_inc)
get_filename_component(_tbb_root "${_tbb_inc}" DIRECTORY)
set(TBB_ROOT_DIR "${_tbb_root}" CACHE PATH "TBB root directory" FORCE)
elseif(TBB_DIR)
string(REGEX REPLACE "/lib(/[^/]+)*/cmake/TBB[^/]*$" "" _tbb_root "${TBB_DIR}")
if(NOT _tbb_root STREQUAL TBB_DIR)
get_filename_component(_tbb_root "${_tbb_root}" ABSOLUTE)
set(TBB_ROOT_DIR "${_tbb_root}" CACHE PATH "TBB root directory" FORCE)
endif()
endif()
# Create TBB::* imported targets if find_package didn't provide them.
if(NOT TARGET TBB::tbb)
foreach(c ${_tbb_components})
set(_lib "${TBB_${c}_LIBRARY_RELEASE}")
if(NOT _lib)
set(_lib "${TBB_${c}_LIBRARY_DEBUG}")
endif()
if(_lib)
add_library(TBB::${c} UNKNOWN IMPORTED)
set_target_properties(
TBB::${c}
PROPERTIES
IMPORTED_LOCATION "${_lib}"
INTERFACE_INCLUDE_DIRECTORIES "${TBB_INCLUDE_DIRS}"
)
endif()
endforeach()
endif()
endif()
set(TBB_ROOT "${TBB_ROOT_DIR}" CACHE PATH "TBB root for Dyninst" FORCE)
rocprofiler_systems_message(STATUS "TBB include dirs: ${TBB_INCLUDE_DIRS}")
rocprofiler_systems_message(STATUS "TBB library dirs: ${TBB_LIBRARY_DIRS}")
rocprofiler_systems_message(STATUS "TBB libraries: ${TBB_LIBRARIES}")
rocprofiler_systems_message(STATUS "TBB version: ${TBB_VERSION}")
# =============================================================================
# Dyninst::TBB — aggregated target for Dyninst's consumption
# =============================================================================
if(NOT TARGET Dyninst::TBB)
add_library(Dyninst::TBB INTERFACE IMPORTED)
foreach(c ${_tbb_components})
if(TARGET TBB::${c})
target_link_libraries(Dyninst::TBB INTERFACE TBB::${c})
endif()
endforeach()
endif()
# =============================================================================
# rocprofiler-systems-tbb — this project's interface target
# =============================================================================
foreach(c ${_tbb_components})
if(TARGET TBB::${c})
target_link_libraries(rocprofiler-systems-tbb INTERFACE TBB::${c})
endif()
endforeach()