1688a027d8
- additional miscellaneous tweaks to workflows and docker scripts, e.g. install perfetto python bindings - improves the stability of MPI finalization - reduces some debug messages within timemory when `OMNITRACE_DEBUG=ON` - fixes issue found in RHEL where libunwind is using mutex and omnitrace was not treating this as an internal mutex call - this may have been affecting the causal profiling slightly (tests seem a bit more stable now) - fix data race in timemory * Add RedHat CI and release packaging - additional miscellaneous tweaks to workflows and docker scripts, e.g. install perfetto python bindings * Fix URL for ROCm packages in redhat workflow * Fix dnf --enable-repo for ROCm perl packages * Dockerfile.rhel and redhat.yml updates - Fix dnf repo for ROCm PERL packages - Disable python in CI (interpreter segfaults) - Exclude parallel-overhead-locks tests due to inclusion of internal locks - This needs to be remedied in the future * Exclude _dl_relocate_static_pie from instrumentation * Testing updates - OMNITRACE_SAMPLING_KEEP_INTERNAL=OFF for parallel-overhead-locks * Fix redhat workflow * redhat.yml update - remove if condition on config/build/test step * Update timemory submodule - tweaks to verbosity messages * Set thread state before unw_step - on Redhat, unw_step calls mutex * Update timemory submodule - verbosity changes - gotcha uses spin_lock/spin_mutex * Remove using gsplit-dwarf unless OMNITRACE_BUILD_NUMBER > 2 * Re-enable parallel-overhead-locks tests in redhat workflow * Always disable timemory manager metadata auto output * testing updates - tweak parallel-overhead-locks-timemory to higher instruction count min - OMNITRACE_SAMPLING_KEEP_INTERNAL=OFF for parallel-overhead-locks-perfetto * Update timemory submodule - quiet realpath queries * omnitrace exe updates - detect text files - improved bin/lib locating * cmake format * test-install.sh and redhat workflow updates - handle testing when ls is script - re-enable python testing on redhat workflow - invoke test-install.sh in redhat workflow * Misc guards for finalization * omnitrace-exe, testing updates - test-install.sh: LS_EXEC -> LS_NAME - handle /usr/bin/ls being script in source/bin/tests - improve locating the binary * Fix mpi_gotcha compile error * omnitrace-exe updates - improve file locating * formatting * Misc fixes - remove -static-libstdc++ for RHEL packaging (rocky-linux doesn't distribute static lib) * omnitrace-exe paths * Replace realpath with absolute - using absolute path to symlink fixes issues with locating libdyninstAPI_RT at runtime * omnitrace exe updates - judicious use of realpath * Update timemory submodule - fix update main hash ids/aliases data race in merge * bin tests update - change working directory of omnitrace-exe-simulate-lib-basename * omnitrace exe updates - Update resolved exe/lib messaging * bin tests update - change working directory of omnitrace-exe-simulate-lib-basename
237 lines
8.6 KiB
CMake
237 lines
8.6 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"
|
|
CACHE STRING "Perfetto C flags")
|
|
set(OMNITRACE_PERFETTO_CXX_FLAGS
|
|
"-static-libgcc -Wno-maybe-uninitialized"
|
|
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>)
|