From 7f9b33335487ac2aadedc952e7e397926a735ba2 Mon Sep 17 00:00:00 2001 From: Shweta Khatri Date: Fri, 16 Jan 2026 05:02:04 -0500 Subject: [PATCH 1/2] rocrtst: TheRock - Refactor NUMA/hwloc dependency discovery Use SHARED IMPORTED targets for proper RPATH handling, prioritize pkg-config over bundled binaries, removed manual symlink workarounds --- .../rocrtst/suites/test_common/CMakeLists.txt | 199 +++++++++++++----- 1 file changed, 143 insertions(+), 56 deletions(-) diff --git a/projects/rocr-runtime/rocrtst/suites/test_common/CMakeLists.txt b/projects/rocr-runtime/rocrtst/suites/test_common/CMakeLists.txt index 6ece62f87e2..a3f3c97adf2 100755 --- a/projects/rocr-runtime/rocrtst/suites/test_common/CMakeLists.txt +++ b/projects/rocr-runtime/rocrtst/suites/test_common/CMakeLists.txt @@ -480,33 +480,83 @@ set(BITCODE_LIBS "${COMMON_BITCODE_LIBS}") set(CL_FILE_LIST "${KERNELS_DIR}/cu_mask_kernels.cl") build_sample_for_devices("cu_mask") -set(CMAKE_BUILD_WITH_INSTALL_RPATH ON) +# Configure RPATH settings before creating executable target +set(CMAKE_BUILD_WITH_INSTALL_RPATH OFF) +set(CMAKE_SKIP_BUILD_RPATH FALSE) +if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.14") + set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) +endif() +set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) -# Check for numa library and headers (same approach as libhsakmt) +# Check for numa library and header find_package(PkgConfig) -find_package(NUMA) -if(NUMA_FOUND) - set(NUMA_LIBS ${NUMA_LIBRARIES}) - message(STATUS "Found NUMA package: ${NUMA_LIBRARIES}") - if(NUMA_INCLUDE_DIRS) - include_directories(${NUMA_INCLUDE_DIRS}) - message(STATUS "NUMA include dirs: ${NUMA_INCLUDE_DIRS}") +set(HAVE_NUMA FALSE) +set(NUMA_TARGET "") + +if(PKG_CONFIG_FOUND) + pkg_check_modules(NUMA_PC numa) + if(NUMA_PC_FOUND) + # Try to find the actual library file for SHARED IMPORTED target + find_library(NUMA_LIBRARY_FILE + NAMES numa rocm_sysdeps_numa + HINTS ${NUMA_PC_LIBRARY_DIRS} + NO_DEFAULT_PATH + ) + + if(NUMA_LIBRARY_FILE) + # Create SHARED IMPORTED target for proper RPATH handling + add_library(numa_imported SHARED IMPORTED) + set_target_properties(numa_imported PROPERTIES + IMPORTED_LOCATION "${NUMA_LIBRARY_FILE}" + INTERFACE_INCLUDE_DIRECTORIES "${NUMA_PC_INCLUDE_DIRS}" + ) + message(STATUS "Found NUMA via pkg-config (SHARED): ${NUMA_LIBRARY_FILE}") + else() + # Fallback to INTERFACE target if we only have link flags + add_library(numa_imported INTERFACE IMPORTED) + set_target_properties(numa_imported PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${NUMA_PC_INCLUDE_DIRS}" + INTERFACE_LINK_LIBRARIES "${NUMA_PC_LIBRARIES}" + INTERFACE_LINK_DIRECTORIES "${NUMA_PC_LIBRARY_DIRS}" + ) + message(STATUS "Found NUMA via pkg-config (INTERFACE): ${NUMA_PC_LIBRARIES}") + endif() + + set(NUMA_TARGET numa_imported) + set(HAVE_NUMA TRUE) + message(STATUS " Include dirs: ${NUMA_PC_INCLUDE_DIRS}") + message(STATUS " Library dirs: ${NUMA_PC_LIBRARY_DIRS}") endif() - set(HAVE_NUMA TRUE) -else() - # Fallback to manual detection - find_library(NUMA_LIBRARY NAMES numa) - if(NUMA_LIBRARY) - set(NUMA_LIBS ${NUMA_LIBRARY}) - message(STATUS "Found numa library (fallback): ${NUMA_LIBRARY}") +endif() + +if(NOT HAVE_NUMA) + find_package(NUMA) + if(NUMA_FOUND) + add_library(numa_imported INTERFACE IMPORTED) + set_target_properties(numa_imported PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${NUMA_INCLUDE_DIRS}" + INTERFACE_LINK_LIBRARIES "${NUMA_LIBRARIES}" + ) + set(NUMA_TARGET numa_imported) set(HAVE_NUMA TRUE) + message(STATUS "Found NUMA package: ${NUMA_LIBRARIES}") else() - message(WARNING "NUMA library not found. Building without numa support.") - message(WARNING " Install libnuma-dev (Debian/Ubuntu) or numactl-devel (RHEL/CentOS)") - set(NUMA_LIBS "") - set(HAVE_NUMA FALSE) - # Exclude numa-dependent files from build - list(FILTER performanceSources EXCLUDE REGEX ".*memory_async_copy.*\\.cc$") + # Last resort: manual detection + find_library(NUMA_LIBRARY NAMES numa) + if(NUMA_LIBRARY) + add_library(numa_imported INTERFACE IMPORTED) + set_target_properties(numa_imported PROPERTIES + INTERFACE_LINK_LIBRARIES "${NUMA_LIBRARY}" + ) + set(NUMA_TARGET numa_imported) + set(HAVE_NUMA TRUE) + message(STATUS "Found numa library (manual): ${NUMA_LIBRARY}") + else() + message(WARNING "NUMA library not found. Building without numa support.") + message(WARNING " Install libnuma-dev (Debian/Ubuntu) or numactl-devel (RHEL/CentOS)") + # Exclude numa-dependent files from build + list(FILTER performanceSources EXCLUDE REGEX ".*memory_async_copy.*\\.cc$") + endif() endif() endif() @@ -517,48 +567,81 @@ add_executable(${ROCRTST} ${performanceSources} ${functionalSources} ${negativeS # Add HAVE_NUMA compile definition so code can conditionally compile NUMA features target_compile_definitions(${ROCRTST} PRIVATE HAVE_NUMA=$) -# Find hwloc library (optional - only needed for certain performance tests) -# Try pkg-config first (for super-project builds) +# Find hwloc library +set(HAVE_HWLOC FALSE) +set(HWLOC_TARGET "") + if(PKG_CONFIG_FOUND) - pkg_check_modules(HWLOC QUIET hwloc) - if(HWLOC_FOUND) - set(HWLOC_LIBRARY ${HWLOC_LINK_LIBRARIES}) - message(STATUS "Found hwloc via pkg-config: ${HWLOC_LIBRARY}") + pkg_check_modules(HWLOC_PC hwloc) + if(HWLOC_PC_FOUND) + # Try to find the actual library file for SHARED IMPORTED target + find_library(HWLOC_LIBRARY_FILE Create SHARED IMPORTED target for proper RPATH handling + + NAMES hwloc + HINTS ${HWLOC_PC_LIBRARY_DIRS} + NO_DEFAULT_PATH + ) + + if(HWLOC_LIBRARY_FILE) + # Create SHARED IMPORTED target for proper RPATH handling + add_library(hwloc_imported SHARED IMPORTED) + set_target_properties(hwloc_imported PROPERTIES + IMPORTED_LOCATION "${HWLOC_LIBRARY_FILE}" + INTERFACE_INCLUDE_DIRECTORIES "${HWLOC_PC_INCLUDE_DIRS}" + ) + set(HWLOC_TARGET hwloc_imported) + set(HAVE_HWLOC TRUE) + message(STATUS "Found hwloc via pkg-config (SHARED): ${HWLOC_LIBRARY_FILE}") + message(STATUS " Include dirs: ${HWLOC_PC_INCLUDE_DIRS}") + message(STATUS " Library dirs: ${HWLOC_PC_LIBRARY_DIRS}") + endif() endif() endif() -# If not found via pkg-config, check for bundled version (any version) -if(NOT HWLOC_FOUND) - # Use file(GLOB) to find any libhwloc.so* file regardless of version - file(GLOB HWLOC_LIBRARY "${CMAKE_CURRENT_SOURCE_DIR}/../../thirdparty/lib/libhwloc.so*") +if(NOT HAVE_HWLOC) + # Fallback: Search in thirdparty (may have symbol version incompatibilities with TheRock's numa) + find_library(HWLOC_LIBRARY + NAMES hwloc + HINTS ${ROCRTST_ROOT}/thirdparty/lib + PATH_SUFFIXES lib lib64 + NO_DEFAULT_PATH + ) + + # If not found, try versioned library directly (e.g., libhwloc.so.5) + if(NOT HWLOC_LIBRARY) + find_file(HWLOC_LIBRARY + NAMES libhwloc.so.5 libhwloc.so.15 + HINTS ${ROCRTST_ROOT}/thirdparty/lib + PATH_SUFFIXES lib lib64 + NO_DEFAULT_PATH + ) + endif() + if(HWLOC_LIBRARY) - list(GET HWLOC_LIBRARY 0 HWLOC_LIBRARY) # Take first match if multiple versions exist - set(HWLOC_FOUND TRUE) - message(STATUS "Found bundled hwloc library: ${HWLOC_LIBRARY}") + add_library(hwloc_imported SHARED IMPORTED) + set_target_properties(hwloc_imported PROPERTIES + IMPORTED_LOCATION "${HWLOC_LIBRARY}" + ) + set(HWLOC_TARGET hwloc_imported) + set(HAVE_HWLOC TRUE) + message(STATUS "Found hwloc library (fallback): ${HWLOC_LIBRARY}") + message(WARNING "Using pre-built hwloc from thirdparty/lib - may have symbol version incompatibilities with TheRock's numa") else() - # Fall back to system hwloc - find_library(HWLOC_LIBRARY NAMES hwloc) - if(HWLOC_LIBRARY) - set(HWLOC_FOUND TRUE) - message(WARNING "Using system hwloc library: ${HWLOC_LIBRARY}") - message(WARNING " Consider using bundled version to avoid compatibility issues") - endif() + message(FATAL_ERROR "hwloc library not found. Install libhwloc-dev (Debian/Ubuntu) or hwloc-devel (RHEL/CentOS) or add hwloc as a TheRock dependency") endif() endif() -# Handle hwloc availability -if(HWLOC_FOUND) - set(HWLOC_LIBS ${HWLOC_LIBRARY}) - set(HAVE_HWLOC TRUE) - message(STATUS "hwloc support enabled") -else() - message(FATAL_ERROR "hwloc library not found. Required for rocrtst build. Install libhwloc-dev (Debian/Ubuntu) or hwloc-devel (RHEL/CentOS)") -endif() - # Add HAVE_HWLOC compile definition target_compile_definitions(${ROCRTST} PRIVATE HAVE_HWLOC=$) -target_link_libraries(${ROCRTST} ${ROCRTST_LIBS} c stdc++ dl pthread rt ${NUMA_LIBS} ${HWLOC_LIBS}) +# Link libraries - CMake will automatically handle RPATH for imported targets +target_link_libraries(${ROCRTST} ${ROCRTST_LIBS} c stdc++ dl pthread rt) +if(HAVE_NUMA) + target_link_libraries(${ROCRTST} ${NUMA_TARGET}) +endif() +if(HAVE_HWLOC) + target_link_libraries(${ROCRTST} ${HWLOC_TARGET}) +endif() #Build kernels add_custom_target(rocrtst_kernels ALL DEPENDS ${HSACO_TARG_LIST}) @@ -566,9 +649,13 @@ add_custom_target(rocrtst_kernels ALL DEPENDS ${HSACO_TARG_LIST}) #Build symlinks add_custom_target(rocrtst_links ALL DEPENDS ${ROCRTST_LINKS_LIST} ) -## Set RUNPATH to pickup local copy of hwloc -set_property(TARGET ${ROCRTST} PROPERTY INSTALL_RPATH "$ORIGIN;$ORIGIN/thirdparty/lib;$ORIGIN/../lib/rocrtst/thirdparty/lib" ) -set_property(TARGET ${ROCRTST} PROPERTY LINK_FLAGS "-Wl,--enable-new-dtags") +# CMake automatically sets RPATH for linked libraries when CMAKE_INSTALL_RPATH_USE_LINK_PATH is TRUE +# This works for SHARED IMPORTED targets (numa, hwloc) found via pkg-config +set_target_properties(${ROCRTST} PROPERTIES + LINK_FLAGS "-Wl,--enable-new-dtags" + INSTALL_RPATH "$ORIGIN/../lib/rocrtst/lib;$ORIGIN/../lib/rocm_sysdeps/lib" + BUILD_RPATH "$ORIGIN/../../dist/lib/rocm_sysdeps/lib;$ORIGIN/../lib/rocrtst/lib" +) install(TARGETS ${ROCRTST} ARCHIVE DESTINATION lib @@ -577,4 +664,4 @@ install(TARGETS ${ROCRTST} install ( DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../../thirdparty/lib DESTINATION lib/rocrtst ) -include ( CPack ) +include ( CPack ) \ No newline at end of file From 0b4a1cda64db0e62269f256d13a8477ec3a61705 Mon Sep 17 00:00:00 2001 From: Shweta Khatri Date: Wed, 21 Jan 2026 06:13:11 -0500 Subject: [PATCH 2/2] rocrtst: TheRock support: Prefer hwloc CMake package before pkg-config fallback Co-authored-by: Jessey Harrymanoharan --- .../rocrtst/suites/test_common/CMakeLists.txt | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/projects/rocr-runtime/rocrtst/suites/test_common/CMakeLists.txt b/projects/rocr-runtime/rocrtst/suites/test_common/CMakeLists.txt index a3f3c97adf2..33f7384d0e3 100755 --- a/projects/rocr-runtime/rocrtst/suites/test_common/CMakeLists.txt +++ b/projects/rocr-runtime/rocrtst/suites/test_common/CMakeLists.txt @@ -571,7 +571,16 @@ target_compile_definitions(${ROCRTST} PRIVATE HAVE_NUMA=$) set(HAVE_HWLOC FALSE) set(HWLOC_TARGET "") -if(PKG_CONFIG_FOUND) +# First priority: Try to find hwloc via CMake package (from TheRock sysdeps) +find_package(hwloc QUIET CONFIG) +if(hwloc_FOUND AND TARGET hwloc::hwloc) + set(HWLOC_TARGET hwloc::hwloc) + set(HAVE_HWLOC TRUE) + message(STATUS "Found hwloc via CMake package (TheRock sysdeps)") +endif() + +# Second priority: Try pkg-config +if(NOT HAVE_HWLOC AND PKG_CONFIG_FOUND) pkg_check_modules(HWLOC_PC hwloc) if(HWLOC_PC_FOUND) # Try to find the actual library file for SHARED IMPORTED target