diff --git a/CMakeLists.txt b/CMakeLists.txt index a2a74a2329..d4a74defdd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -116,11 +116,49 @@ set(CPACK_PACKAGE_CONTACT "AMD-SMILib Support " CACHE S generic_package() -## Dependencies +# Dependencies find_package(Threads REQUIRED) pkg_check_modules(DRM REQUIRED IMPORTED_TARGET libdrm) pkg_check_modules(DRM_AMDGPU REQUIRED IMPORTED_TARGET libdrm_amdgpu) +# Configuration +function(get_imported_soname target out_var) + get_target_property(link_libs ${target} INTERFACE_LINK_LIBRARIES) + set(result) + foreach(link_lib ${link_libs}) + if(result) + message(FATAL_ERROR "Target ${target} has multiple link libraries: ${link_libs}") + endif() + execute_process( + COMMAND objdump -p "${link_lib}" + OUTPUT_VARIABLE OBJDUMP_OUTPUT + RESULT_VARIABLE OBJDUMP_RESULT + ) + if(OBJDUMP_RESULT EQUAL 0) + string(REGEX MATCH "SONAME +([^ \n]+)" SONAME_MATCH "${OBJDUMP_OUTPUT}") + if(SONAME_MATCH) + set(SONAME_OF_MY_PKG "${CMAKE_MATCH_1}") + message(STATUS "SONAME of my_package_name: ${SONAME_OF_MY_PKG}") + else() + message(FATAL_ERROR "Could not find SONAME in objdump output for ${link_lib}") + endif() + set(result "${SONAME_OF_MY_PKG}") + else() + message(FATAL_ERROR "objdump failed for ${link_lib}") + endif() + endforeach() + if(NOT result) + message(FATAL_ERROR "Could not find SONAME for target ${target} libs: ${link_libs}") + endif() + set("${out_var}" "${result}" PARENT_SCOPE) +endfunction() + +get_imported_soname(PkgConfig::DRM_AMDGPU LIBDRM_AMDGPU_SONAME) +configure_file( + "${CMAKE_CURRENT_SOURCE_DIR}/include/config/amd_smi_config.h.in" + "${CMAKE_CURRENT_BINARY_DIR}/include/config/amd_smi_config.h" + @ONLY +) ## Compiler flags set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -fno-rtti") @@ -190,8 +228,13 @@ if(ENABLE_ESMI_LIB) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-write-strings") endif() -include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/third_party/shared_mutex - ${CMAKE_CURRENT_SOURCE_DIR}/include/amd_smi ${ESMI_INC_DIR}) +include_directories( + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${CMAKE_CURRENT_BINARY_DIR}/include + ${CMAKE_CURRENT_SOURCE_DIR}/third_party/shared_mutex + ${CMAKE_CURRENT_SOURCE_DIR}/include/amd_smi + ${ESMI_INC_DIR} +) set(CMN_SRC_LIST "${ROCM_SRC_DIR}/rocm_smi_device.cc" diff --git a/include/config/amd_smi_config.h.in b/include/config/amd_smi_config.h.in new file mode 100644 index 0000000000..6a91321d57 --- /dev/null +++ b/include/config/amd_smi_config.h.in @@ -0,0 +1,4 @@ +// Copyright Advanced Micro Devices, Inc. +// SPDX-License-Identifier: MIT + +#define LIBDRM_AMDGPU_SONAME "@LIBDRM_AMDGPU_SONAME@" diff --git a/rocm_smi/CMakeLists.txt b/rocm_smi/CMakeLists.txt index c962e4fe47..a01f549efc 100644 --- a/rocm_smi/CMakeLists.txt +++ b/rocm_smi/CMakeLists.txt @@ -47,13 +47,15 @@ configure_file("src/${ROCM_SMI_TARGET}Config.in" add_library(${ROCM_SMI_TARGET} ${CMN_SRC_LIST} ${CMN_INC_LIST}) target_link_libraries(${ROCM_SMI_TARGET} PRIVATE rt - PkgConfig::DRM - PkgConfig::DRM_AMDGPU Threads::Threads ${CMAKE_DL_LIBS} ) -target_include_directories(${ROCM_SMI_TARGET} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} - ${PROJECT_SOURCE_DIR}/common/shared_mutex) +target_include_directories(${ROCM_SMI_TARGET} PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${PROJECT_SOURCE_DIR}/common/shared_mutex + ${DRM_INCLUDE_DIRS} + ${DRM_AMDGPU_INCLUDE_DIRS} +) # use the target_include_directories() command to specify the include directories for the target target_include_directories(${ROCM_SMI_TARGET} PUBLIC "$" diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index cc4600fff1..89637efc61 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -80,13 +80,17 @@ message("SOVERSION: ${SO_VERSION_STRING}") add_library(${AMD_SMI} ${SRC_LIST} ${INC_LIST}) target_link_libraries(${AMD_SMI} PRIVATE rt - PkgConfig::DRM - PkgConfig::DRM_AMDGPU Threads::Threads ${CMAKE_DL_LIBS} ) -target_include_directories(${AMD_SMI} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${PROJECT_SOURCE_DIR}/rocm_smi/include - ${PROJECT_SOURCE_DIR}/common/shared_mutex ${ACA_INC_DIR}) +target_include_directories(${AMD_SMI} PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${PROJECT_SOURCE_DIR}/rocm_smi/include + ${PROJECT_SOURCE_DIR}/common/shared_mutex + ${ACA_INC_DIR} + ${DRM_INCLUDE_DIRS} + ${DRM_AMDGPU_INCLUDE_DIRS} +) # use the target_include_directories() command to specify the include directories for the target target_include_directories(${AMD_SMI} PUBLIC "$" diff --git a/src/amd_smi/amd_smi_utils.cc b/src/amd_smi/amd_smi_utils.cc index 6085f6243b..2c7c4be9ba 100644 --- a/src/amd_smi/amd_smi_utils.cc +++ b/src/amd_smi/amd_smi_utils.cc @@ -45,6 +45,7 @@ #include #include +#include "config/amd_smi_config.h" #include "amd_smi/impl/amd_smi_utils.h" #include "amd_smi/impl/amd_smi_system.h" #include "shared_mutex.h" // NOLINT @@ -680,7 +681,7 @@ amdsmi_status_t smi_amdgpu_get_market_name_from_dev_id(amd::smi::AMDSmiGPUDevice } amd::smi::AMDSmiLibraryLoader libdrm_amdgpu_; - amdsmi_status_t status = libdrm_amdgpu_.load("libdrm_amdgpu.so"); + amdsmi_status_t status = libdrm_amdgpu_.load(LIBDRM_AMDGPU_SONAME); if (status != AMDSMI_STATUS_SUCCESS) { libdrm_amdgpu_.unload(); return status;