Skip to content

Commit a1cf56d

Browse files
committed
Fix building umfd.dll on single-config generators
- add installation tests step to Windows generators nightly tests
1 parent 99d5347 commit a1cf56d

File tree

3 files changed

+143
-27
lines changed

3 files changed

+143
-27
lines changed

.github/workflows/nightly.yml

+26-3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ permissions:
1212

1313
env:
1414
BUILD_DIR : "${{github.workspace}}/build"
15+
INSTALL_DIR: "${{github.workspace}}/build/install"
1516

1617
jobs:
1718
fuzz-test:
@@ -96,11 +97,12 @@ jobs:
9697
strategy:
9798
matrix:
9899
os: ['windows-2019', 'windows-2022']
99-
build_type: [Release]
100+
build_type: [Debug, Release]
100101
compiler: [{c: cl, cxx: cl}]
101102
shared_library: ['ON', 'OFF']
102103
static_hwloc: ['ON', 'OFF']
103104
generator: ['Ninja', 'NMake Makefiles']
105+
umfd_lib: ['ON', 'OFF']
104106

105107
runs-on: ${{matrix.os}}
106108

@@ -112,11 +114,11 @@ jobs:
112114

113115
- name: Set VCPKG_PATH with hwloc
114116
if: matrix.static_hwloc == 'OFF'
115-
run: echo "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'" >> $env:GITHUB_ENV
117+
run: echo "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" >> $env:GITHUB_ENV
116118

117119
- name: Set VCPKG_PATH without hwloc
118120
if: matrix.static_hwloc == 'ON'
119-
run: echo "VCPKG_PATH='${{github.workspace}}/build/vcpkg/packages/tbb_x64-windows;${{github.workspace}}/build/vcpkg/packages/jemalloc_x64-windows'" >> $env:GITHUB_ENV
121+
run: echo "VCPKG_PATH=${{github.workspace}}/build/vcpkg/packages/tbb_x64-windows;${{github.workspace}}/build/vcpkg/packages/jemalloc_x64-windows" >> $env:GITHUB_ENV
120122

121123
- name: Initialize vcpkg
122124
uses: lukka/run-vcpkg@5e0cab206a5ea620130caf672fce3e4a6b5666a1 # v11.5
@@ -141,6 +143,7 @@ jobs:
141143
run: >
142144
cmake
143145
-B ${{env.BUILD_DIR}}
146+
-DCMAKE_BUILD_TYPE=${{matrix.build_type}}
144147
-DCMAKE_PREFIX_PATH="${{env.VCPKG_PATH}}"
145148
-DCMAKE_C_COMPILER=${{matrix.compiler.c}}
146149
-DCMAKE_CXX_COMPILER=${{matrix.compiler.cxx}}
@@ -153,6 +156,7 @@ jobs:
153156
-DUMF_BUILD_LEVEL_ZERO_PROVIDER=ON
154157
-DUMF_BUILD_CUDA_PROVIDER=ON
155158
-DUMF_TESTS_FAIL_ON_SKIP=ON
159+
${{ matrix.umfd_lib == 'ON' && '-DUMF_USE_DEBUG_POSTFIX=ON' || '' }}
156160
157161
- name: Build UMF
158162
shell: cmd
@@ -163,6 +167,25 @@ jobs:
163167
working-directory: ${{env.BUILD_DIR}}
164168
run: ctest -C ${{matrix.build_type}} --output-on-failure --test-dir test
165169

170+
- name: Get UMF version
171+
run: |
172+
$version = (git describe --tags --abbrev=0 | Select-String -Pattern '\d+\.\d+\.\d+').Matches.Value
173+
echo "UMF_VERSION=$version" >> $env:GITHUB_ENV
174+
shell: pwsh
175+
176+
- name: Test UMF installation and uninstallation
177+
# The '--shared-library' parameter is added to the installation test when the UMF is built as a shared library
178+
# The '--umfd-lib' parameter is added when the UMF is built with the umfd library
179+
run: >
180+
python3 ${{github.workspace}}/test/test_installation.py
181+
--build-dir ${{env.BUILD_DIR}}
182+
--install-dir ${{env.INSTALL_DIR}}
183+
--build-type ${{matrix.build_type}}
184+
--umf-version ${{env.UMF_VERSION}}
185+
${{ matrix.shared_library == 'ON' && '--proxy --shared-library' || '' }}
186+
${{ matrix.umfd_lib == 'ON' && '--umfd-lib' || ''}}
187+
${{ matrix.static_hwloc == 'ON' && matrix.generator == 'Ninja' && '--hwloc' || '' }}
188+
166189
icx:
167190
name: ICX
168191
env:

CMakeLists.txt

+100-21
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,8 @@ if(UMF_DEVELOPER_MODE)
148148
UMF_DEVELOPER_MODE=1)
149149
endif()
150150

151+
message(STATUS "CMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}")
152+
151153
if(NOT UMF_BUILD_LIBUMF_POOL_JEMALLOC)
152154
set(UMF_POOL_JEMALLOC_ENABLED FALSE)
153155
set(JEMALLOC_FOUND FALSE)
@@ -285,6 +287,7 @@ else()
285287
set(HWLOC_ENABLE_TESTING OFF)
286288
set(HWLOC_SKIP_LSTOPO ON)
287289
set(HWLOC_SKIP_TOOLS ON)
290+
set(HWLOC_SKIP_INCLUDES ON)
288291

289292
FetchContent_Declare(
290293
hwloc_targ
@@ -429,24 +432,86 @@ elseif(UMF_BUILD_CUDA_PROVIDER)
429432
endif()
430433

431434
if(WINDOWS AND UMF_USE_DEBUG_POSTFIX)
432-
# Build debug umf library with the d suffix that is compiled with /MDd so
433-
# users can link against it in debug builds.
434-
set(CMAKE_DEBUG_POSTFIX d)
435-
435+
# Build the umfd target in a separate directory with Debug configuration
436+
string(JOIN "\;" UMFD_CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH})
436437
add_custom_target(
437-
umfd ALL
438-
COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target umf
439-
--config Debug
440-
COMMENT "Building debug umf library with the d suffix")
438+
build_umfd ALL
439+
COMMAND
440+
${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" -S ${UMF_CMAKE_SOURCE_DIR}
441+
-B ${CMAKE_BINARY_DIR}/umfd_build -DCMAKE_BUILD_TYPE=Debug
442+
-DCMAKE_DEBUG_POSTFIX=d
443+
-DCMAKE_PREFIX_PATH="${UMFD_CMAKE_PREFIX_PATH}"
444+
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
445+
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
446+
-DUMF_USE_DEBUG_POSTFIX=OFF
447+
-DUMF_BUILD_SHARED_LIBRARY=${UMF_BUILD_SHARED_LIBRARY}
448+
-DUMF_BUILD_LEVEL_ZERO_PROVIDER=${UMF_BUILD_LEVEL_ZERO_PROVIDER}
449+
-DUMF_BUILD_CUDA_PROVIDER=${UMF_BUILD_CUDA_PROVIDER}
450+
-DUMF_BUILD_LIBUMF_POOL_JEMALLOC=${UMF_BUILD_LIBUMF_POOL_JEMALLOC}
451+
-DUMF_BUILD_TESTS=OFF -DUMF_BUILD_GPU_TESTS=OFF
452+
-DUMF_BUILD_BENCHMARKS=OFF -DUMF_BUILD_BENCHMARKS_MT=OFF
453+
-DUMF_BUILD_EXAMPLES=OFF -DUMF_BUILD_GPU_EXAMPLES=OFF
454+
-DUMF_BUILD_FUZZTESTS=OFF -DUMF_DISABLE_HWLOC=${UMF_DISABLE_HWLOC}
455+
-DUMF_LINK_HWLOC_STATICALLY=${UMF_LINK_HWLOC_STATICALLY}
456+
-DUMF_HWLOC_NAME=${UMF_HWLOC_NAME}
457+
-DUMF_INSTALL_RPATH=${UMF_INSTALL_RPATH} -DUMF_DEVELOPER_MODE=OFF
458+
-DUMF_FORMAT_CODE_STYLE=OFF -DUMF_TESTS_FAIL_ON_SKIP=OFF
459+
-DUMF_USE_ASAN=OFF -DUMF_USE_UBSAN=OFF -DUMF_USE_TSAN=OFF
460+
-DUMF_USE_MSAN=OFF -DUMF_USE_VALGRIND=OFF -DUMF_USE_COVERAGE=OFF
461+
-DUMF_PROXY_LIB_BASED_ON_POOL=${UMF_PROXY_LIB_BASED_ON_POOL}
462+
COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}/umfd_build --target
463+
umf --config Debug
464+
COMMENT
465+
"Configuring and building umfd.dll in a separate directory with Debug configuration"
466+
)
441467

442-
# Copy built UMF libraries to the Release build subdirectory
443-
add_custom_command(
444-
TARGET umfd
445-
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/bin/Debug/umfd.dll
446-
${CMAKE_BINARY_DIR}/bin/Release/umfd.dll
447-
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/lib/Debug/umfd.lib
448-
${CMAKE_BINARY_DIR}/lib/Release/umfd.lib
449-
COMMENT "Copying debug libraries to the Release build directory")
468+
# Copy built UMF libraries to the main binary directory and remove
469+
# umfd_build
470+
if(CMAKE_CONFIGURATION_TYPES)
471+
# Multi-config generator (e.g., Visual Studio)
472+
if(UMF_BUILD_SHARED_LIBRARY)
473+
add_custom_command(
474+
TARGET build_umfd
475+
COMMAND
476+
${CMAKE_COMMAND} -E copy_if_different
477+
${CMAKE_BINARY_DIR}/umfd_build/bin/Debug/umfd.dll
478+
${CMAKE_BINARY_DIR}/bin/$<CONFIG>/umfd.dll
479+
COMMENT "Copying umfd.dll to the main binary directory")
480+
endif()
481+
add_custom_command(
482+
TARGET build_umfd
483+
COMMAND
484+
${CMAKE_COMMAND} -E copy_if_different
485+
${CMAKE_BINARY_DIR}/umfd_build/lib/Debug/umfd.lib
486+
${CMAKE_BINARY_DIR}/lib/$<CONFIG>/umfd.lib
487+
COMMAND
488+
${CMAKE_COMMAND} -E remove_directory
489+
${CMAKE_BINARY_DIR}/umfd_build DEPENDS
490+
${CMAKE_BINARY_DIR}/bin/$<CONFIG>/umfd.dll
491+
COMMENT "Copying umfd.lib to the main library directory")
492+
else()
493+
# Single-config generator (e.g., Ninja)
494+
if(UMF_BUILD_SHARED_LIBRARY)
495+
add_custom_command(
496+
TARGET build_umfd
497+
COMMAND
498+
${CMAKE_COMMAND} -E copy_if_different
499+
${CMAKE_BINARY_DIR}/umfd_build/bin/umfd.dll
500+
${CMAKE_BINARY_DIR}/bin/umfd.dll
501+
COMMENT "Copying umfd.dll file to the main binary directory")
502+
endif()
503+
add_custom_command(
504+
TARGET build_umfd
505+
COMMAND
506+
${CMAKE_COMMAND} -E copy_if_different
507+
${CMAKE_BINARY_DIR}/umfd_build/lib/umfd.lib
508+
${CMAKE_BINARY_DIR}/lib/umfd.lib
509+
COMMAND
510+
${CMAKE_COMMAND} -E remove_directory
511+
${CMAKE_BINARY_DIR}/umfd_build DEPENDS
512+
${CMAKE_BINARY_DIR}/bin/umfd.dll
513+
COMMENT "Copying umfd.lib file to the main library directory")
514+
endif()
450515
endif()
451516

452517
# This build type check is not possible on Windows when CMAKE_BUILD_TYPE is not
@@ -841,12 +906,26 @@ endif()
841906
# --------------------------------------------------------------------------- #
842907
# Configure make install/uninstall and packages
843908
# --------------------------------------------------------------------------- #
844-
# Install umfd target
909+
# Install the umfd library files as part of the umfd component
845910
if(WINDOWS AND UMF_USE_DEBUG_POSTFIX)
846-
install(FILES ${CMAKE_BINARY_DIR}/bin/Debug/umfd.dll
847-
DESTINATION ${CMAKE_INSTALL_BINDIR})
848-
install(FILES ${CMAKE_BINARY_DIR}/lib/Debug/umfd.lib
849-
DESTINATION ${CMAKE_INSTALL_LIBDIR})
911+
if(CMAKE_CONFIGURATION_TYPES)
912+
set(UMFD_DLL "${CMAKE_BINARY_DIR}/bin/$<CONFIG>/umfd.dll")
913+
set(UMFD_LIB "${CMAKE_BINARY_DIR}/lib/$<CONFIG>/umfd.lib")
914+
else()
915+
set(UMFD_DLL "${CMAKE_BINARY_DIR}/bin/umfd.dll")
916+
set(UMFD_LIB "${CMAKE_BINARY_DIR}/lib/umfd.lib")
917+
endif()
918+
919+
if(UMF_BUILD_SHARED_LIBRARY)
920+
install(
921+
FILES ${UMFD_DLL}
922+
DESTINATION ${CMAKE_INSTALL_BINDIR}
923+
COMPONENT umfd)
924+
endif()
925+
install(
926+
FILES ${UMFD_LIB}
927+
DESTINATION ${CMAKE_INSTALL_LIBDIR}
928+
COMPONENT umfd)
850929
endif()
851930

852931
install(FILES ${PROJECT_SOURCE_DIR}/LICENSE.TXT

test/test_installation.py

+17-3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import platform
1313
import subprocess # nosec B404
1414
import sys
15+
import os
1516
from typing import List
1617

1718

@@ -28,7 +29,8 @@ class UmfInstaller:
2829
proxy (bool): Determines whether the proxy library should be built together with the UMF library
2930
pools (List[str]): A list of enabled pools during the UMF compilation
3031
umf_version (Version): UMF version currently being built and installed
31-
match_list (List[str]): A list of relative paths of files that should be installed
32+
umfd_lib (bool): Determines if the UMF was built with the umfd library
33+
hwloc (bool): Determines if hwloc is installed and should be checked
3234
"""
3335

3436
def __init__(
@@ -42,6 +44,7 @@ def __init__(
4244
pools: List[str],
4345
umf_version: Version,
4446
umfd_lib: bool,
47+
hwloc: bool,
4548
):
4649
self.workspace_dir = workspace_dir
4750
self.build_dir = build_dir
@@ -52,6 +55,7 @@ def __init__(
5255
self.pools = pools
5356
self.umf_version = umf_version
5457
self.umfd_lib = umfd_lib
58+
self.hwloc = hwloc
5559
self.match_list = self._create_match_list()
5660

5761
def _create_match_list(self) -> List[str]:
@@ -77,7 +81,7 @@ def _create_match_list(self) -> List[str]:
7781

7882
bin = []
7983
if platform.system() == "Windows" and (
80-
self.shared_library or self.proxy or self.umfd_lib
84+
self.shared_library or self.proxy
8185
):
8286
bin.append("bin")
8387
if self.shared_library:
@@ -103,6 +107,7 @@ def _create_match_list(self) -> List[str]:
103107
f"lib/cmake/umf/umf-targets-{self.build_type}.cmake",
104108
"lib/cmake/umf/umf-targets.cmake",
105109
]
110+
106111
for pool in self.pools:
107112
lib.append(f"lib/{lib_prefix}{pool}.{lib_ext_static}")
108113
if self.shared_library:
@@ -121,7 +126,11 @@ def _create_match_list(self) -> List[str]:
121126
)
122127
lib.append(f"lib/{lib_prefix}umf.{self.umf_version}.{lib_ext_shared}")
123128
else:
129+
if platform.system() == "Windows" and self.hwloc:
130+
lib.append(f"lib/{lib_prefix}hwloc.{lib_ext_static}")
124131
lib.append(f"lib/{lib_prefix}umf.{lib_ext_static}")
132+
if self.umfd_lib and platform.system() == "Windows":
133+
lib.append(f"lib/{lib_prefix}umfd.{lib_ext_static}")
125134

126135
if self.proxy:
127136
lib.append(f"lib/{lib_prefix}umf_proxy.{lib_ext_shared}")
@@ -135,7 +144,6 @@ def _create_match_list(self) -> List[str]:
135144
f"lib/{lib_prefix}umf_proxy.{self.umf_version.major}.{lib_ext_shared}"
136145
)
137146

138-
share = []
139147
share = [
140148
"share",
141149
"share/doc",
@@ -296,6 +304,11 @@ def parse_arguments(self) -> argparse.Namespace:
296304
action="store_true",
297305
help="Add this argument if the UMF was built with the umfd library",
298306
)
307+
self.parser.add_argument(
308+
"--hwloc-installed",
309+
action="store_true",
310+
help="Add this argument if hwloc is installed and should be checked",
311+
)
299312
return self.parser.parse_args()
300313

301314
def run(self) -> None:
@@ -320,6 +333,7 @@ def run(self) -> None:
320333
pools,
321334
umf_version,
322335
self.args.umfd_lib,
336+
self.args.hwloc,
323337
)
324338

325339
print("Installation test - BEGIN", flush=True)

0 commit comments

Comments
 (0)