Fichiers
Aleksandar Djordjevic f39a60ac25 [rocprofiler-systems] Apply new CMake formatting for the latest gersemi version (#1778)
* Fix cmake formatting

* Updated rev. in `.pre-commit-config.yaml`

* Pin the gersemi used in CI to v0.23.1, matching the pre-commit

---------

Co-authored-by: Aleksandar Djordjevic <adjordje@amd.com>
Co-authored-by: David Galiffi <David.Galiffi@amd.com>
2025-11-10 13:08:44 -05:00

387 lignes
11 KiB
CMake

# ======================================================================================
# PAPI.cmake
#
# Configure papi for rocprofiler-systems
#
# ======================================================================================
include_guard(GLOBAL)
rocprofiler_systems_checkout_git_submodule(
RELATIVE_PATH external/papi
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
REPO_URL https://bitbucket.org/icl/papi.git
REPO_BRANCH effd1ef4e0fd4b80e36546791277215a2d6b9eba
TEST_FILE src/configure
)
set(PAPI_LIBPFM_SOVERSION "4.11.1" CACHE STRING "libpfm.so version")
set(ROCPROFSYS_PAPI_SOURCE_DIR ${PROJECT_BINARY_DIR}/external/papi/source)
set(ROCPROFSYS_PAPI_INSTALL_DIR ${PROJECT_BINARY_DIR}/external/papi/install)
if(NOT EXISTS "${ROCPROFSYS_PAPI_SOURCE_DIR}")
execute_process(
COMMAND
${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/external/papi
${ROCPROFSYS_PAPI_SOURCE_DIR}
)
endif()
if(NOT EXISTS "${ROCPROFSYS_PAPI_INSTALL_DIR}")
execute_process(
COMMAND ${CMAKE_COMMAND} -E make_directory ${ROCPROFSYS_PAPI_INSTALL_DIR}
)
execute_process(
COMMAND ${CMAKE_COMMAND} -E make_directory ${ROCPROFSYS_PAPI_INSTALL_DIR}/include
)
execute_process(
COMMAND ${CMAKE_COMMAND} -E make_directory ${ROCPROFSYS_PAPI_INSTALL_DIR}/lib
)
execute_process(
COMMAND
${CMAKE_COMMAND} -E touch ${ROCPROFSYS_PAPI_INSTALL_DIR}/lib/libpapi.a
${ROCPROFSYS_PAPI_INSTALL_DIR}/lib/libpfm.a
${ROCPROFSYS_PAPI_INSTALL_DIR}/lib/libpfm.so
)
set(_ROCPROFSYS_PAPI_BUILD_BYPRODUCTS
${ROCPROFSYS_PAPI_INSTALL_DIR}/lib/libpapi.a
${ROCPROFSYS_PAPI_INSTALL_DIR}/lib/libpfm.a
${ROCPROFSYS_PAPI_INSTALL_DIR}/lib/libpfm.so
)
endif()
# Set ROCPROFSYS_PAPI_CONFIGURE_JOBS for commands that need to be run nonparallel
set(ROCPROFSYS_PAPI_CONFIGURE_JOBS 1)
rocprofiler_systems_add_option(ROCPROFSYS_PAPI_AUTO_COMPONENTS
"Automatically enable components" OFF
)
# -------------- PACKAGES -----------------------------------------------------
set(_ROCPROFSYS_VALID_PAPI_COMPONENTS
appio
bgpm
coretemp
coretemp_freebsd
cuda
emon
example
host_micpower
infiniband
intel_gpu
io
libmsr
lmsensors
lustre
micpower
mx
net
nvml
pcp
perfctr
perfctr_ppc
perf_event
perf_event_uncore
perfmon2
perfmon_ia64
perfnec
powercap
powercap_ppc
rapl
rocm
rocm_smi
sde
sensors_ppc
stealtime
sysdetect
vmware
)
set(ROCPROFSYS_VALID_PAPI_COMPONENTS
"${_ROCPROFSYS_VALID_PAPI_COMPONENTS}"
CACHE STRING
"Valid PAPI components"
)
mark_as_advanced(ROCPROFSYS_VALID_PAPI_COMPONENTS)
# default components which do not require 3rd-party headers or libraries
set(_ROCPROFSYS_PAPI_COMPONENTS
appio
coretemp
io
infiniband
# lustre micpower mx
net
perf_event
perf_event_uncore
# rapl stealtime
)
if(ROCPROFSYS_PAPI_AUTO_COMPONENTS)
# lmsensors
find_path(
ROCPROFSYS_PAPI_LMSENSORS_ROOT_DIR
NAMES include/sensors/sensors.h include/sensors.h
)
if(ROCPROFSYS_PAPI_LMSENSORS_ROOT_DIR)
list(APPEND _ROCPROFSYS_PAPI_COMPONENTS lmsensors)
endif()
# pcp
find_path(ROCPROFSYS_PAPI_PCP_ROOT_DIR NAMES include/pcp/impl.h)
find_library(ROCPROFSYS_PAPI_PCP_LIBRARY NAMES pcp PATH_SUFFIXES lib lib64)
if(ROCPROFSYS_PAPI_PCP_ROOT_DIR AND ROCPROFSYS_PAPI_PCP_LIBRARY)
list(APPEND _ROCPROFSYS_PAPI_COMPONENTS pcp)
endif()
endif()
# set the ROCPROFSYS_PAPI_COMPONENTS cache variable
set(ROCPROFSYS_PAPI_COMPONENTS
"${_ROCPROFSYS_PAPI_COMPONENTS}"
CACHE STRING
"PAPI components"
)
rocprofiler_systems_add_feature(ROCPROFSYS_PAPI_COMPONENTS "PAPI components")
string(REPLACE ";" "\ " _ROCPROFSYS_PAPI_COMPONENTS "${ROCPROFSYS_PAPI_COMPONENTS}")
set(ROCPROFSYS_PAPI_EXTRA_ENV)
foreach(_COMP ${ROCPROFSYS_PAPI_COMPONENTS})
string(
REPLACE
";"
", "
_ROCPROFSYS_VALID_PAPI_COMPONENTS_MSG
"${ROCPROFSYS_VALID_PAPI_COMPONENTS}"
)
if(NOT "${_COMP}" IN_LIST ROCPROFSYS_VALID_PAPI_COMPONENTS)
rocprofiler_systems_message(
AUTHOR_WARNING
"ROCPROFSYS_PAPI_COMPONENTS contains an unknown component '${_COMP}'. Known components: ${_ROCPROFSYS_VALID_PAPI_COMPONENTS_MSG}"
)
endif()
unset(_ROCPROFSYS_VALID_PAPI_COMPONENTS_MSG)
endforeach()
if("rocm" IN_LIST ROCPROFSYS_PAPI_COMPONENTS)
find_package(ROCmVersion REQUIRED)
list(APPEND ROCPROFSYS_PAPI_EXTRA_ENV PAPI_ROCM_ROOT=${ROCmVersion_DIR})
endif()
if("lmsensors" IN_LIST ROCPROFSYS_PAPI_COMPONENTS AND ROCPROFSYS_PAPI_LMSENSORS_ROOT_DIR)
list(
APPEND ROCPROFSYS_PAPI_EXTRA_ENV
PAPI_LMSENSORS_ROOT=${ROCPROFSYS_PAPI_LMSENSORS_ROOT_DIR}
)
endif()
if("pcp" IN_LIST ROCPROFSYS_PAPI_COMPONENTS AND ROCPROFSYS_PAPI_PCP_ROOT_DIR)
list(APPEND ROCPROFSYS_PAPI_EXTRA_ENV PAPI_PCP_ROOT=${ROCPROFSYS_PAPI_PCP_ROOT_DIR})
endif()
if(
"perf_event_uncore" IN_LIST ROCPROFSYS_PAPI_COMPONENTS
AND NOT "perf_event" IN_LIST ROCPROFSYS_PAPI_COMPONENTS
)
rocprofiler_systems_message(
FATAL_ERROR
"ROCPROFSYS_PAPI_COMPONENTS :: 'perf_event_uncore' requires 'perf_event' component"
)
endif()
find_program(MAKE_EXECUTABLE NAMES make gmake PATH_SUFFIXES bin)
if(NOT MAKE_EXECUTABLE)
rocprofiler_systems_message(
FATAL_ERROR
"make/gmake executable not found. Please re-run with -DMAKE_EXECUTABLE=/path/to/make"
)
endif()
set(_PAPI_C_COMPILER ${CMAKE_C_COMPILER})
if(CMAKE_C_COMPILER_IS_CLANG)
find_program(ROCPROFSYS_GNU_C_COMPILER NAMES gcc)
if(ROCPROFSYS_GNU_C_COMPILER)
set(_PAPI_C_COMPILER ${ROCPROFSYS_GNU_C_COMPILER})
endif()
endif()
set(PAPI_C_COMPILER ${_PAPI_C_COMPILER} CACHE FILEPATH "C compiler used to compile PAPI")
include(ExternalProject)
ExternalProject_Add(
rocprofiler-systems-papi-build
PREFIX ${PROJECT_BINARY_DIR}/external/papi
SOURCE_DIR ${ROCPROFSYS_PAPI_SOURCE_DIR}/src
BUILD_IN_SOURCE 1
PATCH_COMMAND
${CMAKE_COMMAND} -E env CC=${PAPI_C_COMPILER}
CFLAGS=-fPIC\ -O3\ -Wno-stringop-truncation\ -Wno-use-after-free LIBS=-lrt
LDFLAGS=-lrt ${ROCPROFSYS_PAPI_EXTRA_ENV} <SOURCE_DIR>/configure --quiet
--prefix=${ROCPROFSYS_PAPI_INSTALL_DIR} --with-static-lib=yes --with-shared-lib=no
--with-perf-events --with-tests=no
--with-components=${_ROCPROFSYS_PAPI_COMPONENTS}
--libdir=${ROCPROFSYS_PAPI_INSTALL_DIR}/lib
CONFIGURE_COMMAND
${CMAKE_COMMAND} -E env
CFLAGS=-fPIC\ -O3\ -Wno-stringop-truncation\ -Wno-use-after-free
${ROCPROFSYS_PAPI_EXTRA_ENV} ${MAKE_EXECUTABLE} static install -s -j
${ROCPROFSYS_PAPI_CONFIGURE_JOBS}
BUILD_COMMAND
${CMAKE_COMMAND} -E env
CFLAGS=-fPIC\ -O3\ -Wno-stringop-truncation\ -Wno-use-after-free
${ROCPROFSYS_PAPI_EXTRA_ENV} ${MAKE_EXECUTABLE} utils install-utils -s
INSTALL_COMMAND ""
BUILD_BYPRODUCTS "${_ROCPROFSYS_PAPI_BUILD_BYPRODUCTS}"
)
# target for re-executing the installation
add_custom_target(
rocprofiler-systems-papi-install
COMMAND
${CMAKE_COMMAND} -E env
CFLAGS=-fPIC\ -O3\ -Wno-stringop-truncation\ -Wno-use-after-free
${ROCPROFSYS_PAPI_EXTRA_ENV} ${MAKE_EXECUTABLE} static install -s
COMMAND
${CMAKE_COMMAND} -E env
CFLAGS=-fPIC\ -O3\ -Wno-stringop-truncation\ -Wno-use-after-free
${ROCPROFSYS_PAPI_EXTRA_ENV} ${MAKE_EXECUTABLE} utils install-utils -s
WORKING_DIRECTORY ${ROCPROFSYS_PAPI_SOURCE_DIR}/src
COMMENT "Installing PAPI..."
)
add_custom_target(
rocprofiler-systems-papi-clean
COMMAND ${MAKE_EXECUTABLE} distclean
COMMAND ${CMAKE_COMMAND} -E rm -rf ${ROCPROFSYS_PAPI_INSTALL_DIR}/include/*
COMMAND ${CMAKE_COMMAND} -E rm -rf ${ROCPROFSYS_PAPI_INSTALL_DIR}/lib/*
COMMAND
${CMAKE_COMMAND} -E touch ${ROCPROFSYS_PAPI_INSTALL_DIR}/lib/libpapi.a
${ROCPROFSYS_PAPI_INSTALL_DIR}/lib/libpfm.a
${ROCPROFSYS_PAPI_INSTALL_DIR}/lib/libpfm.so
WORKING_DIRECTORY ${ROCPROFSYS_PAPI_SOURCE_DIR}/src
COMMENT "Cleaning PAPI..."
)
set(PAPI_ROOT_DIR
${ROCPROFSYS_PAPI_INSTALL_DIR}
CACHE PATH
"Root PAPI installation"
FORCE
)
set(PAPI_INCLUDE_DIR
${ROCPROFSYS_PAPI_INSTALL_DIR}/include
CACHE PATH
"PAPI include folder"
FORCE
)
set(PAPI_LIBRARY
${ROCPROFSYS_PAPI_INSTALL_DIR}/lib/libpapi.a
CACHE FILEPATH
"PAPI library"
FORCE
)
set(PAPI_pfm_LIBRARY
${ROCPROFSYS_PAPI_INSTALL_DIR}/lib/libpfm.so
CACHE FILEPATH
"PAPI library"
FORCE
)
set(PAPI_STATIC_LIBRARY
${ROCPROFSYS_PAPI_INSTALL_DIR}/lib/libpapi.a
CACHE FILEPATH
"PAPI library"
FORCE
)
set(PAPI_pfm_STATIC_LIBRARY
${ROCPROFSYS_PAPI_INSTALL_DIR}/lib/libpfm.a
CACHE FILEPATH
"PAPI library"
FORCE
)
target_include_directories(
rocprofiler-systems-papi
SYSTEM
INTERFACE $<BUILD_INTERFACE:${PAPI_INCLUDE_DIR}>
)
target_link_libraries(
rocprofiler-systems-papi
INTERFACE $<BUILD_INTERFACE:${PAPI_LIBRARY}> $<BUILD_INTERFACE:${PAPI_pfm_LIBRARY}>
)
rocprofiler_systems_target_compile_definitions(
rocprofiler-systems-papi INTERFACE ROCPROFSYS_USE_PAPI
$<BUILD_INTERFACE:TIMEMORY_USE_PAPI=1>
)
install(
DIRECTORY ${ROCPROFSYS_PAPI_INSTALL_DIR}/lib/
DESTINATION ${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}
COMPONENT papi
FILES_MATCHING
PATTERN "*.so*"
)
foreach(
_UTIL_EXE
papi_avail
papi_clockres
papi_command_line
papi_component_avail
papi_cost
papi_decode
papi_error_codes
papi_event_chooser
papi_hardware_avail
papi_hl_output_writer.py
papi_mem_info
papi_multiplex_cost
papi_native_avail
papi_version
papi_xml_event_info
)
string(REPLACE "_" "-" _UTIL_EXE_INSTALL_NAME "${BINARY_NAME_PREFIX}-${_UTIL_EXE}")
# RPM installer on RedHat/RockyLinux throws error that #!/usr/bin/python should either
# be #!/usr/bin/python2 or #!/usr/bin/python3
if(_UTIL_EXE STREQUAL "papi_hl_output_writer.py")
file(
READ
"${PROJECT_BINARY_DIR}/external/papi/source/src/high-level/scripts/${_UTIL_EXE}"
_HL_OUTPUT_WRITER
)
string(
REPLACE
"#!/usr/bin/python\n"
"#!/usr/bin/python3\n"
_HL_OUTPUT_WRITER
"${_HL_OUTPUT_WRITER}"
)
file(MAKE_DIRECTORY "${ROCPROFSYS_PAPI_INSTALL_DIR}/bin")
file(
WRITE "${ROCPROFSYS_PAPI_INSTALL_DIR}/bin/${_UTIL_EXE}3"
"${_HL_OUTPUT_WRITER}"
)
set(_UTIL_EXE "${_UTIL_EXE}3")
# python script file install to libexec
install(
PROGRAMS ${ROCPROFSYS_PAPI_INSTALL_DIR}/bin/${_UTIL_EXE}
DESTINATION ${CMAKE_INSTALL_LIBEXECDIR}/${PROJECT_NAME}
RENAME ${_UTIL_EXE_INSTALL_NAME}
COMPONENT papi
OPTIONAL
)
else()
# Binary files moved to bin
install(
PROGRAMS ${ROCPROFSYS_PAPI_INSTALL_DIR}/bin/${_UTIL_EXE}
DESTINATION ${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}
RENAME ${_UTIL_EXE_INSTALL_NAME}
COMPONENT papi
OPTIONAL
)
endif()
endforeach()