Skip to content

Commit 42daf39

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 42daf39

File tree

6 files changed

+141
-128
lines changed

6 files changed

+141
-128
lines changed

.github/workflows/nightly.yml

Lines changed: 53 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ on:
1010
permissions:
1111
contents: read
1212

13+
env:
14+
BUILD_DIR : "${{github.workspace}}/build"
15+
1316
jobs:
1417
fuzz-test:
1518
name: Fuzz test
@@ -92,7 +95,6 @@ jobs:
9295
name: Windows-Ninja-cl
9396
env:
9497
VCPKG_PATH: "${{github.workspace}}/build/vcpkg/packages/hwloc_x64-windows;${{github.workspace}}/build/vcpkg/packages/tbb_x64-windows;${{github.workspace}}/build/vcpkg/packages/jemalloc_x64-windows"
95-
BUILD_DIR : "${{github.workspace}}/build"
9698
strategy:
9799
matrix:
98100
os: ['windows-2019', 'windows-2022']
@@ -155,7 +157,6 @@ jobs:
155157
name: Windows-NMake
156158
env:
157159
VCPKG_PATH: "${{github.workspace}}/build/vcpkg/packages/tbb_x64-windows;${{github.workspace}}/build/vcpkg/packages/jemalloc_x64-windows"
158-
BUILD_DIR : "${{github.workspace}}/build"
159160
strategy:
160161
matrix:
161162
os: ['windows-2019', 'windows-2022']
@@ -215,7 +216,6 @@ jobs:
215216
name: ICX
216217
env:
217218
VCPKG_PATH: "${{github.workspace}}/build/vcpkg/packages/hwloc_x64-windows;${{github.workspace}}/build/vcpkg/packages/tbb_x64-windows;${{github.workspace}}/build/vcpkg/packages/jemalloc_x64-windows"
218-
BUILD_DIR : "${{github.workspace}}/build"
219219
strategy:
220220
matrix:
221221
os: ['windows-2019', 'windows-2022']
@@ -297,6 +297,56 @@ jobs:
297297
call "C:\Program Files (x86)\Intel\oneAPI\setvars-vcvarsall.bat"
298298
ctest -C ${{matrix.build_type}} --output-on-failure --test-dir test
299299
300+
hwloc-fallback:
301+
# Scenarios where UMF_LINK_HWLOC_STATICALLY is set to OFF and hwloc is not installed in the system
302+
# The hwloc library is fetched implicitly
303+
name: "Fallback to static hwloc build"
304+
strategy:
305+
matrix:
306+
os: ['ubuntu-latest', 'windows-latest']
307+
build_type: [Release]
308+
include:
309+
- os: 'ubuntu-latest'
310+
build_type: Release
311+
number_of_processors: '$(nproc)'
312+
- os: 'windows-latest'
313+
build_type: Release
314+
number_of_processors: '$Env:NUMBER_OF_PROCESSORS'
315+
316+
runs-on: ${{matrix.os}}
317+
318+
steps:
319+
- name: Install dependencies
320+
if: matrix.os == 'ubuntu-latest'
321+
run: sudo apt-get install -y libnuma-dev
322+
323+
- name: Checkout
324+
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
325+
with:
326+
fetch-depth: 0
327+
328+
- name: Configure build
329+
run: >
330+
cmake
331+
-B ${{env.BUILD_DIR}}
332+
-DCMAKE_BUILD_TYPE=${{matrix.build_type}}
333+
-DUMF_BUILD_SHARED_LIBRARY=ON
334+
-DUMF_BUILD_EXAMPLES=OFF
335+
-DUMF_DEVELOPER_MODE=ON
336+
-DUMF_LINK_HWLOC_STATICALLY=OFF
337+
-DUMF_TESTS_FAIL_ON_SKIP=ON
338+
339+
- name: Build UMF
340+
run: >
341+
cmake
342+
--build ${{env.BUILD_DIR}}
343+
--config ${{matrix.build_type}}
344+
-j ${{matrix.number_of_processors}}
345+
346+
- name: Run tests
347+
working-directory: ${{env.BUILD_DIR}}
348+
run: ctest -C ${{matrix.build_type}} --output-on-failure --test-dir test
349+
300350
L0:
301351
uses: ./.github/workflows/reusable_gpu.yml
302352
with:

CMakeLists.txt

Lines changed: 73 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ endif()
4141
include(CTest)
4242
include(CMakePackageConfigHelpers)
4343
include(GNUInstallDirs)
44+
include(FetchContent)
4445
find_package(PkgConfig)
4546

4647
# --------------------------------------------------------------------------- #
@@ -162,7 +163,6 @@ else()
162163
set(UMF_JEMALLOC_TAG 5.3.0)
163164
endif()
164165

165-
include(FetchContent)
166166
message(
167167
STATUS
168168
"Will fetch jemalloc from ${UMF_JEMALLOC_REPO} (tag: ${UMF_JEMALLOC_TAG})"
@@ -257,126 +257,95 @@ 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)
272277
message(
273278
STATUS
274279
"Will fetch hwloc from ${UMF_HWLOC_REPO} (tag: ${UMF_HWLOC_TAG})"
275280
)
276281

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

286-
if(CMAKE_GENERATOR STREQUAL "Ninja" OR CMAKE_GENERATOR STREQUAL
287-
"Unix Makefiles")
288312
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-
)
313+
COMMAND ./autogen.sh
314+
WORKING_DIRECTORY ${hwloc_targ_SOURCE_DIR}
315+
OUTPUT ${hwloc_targ_SOURCE_DIR}/configure)
296316
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-
)
317+
COMMAND
318+
./configure --prefix=${hwloc_targ_BINARY_DIR}
319+
--enable-static=yes --enable-shared=no --disable-libxml2
320+
--disable-pci --disable-levelzero --disable-opencl
321+
--disable-cuda --disable-nvml --disable-libudev
322+
--disable-rsmi CFLAGS=-fPIC CXXFLAGS=-fPIC
323+
WORKING_DIRECTORY ${hwloc_targ_SOURCE_DIR}
324+
OUTPUT ${hwloc_targ_SOURCE_DIR}/Makefile
325+
DEPENDS ${hwloc_targ_SOURCE_DIR}/configure)
305326
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-
)
327+
COMMAND make
328+
WORKING_DIRECTORY ${hwloc_targ_SOURCE_DIR}
329+
OUTPUT ${hwloc_targ_SOURCE_DIR}/lib/libhwloc.la
330+
DEPENDS ${hwloc_targ_SOURCE_DIR}/Makefile)
331+
add_custom_command(
332+
COMMAND make install
333+
WORKING_DIRECTORY ${hwloc_targ_SOURCE_DIR}
334+
OUTPUT ${hwloc_targ_BINARY_DIR}/lib/libhwloc.a
335+
DEPENDS ${hwloc_targ_SOURCE_DIR}/lib/libhwloc.la)
336+
313337
add_custom_target(hwloc_prod
314-
DEPENDS ${hwloc_targ_BINARY_DIR}/lib/hwloc.lib)
338+
DEPENDS ${hwloc_targ_BINARY_DIR}/lib/libhwloc.a)
339+
add_library(hwloc INTERFACE)
315340
target_link_libraries(
316-
hwloc INTERFACE ${hwloc_targ_BINARY_DIR}/lib/hwloc.lib)
341+
hwloc INTERFACE ${hwloc_targ_BINARY_DIR}/lib/libhwloc.a)
317342
add_dependencies(hwloc hwloc_prod)
318343

319344
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)
345+
set(LIBHWLOC_INCLUDE_DIRS ${hwloc_targ_BINARY_DIR}/include)
346+
set(LIBHWLOC_LIBRARIES ${hwloc_targ_BINARY_DIR}/lib/libhwloc.a)
327347
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()
348+
endif() # UMF_LINK_HWLOC_STATICALLY
380349

381350
message(STATUS " LIBHWLOC_LIBRARIES = ${LIBHWLOC_LIBRARIES}")
382351
message(STATUS " LIBHWLOC_INCLUDE_DIRS = ${LIBHWLOC_INCLUDE_DIRS}")
@@ -388,7 +357,7 @@ else()
388357
endif()
389358

390359
if(hwloc_targ_SOURCE_DIR)
391-
# apply security patch for HWLOC
360+
# Apply security patch for HWLOC
392361
execute_process(
393362
COMMAND git apply ${PROJECT_SOURCE_DIR}/cmake/fix_coverity_issues.patch
394363
WORKING_DIRECTORY ${hwloc_targ_SOURCE_DIR}
@@ -406,8 +375,6 @@ endif()
406375
# Fetch L0 loader only if needed i.e.: if building L0 provider is ON and L0
407376
# headers are not provided by the user (via setting UMF_LEVEL_ZERO_INCLUDE_DIR).
408377
if(UMF_BUILD_LEVEL_ZERO_PROVIDER AND (NOT UMF_LEVEL_ZERO_INCLUDE_DIR))
409-
include(FetchContent)
410-
411378
set(LEVEL_ZERO_LOADER_REPO "https://github.com/oneapi-src/level-zero.git")
412379
set(LEVEL_ZERO_LOADER_TAG v1.20.2)
413380

@@ -436,8 +403,6 @@ endif()
436403
# Fetch CUDA only if needed i.e.: if building CUDA provider is ON and CUDA
437404
# headers are not provided by the user (via setting UMF_CUDA_INCLUDE_DIR).
438405
if(UMF_BUILD_CUDA_PROVIDER AND (NOT UMF_CUDA_INCLUDE_DIR))
439-
include(FetchContent)
440-
441406
set(CUDA_REPO
442407
"https://gitlab.com/nvidia/headers/cuda-individual/cudart.git")
443408
set(CUDA_TAG cuda-12.5.1)

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

0 commit comments

Comments
 (0)