Files
rocm-systems/cmake/Perfetto.cmake
T
ajanicijamd 96d7b8f0ab Update Perfetto and fix tests (#378)
Fix for "SWDEV-479652" - Perfetto-based tests are failing.

Updated version of perfetto submodule to v46.0.
Modified Omnitrace code that uses Perfetto, so it can compile.
Modified the testing code, so it can run the version of trace_processor_shell provided (v46.0).

---------

Signed-off-by: Aleksandar Janicijevic <Aleksandar.Janicijevic@amd.com>
Co-authored-by: David Galiffi <David.Galiffi@amd.com>
2024-09-13 13:43:26 -04:00

237 lines
8.7 KiB
CMake

# ======================================================================================
# Perfetto.cmake
#
# Configure perfetto for omnitrace
#
# ======================================================================================
include_guard(GLOBAL)
include(ExternalProject)
include(ProcessorCount)
# ---------------------------------------------------------------------------------------#
#
# executables and libraries
#
# ---------------------------------------------------------------------------------------#
find_program(
OMNITRACE_COPY_EXECUTABLE
NAMES cp
PATH_SUFFIXES bin)
find_program(
OMNITRACE_NINJA_EXECUTABLE
NAMES ninja
PATH_SUFFIXES bin)
mark_as_advanced(OMNITRACE_COPY_EXECUTABLE)
mark_as_advanced(OMNITRACE_NINJA_EXECUTABLE)
# ---------------------------------------------------------------------------------------#
#
# variables
#
# ---------------------------------------------------------------------------------------#
processorcount(NUM_PROCS_REAL)
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(OMNITRACE_PERFETTO_SOURCE_DIR ${PROJECT_BINARY_DIR}/external/perfetto/source)
set(OMNITRACE_PERFETTO_TOOLS_DIR ${PROJECT_BINARY_DIR}/external/perfetto/source/tools)
set(OMNITRACE_PERFETTO_BINARY_DIR
${PROJECT_BINARY_DIR}/external/perfetto/source/out/linux)
set(OMNITRACE_PERFETTO_INSTALL_DIR
${PROJECT_BINARY_DIR}/external/perfetto/source/out/linux/stripped)
set(OMNITRACE_PERFETTO_LINK_FLAGS
"-static-libgcc"
CACHE STRING "Link flags for perfetto")
set(OMNITRACE_PERFETTO_BUILD_THREADS
${_NUM_THREADS}
CACHE STRING "Number of threads to use when building perfetto tools")
if(CMAKE_CXX_COMPILER_IS_CLANG)
set(PERFETTO_IS_CLANG true)
set(OMNITRACE_PERFETTO_C_FLAGS
""
CACHE STRING "Perfetto C flags")
set(OMNITRACE_PERFETTO_CXX_FLAGS
""
CACHE STRING "Perfetto C++ flags")
else()
set(PERFETTO_IS_CLANG false)
set(OMNITRACE_PERFETTO_C_FLAGS
"-static-libgcc -Wno-maybe-uninitialized -Wno-stringop-overflow"
CACHE STRING "Perfetto C flags")
set(OMNITRACE_PERFETTO_CXX_FLAGS
"-static-libgcc -Wno-maybe-uninitialized -Wno-stringop-overflow -Wno-mismatched-new-delete"
CACHE STRING "Perfetto C++ flags")
endif()
mark_as_advanced(OMNITRACE_PERFETTO_C_FLAGS)
mark_as_advanced(OMNITRACE_PERFETTO_CXX_FLAGS)
mark_as_advanced(OMNITRACE_PERFETTO_LINK_FLAGS)
if(NOT OMNITRACE_NINJA_EXECUTABLE)
set(OMNITRACE_NINJA_EXECUTABLE
${OMNITRACE_PERFETTO_TOOLS_DIR}/ninja
CACHE FILEPATH "Ninja" FORCE)
endif()
# ---------------------------------------------------------------------------------------#
#
# source tree
#
# ---------------------------------------------------------------------------------------#
if(NOT EXISTS "${OMNITRACE_PERFETTO_SOURCE_DIR}")
execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory
${PROJECT_BINARY_DIR}/external/perfetto)
# cmake -E copy_directory fails for some reason
execute_process(
COMMAND ${OMNITRACE_COPY_EXECUTABLE} -r ${PROJECT_SOURCE_DIR}/external/perfetto/
${OMNITRACE_PERFETTO_SOURCE_DIR})
endif()
file(READ ${PROJECT_SOURCE_DIR}/external/perfetto/sdk/perfetto.h _PERFETTO_HEADER)
string(
REGEX
REPLACE " perfetto::internal::ValidateEventNameType"
" ::perfetto::internal::ValidateEventNameType" _PERFETTO_HEADER
"${_PERFETTO_HEADER}")
if(OMNITRACE_USE_SANITIZER AND OMNITRACE_SANITIZER_TYPE MATCHES "address")
string(REPLACE "__asan_poison_memory_region((a), (s))" "" _PERFETTO_HEADER
"${_PERFETTO_HEADER}")
string(REPLACE "__asan_unpoison_memory_region((a), (s))" "" _PERFETTO_HEADER
"${_PERFETTO_HEADER}")
endif()
file(WRITE ${OMNITRACE_PERFETTO_SOURCE_DIR}/sdk/perfetto.h.tmp "${_PERFETTO_HEADER}")
configure_file(${OMNITRACE_PERFETTO_SOURCE_DIR}/sdk/perfetto.h.tmp
${OMNITRACE_PERFETTO_SOURCE_DIR}/sdk/perfetto.h COPYONLY)
configure_file(${PROJECT_SOURCE_DIR}/external/perfetto/sdk/perfetto.cc
${OMNITRACE_PERFETTO_SOURCE_DIR}/sdk/perfetto.cc COPYONLY)
configure_file(${PROJECT_SOURCE_DIR}/cmake/Templates/args.gn.in
${OMNITRACE_PERFETTO_BINARY_DIR}/args.gn @ONLY)
# ---------------------------------------------------------------------------------------#
#
# build tools
#
# ---------------------------------------------------------------------------------------#
if(OMNITRACE_INSTALL_PERFETTO_TOOLS)
find_program(
OMNITRACE_CURL_EXECUTABLE
NAMES curl
PATH_SUFFIXES bin)
if(NOT OMNITRACE_CURL_EXECUTABLE)
omnitrace_message(
SEND_ERROR
"curl executable cannot be found. install-build-deps script for perfetto will fail"
)
endif()
externalproject_add(
omnitrace-perfetto-build
PREFIX ${PROJECT_BINARY_DIR}/external/perfetto
SOURCE_DIR ${OMNITRACE_PERFETTO_SOURCE_DIR}
BUILD_IN_SOURCE 1
PATCH_COMMAND ${OMNITRACE_PERFETTO_TOOLS_DIR}/install-build-deps
CONFIGURE_COMMAND ${OMNITRACE_PERFETTO_TOOLS_DIR}/gn gen
${OMNITRACE_PERFETTO_BINARY_DIR}
BUILD_COMMAND ${OMNITRACE_NINJA_EXECUTABLE} -C ${OMNITRACE_PERFETTO_BINARY_DIR} -j
${OMNITRACE_PERFETTO_BUILD_THREADS}
INSTALL_COMMAND ""
BUILD_BYPRODUCTS ${OMNITRACE_PERFETTO_BINARY_DIR}/args.gn)
add_custom_target(
omnitrace-perfetto-clean
COMMAND ${OMNITRACE_NINJA_EXECUTABLE} -t clean
COMMAND ${CMAKE_COMMAND} -E rm -rf
${PROJECT_BINARY_DIR}/external/perfetto/src/omnitrace-perfetto-build-stamp
WORKING_DIRECTORY ${OMNITRACE_PERFETTO_BINARY_DIR}
COMMENT "Cleaning Perfetto...")
install(
DIRECTORY ${OMNITRACE_PERFETTO_INSTALL_DIR}/
DESTINATION ${CMAKE_INSTALL_LIBDIR}/omnitrace
COMPONENT perfetto
FILES_MATCHING
PATTERN "*libperfetto.so*")
foreach(_FILE perfetto traced tracebox traced_probes traced_perf trigger_perfetto)
if("${_FILE}" STREQUAL "perfetto")
string(REPLACE "_" "-" _INSTALL_FILE "omnitrace-${_FILE}")
else()
string(REPLACE "_" "-" _INSTALL_FILE "omnitrace-perfetto-${_FILE}")
endif()
install(
PROGRAMS ${OMNITRACE_PERFETTO_INSTALL_DIR}/${_FILE}
DESTINATION ${CMAKE_INSTALL_BINDIR}
COMPONENT perfetto
RENAME ${_INSTALL_FILE}
OPTIONAL)
endforeach()
endif()
# ---------------------------------------------------------------------------------------#
#
# perfetto static library
#
# ---------------------------------------------------------------------------------------#
add_library(omnitrace-perfetto-library STATIC)
add_library(omnitrace::omnitrace-perfetto-library ALIAS omnitrace-perfetto-library)
target_sources(
omnitrace-perfetto-library PRIVATE ${OMNITRACE_PERFETTO_SOURCE_DIR}/sdk/perfetto.cc
${OMNITRACE_PERFETTO_SOURCE_DIR}/sdk/perfetto.h)
target_link_libraries(
omnitrace-perfetto-library
PRIVATE omnitrace::omnitrace-threading omnitrace::omnitrace-static-libgcc
omnitrace::omnitrace-static-libstdcxx)
set_target_properties(
omnitrace-perfetto-library
PROPERTIES OUTPUT_NAME perfetto
ARCHIVE_OUTPUT_DIRECTORY ${OMNITRACE_PERFETTO_BINARY_DIR}
POSITION_INDEPENDENT_CODE ON
CXX_VISIBILITY_PRESET "internal")
set(perfetto_DIR ${OMNITRACE_PERFETTO_SOURCE_DIR})
set(PERFETTO_ROOT_DIR
${OMNITRACE_PERFETTO_SOURCE_DIR}
CACHE PATH "Root Perfetto installation" FORCE)
set(PERFETTO_INCLUDE_DIR
${OMNITRACE_PERFETTO_SOURCE_DIR}/sdk
CACHE PATH "Perfetto include folder" FORCE)
set(PERFETTO_LIBRARY
${OMNITRACE_PERFETTO_BINARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}perfetto${CMAKE_STATIC_LIBRARY_SUFFIX}
CACHE FILEPATH "Perfetto library" FORCE)
mark_as_advanced(PERFETTO_ROOT_DIR)
mark_as_advanced(PERFETTO_INCLUDE_DIR)
mark_as_advanced(PERFETTO_LIBRARY)
# ---------------------------------------------------------------------------------------#
#
# perfetto interface library
#
# ---------------------------------------------------------------------------------------#
omnitrace_target_compile_definitions(omnitrace-perfetto INTERFACE OMNITRACE_USE_PERFETTO)
target_include_directories(omnitrace-perfetto SYSTEM
INTERFACE $<BUILD_INTERFACE:${PERFETTO_INCLUDE_DIR}>)
target_link_libraries(
omnitrace-perfetto INTERFACE $<BUILD_INTERFACE:${PERFETTO_LIBRARY}>
$<BUILD_INTERFACE:omnitrace::omnitrace-threading>)