Files
rocm-systems/projects/rocprofiler-systems/cmake/Perfetto.cmake
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

303 lines
9.1 KiB
CMake
Raw Normal View History

2022-05-11 15:05:09 -05:00
# ======================================================================================
# Perfetto.cmake
#
# Configure perfetto for rocprofiler-systems
2022-05-11 15:05:09 -05:00
#
# ======================================================================================
include_guard(GLOBAL)
include(ExternalProject)
include(ProcessorCount)
# ---------------------------------------------------------------------------------------#
#
# executables and libraries
#
# ---------------------------------------------------------------------------------------#
2025-06-22 10:44:33 -04:00
find_program(ROCPROFSYS_COPY_EXECUTABLE NAMES cp PATH_SUFFIXES bin)
2022-05-11 15:05:09 -05:00
2025-06-22 10:44:33 -04:00
find_program(ROCPROFSYS_NINJA_EXECUTABLE NAMES ninja PATH_SUFFIXES bin)
2022-05-11 15:05:09 -05:00
mark_as_advanced(ROCPROFSYS_COPY_EXECUTABLE)
mark_as_advanced(ROCPROFSYS_NINJA_EXECUTABLE)
2022-05-11 15:05:09 -05:00
# ---------------------------------------------------------------------------------------#
#
# variables
#
# ---------------------------------------------------------------------------------------#
2025-06-22 10:44:33 -04:00
ProcessorCount(NUM_PROCS_REAL)
2022-05-11 15:05:09 -05:00
math(EXPR _NUM_THREADS "${NUM_PROCS_REAL} - (${NUM_PROCS_REAL} / 2)")
if(_NUM_THREADS GREATER 8)
set(_NUM_THREADS 8)
elseif(_NUM_THREADS LESS 1)
set(_NUM_THREADS 1)
endif()
set(ROCPROFSYS_PERFETTO_SOURCE_DIR ${PROJECT_BINARY_DIR}/external/perfetto/source)
set(ROCPROFSYS_PERFETTO_TOOLS_DIR ${PROJECT_BINARY_DIR}/external/perfetto/source/tools)
set(ROCPROFSYS_PERFETTO_BINARY_DIR
2025-06-22 10:44:33 -04:00
${PROJECT_BINARY_DIR}/external/perfetto/source/out/linux
)
set(ROCPROFSYS_PERFETTO_INSTALL_DIR
2025-06-22 10:44:33 -04:00
${PROJECT_BINARY_DIR}/external/perfetto/source/out/linux/stripped
)
set(ROCPROFSYS_PERFETTO_LINK_FLAGS
2023-03-07 06:04:19 -06:00
"-static-libgcc"
2025-06-22 10:44:33 -04:00
CACHE STRING
"Link flags for perfetto"
)
set(ROCPROFSYS_PERFETTO_BUILD_THREADS
2022-05-11 15:05:09 -05:00
${_NUM_THREADS}
2025-06-22 10:44:33 -04:00
CACHE STRING
"Number of threads to use when building perfetto tools"
)
2022-05-11 15:05:09 -05:00
if(CMAKE_CXX_COMPILER_IS_CLANG)
set(PERFETTO_IS_CLANG true)
2025-06-22 10:44:33 -04:00
set(ROCPROFSYS_PERFETTO_C_FLAGS "" CACHE STRING "Perfetto C flags")
set(ROCPROFSYS_PERFETTO_CXX_FLAGS "" CACHE STRING "Perfetto C++ flags")
2022-05-11 15:05:09 -05:00
else()
set(PERFETTO_IS_CLANG false)
set(ROCPROFSYS_PERFETTO_C_FLAGS
2024-09-13 13:43:26 -04:00
"-static-libgcc -Wno-maybe-uninitialized -Wno-stringop-overflow"
2025-06-22 10:44:33 -04:00
CACHE STRING
"Perfetto C flags"
)
set(ROCPROFSYS_PERFETTO_CXX_FLAGS
2024-09-13 13:43:26 -04:00
"-static-libgcc -Wno-maybe-uninitialized -Wno-stringop-overflow -Wno-mismatched-new-delete"
2025-06-22 10:44:33 -04:00
CACHE STRING
"Perfetto C++ flags"
)
2022-05-11 15:05:09 -05:00
endif()
mark_as_advanced(ROCPROFSYS_PERFETTO_C_FLAGS)
mark_as_advanced(ROCPROFSYS_PERFETTO_CXX_FLAGS)
mark_as_advanced(ROCPROFSYS_PERFETTO_LINK_FLAGS)
2022-05-11 15:05:09 -05:00
if(NOT ROCPROFSYS_NINJA_EXECUTABLE)
set(ROCPROFSYS_NINJA_EXECUTABLE
${ROCPROFSYS_PERFETTO_TOOLS_DIR}/ninja
2025-06-22 10:44:33 -04:00
CACHE FILEPATH
"Ninja"
FORCE
)
2022-05-11 15:05:09 -05:00
endif()
# ---------------------------------------------------------------------------------------#
#
# source tree
#
# ---------------------------------------------------------------------------------------#
if(NOT EXISTS "${ROCPROFSYS_PERFETTO_SOURCE_DIR}")
2025-06-22 10:44:33 -04:00
execute_process(
COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/external/perfetto
)
2022-05-11 15:05:09 -05:00
# cmake -E copy_directory fails for some reason
execute_process(
2025-06-22 10:44:33 -04:00
COMMAND
${ROCPROFSYS_COPY_EXECUTABLE} -r ${PROJECT_SOURCE_DIR}/external/perfetto/
${ROCPROFSYS_PERFETTO_SOURCE_DIR}
)
2022-05-11 15:05:09 -05:00
endif()
2023-02-27 12:09:03 -06:00
file(READ ${PROJECT_SOURCE_DIR}/external/perfetto/sdk/perfetto.h _PERFETTO_HEADER)
string(
2025-06-22 10:44:33 -04:00
REGEX REPLACE
" perfetto::internal::ValidateEventNameType"
" ::perfetto::internal::ValidateEventNameType"
_PERFETTO_HEADER
"${_PERFETTO_HEADER}"
)
2023-02-27 12:09:03 -06:00
if(ROCPROFSYS_USE_SANITIZER AND ROCPROFSYS_SANITIZER_TYPE MATCHES "address")
2025-06-22 10:44:33 -04:00
string(
REPLACE
"__asan_poison_memory_region((a), (s))"
""
_PERFETTO_HEADER
"${_PERFETTO_HEADER}"
)
string(
REPLACE
"__asan_unpoison_memory_region((a), (s))"
""
_PERFETTO_HEADER
"${_PERFETTO_HEADER}"
)
2023-02-27 12:09:03 -06:00
endif()
file(WRITE ${ROCPROFSYS_PERFETTO_SOURCE_DIR}/sdk/perfetto.h.tmp "${_PERFETTO_HEADER}")
2023-02-27 12:09:03 -06:00
2025-06-22 10:44:33 -04:00
configure_file(
${ROCPROFSYS_PERFETTO_SOURCE_DIR}/sdk/perfetto.h.tmp
${ROCPROFSYS_PERFETTO_SOURCE_DIR}/sdk/perfetto.h
COPYONLY
)
configure_file(
${PROJECT_SOURCE_DIR}/external/perfetto/sdk/perfetto.cc
${ROCPROFSYS_PERFETTO_SOURCE_DIR}/sdk/perfetto.cc
COPYONLY
)
configure_file(
${PROJECT_SOURCE_DIR}/cmake/Templates/args.gn.in
${ROCPROFSYS_PERFETTO_BINARY_DIR}/args.gn
@ONLY
)
2022-05-11 15:05:09 -05:00
# ---------------------------------------------------------------------------------------#
#
# build tools
#
# ---------------------------------------------------------------------------------------#
if(ROCPROFSYS_INSTALL_PERFETTO_TOOLS)
2025-06-22 10:44:33 -04:00
find_program(ROCPROFSYS_CURL_EXECUTABLE NAMES curl PATH_SUFFIXES bin)
2022-05-11 15:05:09 -05:00
if(NOT ROCPROFSYS_CURL_EXECUTABLE)
rocprofiler_systems_message(
2022-05-11 15:05:09 -05:00
SEND_ERROR
"curl executable cannot be found. install-build-deps script for perfetto will fail"
2025-06-22 10:44:33 -04:00
)
2022-05-11 15:05:09 -05:00
endif()
2025-06-22 10:44:33 -04:00
ExternalProject_Add(
rocprofiler-systems-perfetto-build
2022-05-11 15:05:09 -05:00
PREFIX ${PROJECT_BINARY_DIR}/external/perfetto
SOURCE_DIR ${ROCPROFSYS_PERFETTO_SOURCE_DIR}
2022-05-11 15:05:09 -05:00
BUILD_IN_SOURCE 1
PATCH_COMMAND ${ROCPROFSYS_PERFETTO_TOOLS_DIR}/install-build-deps
2025-06-22 10:44:33 -04:00
CONFIGURE_COMMAND
${ROCPROFSYS_PERFETTO_TOOLS_DIR}/gn gen ${ROCPROFSYS_PERFETTO_BINARY_DIR}
BUILD_COMMAND
${ROCPROFSYS_NINJA_EXECUTABLE} -C ${ROCPROFSYS_PERFETTO_BINARY_DIR} -j
${ROCPROFSYS_PERFETTO_BUILD_THREADS}
2022-05-11 15:05:09 -05:00
INSTALL_COMMAND ""
2025-06-22 10:44:33 -04:00
BUILD_BYPRODUCTS ${ROCPROFSYS_PERFETTO_BINARY_DIR}/args.gn
)
2022-05-11 15:05:09 -05:00
add_custom_target(
rocprofiler-systems-perfetto-clean
COMMAND ${ROCPROFSYS_NINJA_EXECUTABLE} -t clean
COMMAND
${CMAKE_COMMAND} -E rm -rf
${PROJECT_BINARY_DIR}/external/perfetto/src/rocprof-sys-perfetto-build-stamp
WORKING_DIRECTORY ${ROCPROFSYS_PERFETTO_BINARY_DIR}
2025-06-22 10:44:33 -04:00
COMMENT "Cleaning Perfetto..."
)
2022-05-11 15:05:09 -05:00
install(
DIRECTORY ${ROCPROFSYS_PERFETTO_INSTALL_DIR}/
DESTINATION ${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}
2022-07-23 03:02:31 -05:00
COMPONENT perfetto
2022-05-11 15:05:09 -05:00
FILES_MATCHING
2025-06-22 10:44:33 -04:00
PATTERN "*libperfetto.so*"
)
foreach(
_FILE
perfetto
traced
tracebox
traced_probes
traced_perf
trigger_perfetto
)
2022-07-23 03:02:31 -05:00
if("${_FILE}" STREQUAL "perfetto")
string(REPLACE "_" "-" _INSTALL_FILE "rocprof-sys-${_FILE}")
2022-07-23 03:02:31 -05:00
else()
string(REPLACE "_" "-" _INSTALL_FILE "rocprof-sys-perfetto-${_FILE}")
2022-07-23 03:02:31 -05:00
endif()
2022-05-11 15:05:09 -05:00
install(
PROGRAMS ${ROCPROFSYS_PERFETTO_INSTALL_DIR}/${_FILE}
2022-05-11 15:05:09 -05:00
DESTINATION ${CMAKE_INSTALL_BINDIR}
2022-07-23 03:02:31 -05:00
COMPONENT perfetto
RENAME ${_INSTALL_FILE}
2025-06-22 10:44:33 -04:00
OPTIONAL
)
2022-05-11 15:05:09 -05:00
endforeach()
endif()
# ---------------------------------------------------------------------------------------#
#
# perfetto static library
#
# ---------------------------------------------------------------------------------------#
add_library(rocprofiler-systems-perfetto-library STATIC)
2025-06-22 10:44:33 -04:00
add_library(
rocprofiler-systems::rocprofiler-systems-perfetto-library
ALIAS rocprofiler-systems-perfetto-library
)
2022-05-11 15:05:09 -05:00
target_sources(
rocprofiler-systems-perfetto-library
2025-06-22 10:44:33 -04:00
PRIVATE
${ROCPROFSYS_PERFETTO_SOURCE_DIR}/sdk/perfetto.cc
${ROCPROFSYS_PERFETTO_SOURCE_DIR}/sdk/perfetto.h
)
2022-05-11 15:05:09 -05:00
target_link_libraries(
rocprofiler-systems-perfetto-library
2025-06-22 10:44:33 -04:00
PRIVATE
rocprofiler-systems::rocprofiler-systems-threading
rocprofiler-systems::rocprofiler-systems-static-libgcc
rocprofiler-systems::rocprofiler-systems-static-libstdcxx
)
2022-05-11 15:05:09 -05:00
set_target_properties(
rocprofiler-systems-perfetto-library
2025-06-22 10:44:33 -04:00
PROPERTIES
OUTPUT_NAME perfetto
ARCHIVE_OUTPUT_DIRECTORY ${ROCPROFSYS_PERFETTO_BINARY_DIR}
POSITION_INDEPENDENT_CODE ON
CXX_VISIBILITY_PRESET "internal"
)
2022-05-11 15:05:09 -05:00
set(perfetto_DIR ${ROCPROFSYS_PERFETTO_SOURCE_DIR})
2022-05-11 15:05:09 -05:00
set(PERFETTO_ROOT_DIR
${ROCPROFSYS_PERFETTO_SOURCE_DIR}
2025-06-22 10:44:33 -04:00
CACHE PATH
"Root Perfetto installation"
FORCE
)
2022-05-11 15:05:09 -05:00
set(PERFETTO_INCLUDE_DIR
${ROCPROFSYS_PERFETTO_SOURCE_DIR}/sdk
2025-06-22 10:44:33 -04:00
CACHE PATH
"Perfetto include folder"
FORCE
)
2022-05-11 15:05:09 -05:00
set(PERFETTO_LIBRARY
${ROCPROFSYS_PERFETTO_BINARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}perfetto${CMAKE_STATIC_LIBRARY_SUFFIX}
2025-06-22 10:44:33 -04:00
CACHE FILEPATH
"Perfetto library"
FORCE
)
2022-05-11 15:05:09 -05:00
mark_as_advanced(PERFETTO_ROOT_DIR)
mark_as_advanced(PERFETTO_INCLUDE_DIR)
mark_as_advanced(PERFETTO_LIBRARY)
# ---------------------------------------------------------------------------------------#
#
# perfetto interface library
#
# ---------------------------------------------------------------------------------------#
rocprofiler_systems_target_compile_definitions(rocprofiler-systems-perfetto
2025-06-22 10:44:33 -04:00
INTERFACE ROCPROFSYS_USE_PERFETTO
)
target_include_directories(
rocprofiler-systems-perfetto
SYSTEM
INTERFACE $<BUILD_INTERFACE:${PERFETTO_INCLUDE_DIR}>
)
2022-05-11 15:05:09 -05:00
target_link_libraries(
rocprofiler-systems-perfetto
2025-06-22 10:44:33 -04:00
INTERFACE
$<BUILD_INTERFACE:${PERFETTO_LIBRARY}>
$<BUILD_INTERFACE:rocprofiler-systems::rocprofiler-systems-threading>
)