Skip to content

Commit 97d296c

Browse files
committed
Fallback to hwloc fetch if package not found
Fallback to fetching hwloc from source instead of failing UMF build. Add a workflow for testing the fallback. Unify correct paths to hwloc. Use target name instead of a library path for hwloc linkage.
1 parent 9abb40d commit 97d296c

File tree

7 files changed

+139
-121
lines changed

7 files changed

+139
-121
lines changed

.github/workflows/reusable_basic.yml

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,56 @@ jobs:
318318
run: ${{github.workspace}}/.github/scripts/check_dll_flags.ps1 ${{env.BUILD_DIR}}/src/proxy_lib/${{matrix.build_type}}/umf_proxy.dll
319319
shell: pwsh
320320

321+
hwloc-fallback:
322+
name: "Fallback to static hwloc build"
323+
strategy:
324+
matrix:
325+
os: ['ubuntu-latest', 'windows-latest']
326+
build_type: [Release]
327+
include:
328+
- os: 'ubuntu-latest'
329+
build_type: Release
330+
number_of_processors: '$(nproc)'
331+
- os: 'windows-latest'
332+
build_type: Release
333+
number_of_processors: '$Env:NUMBER_OF_PROCESSORS'
334+
335+
runs-on: ${{matrix.os}}
336+
337+
steps:
338+
- name: Install dependencies
339+
if: matrix.os == 'ubuntu-latest'
340+
run: sudo apt-get install -y libnuma-dev
341+
342+
- name: Checkout
343+
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
344+
with:
345+
fetch-depth: 0
346+
347+
- name: Configure build
348+
run: >
349+
cmake
350+
-B ${{env.BUILD_DIR}}
351+
-DCMAKE_BUILD_TYPE=${{matrix.build_type}}
352+
-DUMF_BUILD_SHARED_LIBRARY=ON
353+
-DUMF_BUILD_EXAMPLES=OFF
354+
-DUMF_DEVELOPER_MODE=ON
355+
-DUMF_BUILD_LEVEL_ZERO_PROVIDER=ON
356+
-DUMF_BUILD_CUDA_PROVIDER=ON
357+
-DUMF_LINK_HWLOC_STATICALLY=OFF
358+
-DUMF_TESTS_FAIL_ON_SKIP=ON
359+
360+
- name: Build UMF
361+
run: >
362+
cmake
363+
--build ${{env.BUILD_DIR}}
364+
--config ${{matrix.build_type}}
365+
-j ${{matrix.number_of_processors}}
366+
367+
- name: Run tests
368+
working-directory: ${{env.BUILD_DIR}}
369+
run: ctest -C ${{matrix.build_type}} --output-on-failure --test-dir test
370+
321371
windows-dynamic_build_hwloc:
322372
name: "Windows dynamic UMF + static hwloc"
323373
strategy:

CMakeLists.txt

Lines changed: 73 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -257,126 +257,96 @@ else()
257257
if(NOT UMF_LINK_HWLOC_STATICALLY)
258258
pkg_check_modules(LIBHWLOC hwloc>=2.3.0)
259259
if(NOT LIBHWLOC_FOUND)
260-
find_package(LIBHWLOC 2.3.0 REQUIRED hwloc)
260+
find_package(LIBHWLOC 2.3.0 COMPONENTS hwloc)
261+
if(LIBHWLOC_LIBRARIES)
262+
set(LIBHWLOC_AVAILABLE TRUE)
263+
endif()
261264
endif()
262265

263-
# add PATH to DLL on Windows
264-
set(DLL_PATH_LIST
265-
"${DLL_PATH_LIST};PATH=path_list_append:${LIBHWLOC_DLL_DIRS}")
266-
elseif(WINDOWS)
267-
include(FetchContent)
268-
set(HWLOC_ENABLE_TESTING OFF)
269-
set(HWLOC_SKIP_LSTOPO ON)
270-
set(HWLOC_SKIP_TOOLS ON)
266+
if(LIBHWLOC_AVAILABLE OR LIBHWLOC_FOUND)
267+
# add PATH to DLL on Windows
268+
set(DLL_PATH_LIST
269+
"${DLL_PATH_LIST};PATH=path_list_append:${LIBHWLOC_DLL_DIRS}")
270+
message(STATUS " LIBHWLOC_LIBRARIES = ${LIBHWLOC_LIBRARIES}")
271+
else()
272+
set(UMF_LINK_HWLOC_STATICALLY ON)
273+
endif()
274+
endif()
271275

276+
if(UMF_LINK_HWLOC_STATICALLY)
277+
include(FetchContent)
272278
message(
273279
STATUS
274280
"Will fetch hwloc from ${UMF_HWLOC_REPO} (tag: ${UMF_HWLOC_TAG})"
275281
)
276282

277-
FetchContent_Declare(
278-
hwloc_targ
279-
GIT_REPOSITORY ${UMF_HWLOC_REPO}
280-
GIT_TAG ${UMF_HWLOC_TAG}
281-
SOURCE_SUBDIR contrib/windows-cmake/ FIND_PACKAGE_ARGS)
282-
FetchContent_MakeAvailable(hwloc_targ)
283+
if(WINDOWS)
284+
set(HWLOC_ENABLE_TESTING OFF)
285+
set(HWLOC_SKIP_LSTOPO ON)
286+
set(HWLOC_SKIP_TOOLS ON)
287+
288+
FetchContent_Declare(
289+
hwloc_targ
290+
GIT_REPOSITORY ${UMF_HWLOC_REPO}
291+
GIT_TAG ${UMF_HWLOC_TAG}
292+
SOURCE_SUBDIR contrib/windows-cmake/)
293+
FetchContent_MakeAvailable(hwloc_targ)
294+
295+
set(HWLOC_LIB_PATH "")
296+
if(CMAKE_GENERATOR STREQUAL "NMake Makefiles")
297+
set(HWLOC_LIB_PATH "${hwloc_targ_BINARY_DIR}/hwloc.lib")
298+
else()
299+
set(HWLOC_LIB_PATH "${hwloc_targ_BINARY_DIR}/lib/hwloc.lib")
300+
endif()
301+
302+
get_filename_component(LIBHWLOC_LIBRARY_DIRS ${HWLOC_LIB_PATH}
303+
DIRECTORY)
304+
set(LIBHWLOC_LIBRARIES ${HWLOC_LIB_PATH})
305+
set(LIBHWLOC_INCLUDE_DIRS ${hwloc_targ_BINARY_DIR}/include)
306+
else() # not Windows
307+
FetchContent_Declare(
308+
hwloc_targ
309+
GIT_REPOSITORY ${UMF_HWLOC_REPO}
310+
GIT_TAG ${UMF_HWLOC_TAG})
311+
FetchContent_MakeAvailable(hwloc_targ)
283312

284-
message(STATUS "hwloc CMAKE_GENERATOR: ${CMAKE_GENERATOR}")
285-
286-
if(CMAKE_GENERATOR STREQUAL "Ninja" OR CMAKE_GENERATOR STREQUAL
287-
"Unix Makefiles")
288313
add_custom_command(
289-
COMMAND ${CMAKE_COMMAND}
290-
-DCMAKE_INSTALL_PREFIX=${hwloc_targ_BINARY_DIR} -B build
291-
WORKING_DIRECTORY
292-
${hwloc_targ_SOURCE_DIR}/contrib/windows-cmake/
293-
OUTPUT
294-
${hwloc_targ_SOURCE_DIR}/contrib/windows-cmake/CMakeCache.txt
295-
)
314+
COMMAND ./autogen.sh
315+
WORKING_DIRECTORY ${hwloc_targ_SOURCE_DIR}
316+
OUTPUT ${hwloc_targ_SOURCE_DIR}/configure)
296317
add_custom_command(
297-
COMMAND ${CMAKE_COMMAND} --build build
298-
WORKING_DIRECTORY
299-
${hwloc_targ_SOURCE_DIR}/contrib/windows-cmake/
300-
OUTPUT
301-
${hwloc_targ_SOURCE_DIR}/contrib/windows-cmake/build/lib/hwloc.lib
302-
DEPENDS
303-
${hwloc_targ_SOURCE_DIR}/contrib/windows-cmake/CMakeCache.txt
304-
)
318+
COMMAND
319+
./configure --prefix=${hwloc_targ_BINARY_DIR}
320+
--enable-static=yes --enable-shared=no --disable-libxml2
321+
--disable-pci --disable-levelzero --disable-opencl
322+
--disable-cuda --disable-nvml --disable-libudev
323+
--disable-rsmi CFLAGS=-fPIC CXXFLAGS=-fPIC
324+
WORKING_DIRECTORY ${hwloc_targ_SOURCE_DIR}
325+
OUTPUT ${hwloc_targ_SOURCE_DIR}/Makefile
326+
DEPENDS ${hwloc_targ_SOURCE_DIR}/configure)
305327
add_custom_command(
306-
COMMAND ${CMAKE_COMMAND} --build build --target INSTALL
307-
WORKING_DIRECTORY
308-
${hwloc_targ_SOURCE_DIR}/contrib/windows-cmake/
309-
OUTPUT ${hwloc_targ_BINARY_DIR}/lib/hwloc.lib
310-
DEPENDS
311-
${hwloc_targ_SOURCE_DIR}/contrib/windows-cmake/build/lib/hwloc.lib
312-
)
328+
COMMAND make
329+
WORKING_DIRECTORY ${hwloc_targ_SOURCE_DIR}
330+
OUTPUT ${hwloc_targ_SOURCE_DIR}/lib/libhwloc.la
331+
DEPENDS ${hwloc_targ_SOURCE_DIR}/Makefile)
332+
add_custom_command(
333+
COMMAND make install
334+
WORKING_DIRECTORY ${hwloc_targ_SOURCE_DIR}
335+
OUTPUT ${hwloc_targ_BINARY_DIR}/lib/libhwloc.a
336+
DEPENDS ${hwloc_targ_SOURCE_DIR}/lib/libhwloc.la)
337+
313338
add_custom_target(hwloc_prod
314-
DEPENDS ${hwloc_targ_BINARY_DIR}/lib/hwloc.lib)
339+
DEPENDS ${hwloc_targ_BINARY_DIR}/lib/libhwloc.a)
340+
add_library(hwloc INTERFACE)
315341
target_link_libraries(
316-
hwloc INTERFACE ${hwloc_targ_BINARY_DIR}/lib/hwloc.lib)
342+
hwloc INTERFACE ${hwloc_targ_BINARY_DIR}/lib/libhwloc.a)
317343
add_dependencies(hwloc hwloc_prod)
318344

319345
set(LIBHWLOC_LIBRARY_DIRS ${hwloc_targ_BINARY_DIR}/lib)
320-
set(LIBHWLOC_LIBRARIES ${hwloc_targ_BINARY_DIR}/lib/hwloc.lib)
321-
elseif(CMAKE_GENERATOR STREQUAL "NMake Makefiles")
322-
set(LIBHWLOC_LIBRARY_DIRS ${hwloc_targ_BINARY_DIR}/)
323-
set(LIBHWLOC_LIBRARIES ${hwloc_targ_BINARY_DIR}/hwloc.lib)
324-
else()
325-
set(LIBHWLOC_LIBRARY_DIRS ${hwloc_targ_BINARY_DIR}/$<CONFIG>)
326-
set(LIBHWLOC_LIBRARIES ${hwloc_targ_BINARY_DIR}/$<CONFIG>/hwloc.lib)
346+
set(LIBHWLOC_INCLUDE_DIRS ${hwloc_targ_BINARY_DIR}/include)
347+
set(LIBHWLOC_LIBRARIES ${hwloc_targ_BINARY_DIR}/lib/libhwloc.a)
327348
endif()
328-
329-
set(LIBHWLOC_INCLUDE_DIRS
330-
${hwloc_targ_SOURCE_DIR}/include;${hwloc_targ_BINARY_DIR}/include)
331-
else()
332-
include(FetchContent)
333-
message(
334-
STATUS
335-
"Will fetch hwloc from ${UMF_HWLOC_REPO} (tag: ${UMF_HWLOC_TAG})"
336-
)
337-
338-
FetchContent_Declare(
339-
hwloc_targ
340-
GIT_REPOSITORY ${UMF_HWLOC_REPO}
341-
GIT_TAG ${UMF_HWLOC_TAG})
342-
FetchContent_MakeAvailable(hwloc_targ)
343-
344-
add_custom_command(
345-
COMMAND ./autogen.sh
346-
WORKING_DIRECTORY ${hwloc_targ_SOURCE_DIR}
347-
OUTPUT ${hwloc_targ_SOURCE_DIR}/configure)
348-
add_custom_command(
349-
COMMAND
350-
./configure --prefix=${hwloc_targ_BINARY_DIR}
351-
--enable-static=yes --enable-shared=no --disable-libxml2
352-
--disable-pci --disable-levelzero --disable-opencl
353-
--disable-cuda --disable-nvml --disable-libudev --disable-rsmi
354-
CFLAGS=-fPIC CXXFLAGS=-fPIC
355-
WORKING_DIRECTORY ${hwloc_targ_SOURCE_DIR}
356-
OUTPUT ${hwloc_targ_SOURCE_DIR}/Makefile
357-
DEPENDS ${hwloc_targ_SOURCE_DIR}/configure)
358-
add_custom_command(
359-
COMMAND make
360-
WORKING_DIRECTORY ${hwloc_targ_SOURCE_DIR}
361-
OUTPUT ${hwloc_targ_SOURCE_DIR}/lib/libhwloc.la
362-
DEPENDS ${hwloc_targ_SOURCE_DIR}/Makefile)
363-
add_custom_command(
364-
COMMAND make install
365-
WORKING_DIRECTORY ${hwloc_targ_SOURCE_DIR}
366-
OUTPUT ${hwloc_targ_BINARY_DIR}/lib/libhwloc.a
367-
DEPENDS ${hwloc_targ_SOURCE_DIR}/lib/libhwloc.la)
368-
369-
add_custom_target(hwloc_prod
370-
DEPENDS ${hwloc_targ_BINARY_DIR}/lib/libhwloc.a)
371-
add_library(hwloc INTERFACE)
372-
target_link_libraries(hwloc
373-
INTERFACE ${hwloc_targ_BINARY_DIR}/lib/libhwloc.a)
374-
add_dependencies(hwloc hwloc_prod)
375-
376-
set(LIBHWLOC_LIBRARY_DIRS ${hwloc_targ_BINARY_DIR}/lib)
377-
set(LIBHWLOC_INCLUDE_DIRS ${hwloc_targ_BINARY_DIR}/include)
378-
set(LIBHWLOC_LIBRARIES ${hwloc_targ_BINARY_DIR}/lib/libhwloc.a)
379-
endif()
349+
endif() # UMF_LINK_HWLOC_STATICALLY
380350

381351
message(STATUS " LIBHWLOC_LIBRARIES = ${LIBHWLOC_LIBRARIES}")
382352
message(STATUS " LIBHWLOC_INCLUDE_DIRS = ${LIBHWLOC_INCLUDE_DIRS}")
@@ -388,7 +358,7 @@ else()
388358
endif()
389359

390360
if(hwloc_targ_SOURCE_DIR)
391-
# apply security patch for HWLOC
361+
# Apply security patch for HWLOC
392362
execute_process(
393363
COMMAND git apply ${PROJECT_SOURCE_DIR}/cmake/fix_coverity_issues.patch
394364
WORKING_DIRECTORY ${hwloc_targ_SOURCE_DIR}

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ using the CUDA API and UMF CUDA memory provider.
2929

3030
Required packages:
3131

32-
- libhwloc-dev >= 2.3.0 (Linux) / hwloc >= 2.3.0 (Windows)
32+
- libhwloc-dev >= 2.3.0 (Linux) / hwloc >= 2.3.0 (Windows) (required for examples)
3333
- C compiler
3434
- [CMake](https://cmake.org/) >= 3.14.0
3535

cmake/FindLIBHWLOC.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ if(WINDOWS)
5555
endif()
5656

5757
if(LIBHWLOC_LIBRARY)
58-
message(STATUS " Found libhwloc using find_library()")
58+
message(STATUS " Found libhwloc: ${LIBHWLOC_LIBRARY}")
5959

6060
if(LIBHWLOC_FIND_VERSION)
6161
if(NOT LIBHWLOC_API_VERSION)

examples/CMakeLists.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ set(EXAMPLE_NAME umf_example_basic)
1818
add_umf_executable(
1919
NAME ${EXAMPLE_NAME}
2020
SRCS basic/basic.c
21-
LIBS umf ${LIBHWLOC_LIBRARIES})
21+
LIBS umf ${UMF_HWLOC_NAME})
2222

2323
target_include_directories(
2424
${EXAMPLE_NAME} PRIVATE ${UMF_CMAKE_SOURCE_DIR}/src/utils
@@ -231,7 +231,7 @@ if(LINUX)
231231
add_umf_executable(
232232
NAME ${EXAMPLE_NAME}
233233
SRCS memspace_numa/memspace_numa.c
234-
LIBS umf ${LIBHWLOC_LIBRARIES} numa)
234+
LIBS umf ${UMF_HWLOC_NAME} numa)
235235

236236
target_include_directories(
237237
${EXAMPLE_NAME}
@@ -254,7 +254,7 @@ if(LINUX)
254254
add_umf_executable(
255255
NAME ${EXAMPLE_NAME}
256256
SRCS memspace_hmat/memspace_hmat.c
257-
LIBS umf ${LIBHWLOC_LIBRARIES} numa)
257+
LIBS umf ${UMF_HWLOC_NAME} numa)
258258

259259
target_include_directories(
260260
${EXAMPLE_NAME}
@@ -278,7 +278,7 @@ if(LINUX)
278278
add_umf_executable(
279279
NAME ${EXAMPLE_NAME}
280280
SRCS custom_file_provider/custom_file_provider.c
281-
LIBS umf ${LIBHWLOC_LIBRARIES})
281+
LIBS umf ${UMF_HWLOC_NAME})
282282

283283
target_include_directories(
284284
${EXAMPLE_NAME} PRIVATE ${UMF_CMAKE_SOURCE_DIR}/src/utils

src/CMakeLists.txt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ endif()
103103
if(NOT UMF_DISABLE_HWLOC)
104104
set(UMF_SOURCES ${UMF_SOURCES} ${HWLOC_DEPENDENT_SOURCES}
105105
memtargets/memtarget_numa.c)
106-
set(UMF_LIBS ${UMF_LIBS} ${LIBHWLOC_LIBRARIES})
106+
set(UMF_LIBS ${UMF_LIBS} $<BUILD_INTERFACE:${UMF_HWLOC_NAME}>)
107107
set(UMF_PRIVATE_LIBRARY_DIRS ${UMF_PRIVATE_LIBRARY_DIRS}
108108
${LIBHWLOC_LIBRARY_DIRS})
109109
else()
@@ -150,14 +150,11 @@ if(UMF_BUILD_SHARED_LIBRARY)
150150
set(CMAKE_INSTALL_RPATH "${UMF_INSTALL_RPATH}")
151151
endif()
152152

153-
if(NOT UMF_DISABLE_HWLOC)
154-
set(HWLOC_LIB ${UMF_HWLOC_NAME})
155-
endif()
156153
add_umf_library(
157154
NAME umf
158155
TYPE SHARED
159156
SRCS ${UMF_SOURCES}
160-
LIBS ${UMF_LIBS} ${HWLOC_LIB}
157+
LIBS ${UMF_LIBS}
161158
LINUX_MAP_FILE ${CMAKE_CURRENT_SOURCE_DIR}/libumf.map
162159
WINDOWS_DEF_FILE ${CMAKE_CURRENT_SOURCE_DIR}/libumf.def)
163160
set(UMF_COMMON_COMPILE_DEFINITIONS ${UMF_COMMON_COMPILE_DEFINITIONS}

test/CMakeLists.txt

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -294,27 +294,27 @@ if(LINUX AND (NOT UMF_DISABLE_HWLOC)) # OS-specific functions are implemented
294294
add_umf_test(
295295
NAME memspace_numa
296296
SRCS memspaces/memspace_numa.cpp
297-
LIBS ${LIBNUMA_LIBRARIES} ${LIBHWLOC_LIBRARIES})
297+
LIBS ${LIBNUMA_LIBRARIES} ${UMF_HWLOC_NAME})
298298
add_umf_test(
299299
NAME provider_os_memory_config
300300
SRCS provider_os_memory_config.cpp
301-
LIBS ${UMF_UTILS_FOR_TEST} ${LIBNUMA_LIBRARIES} ${LIBHWLOC_LIBRARIES})
301+
LIBS ${UMF_UTILS_FOR_TEST} ${LIBNUMA_LIBRARIES} ${UMF_HWLOC_NAME})
302302
add_umf_test(
303303
NAME memspace_host_all
304304
SRCS memspaces/memspace_host_all.cpp
305-
LIBS ${UMF_UTILS_FOR_TEST} ${LIBNUMA_LIBRARIES} ${LIBHWLOC_LIBRARIES})
305+
LIBS ${UMF_UTILS_FOR_TEST} ${LIBNUMA_LIBRARIES} ${UMF_HWLOC_NAME})
306306
add_umf_test(
307307
NAME memspace_highest_capacity
308308
SRCS memspaces/memspace_highest_capacity.cpp
309-
LIBS ${UMF_UTILS_FOR_TEST} ${LIBNUMA_LIBRARIES} ${LIBHWLOC_LIBRARIES})
309+
LIBS ${UMF_UTILS_FOR_TEST} ${LIBNUMA_LIBRARIES} ${UMF_HWLOC_NAME})
310310
add_umf_test(
311311
NAME memspace_highest_bandwidth
312312
SRCS memspaces/memspace_highest_bandwidth.cpp
313-
LIBS ${UMF_UTILS_FOR_TEST} ${LIBNUMA_LIBRARIES} ${LIBHWLOC_LIBRARIES})
313+
LIBS ${UMF_UTILS_FOR_TEST} ${LIBNUMA_LIBRARIES} ${UMF_HWLOC_NAME})
314314
add_umf_test(
315315
NAME memspace_lowest_latency
316316
SRCS memspaces/memspace_lowest_latency.cpp
317-
LIBS ${UMF_UTILS_FOR_TEST} ${LIBNUMA_LIBRARIES} ${LIBHWLOC_LIBRARIES})
317+
LIBS ${UMF_UTILS_FOR_TEST} ${LIBNUMA_LIBRARIES} ${UMF_HWLOC_NAME})
318318
add_umf_test(
319319
NAME mempolicy
320320
SRCS memspaces/mempolicy.cpp
@@ -326,7 +326,7 @@ if(LINUX AND (NOT UMF_DISABLE_HWLOC)) # OS-specific functions are implemented
326326
add_umf_test(
327327
NAME memtarget
328328
SRCS memspaces/memtarget.cpp
329-
LIBS ${LIBNUMA_LIBRARIES} ${LIBHWLOC_LIBRARIES})
329+
LIBS ${LIBNUMA_LIBRARIES} ${UMF_HWLOC_NAME})
330330
add_umf_test(
331331
NAME provider_devdax_memory
332332
SRCS provider_devdax_memory.cpp
@@ -678,6 +678,7 @@ endif()
678678
# replace test_examples.sh with CMake script?)
679679
if(LINUX
680680
AND UMF_BUILD_SHARED_LIBRARY
681+
AND UMF_BUILD_EXAMPLES
681682
AND NOT
682683
(UMF_USE_ASAN
683684
OR UMF_USE_UBSAN

0 commit comments

Comments
 (0)