Files
rocm-systems/cmake/Perfetto.cmake
T
Jonathan R. Madsen 1688a027d8 Add RedHat CI and release packaging (#251)
- 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
2023-03-07 06:04:19 -06:00

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>)