Skip to content

Commit b3fd6d0

Browse files
Merge pull request #1238 from PatKamin/fix-debug-dll
Fix building umfd.dll on single-config generators
2 parents e042ee9 + 9ec0b00 commit b3fd6d0

File tree

3 files changed

+121
-30
lines changed

3 files changed

+121
-30
lines changed

.github/workflows/nightly.yml

+27-5
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:
@@ -95,14 +96,14 @@ jobs:
9596
name: Windows ${{matrix.generator}} generator
9697
strategy:
9798
matrix:
98-
os: ['windows-2019', 'windows-2022']
99-
build_type: [Release]
99+
build_type: [Debug, Release]
100100
compiler: [{c: cl, cxx: cl}]
101101
shared_library: ['ON', 'OFF']
102102
static_hwloc: ['ON', 'OFF']
103103
generator: ['Ninja', 'NMake Makefiles']
104+
umfd_lib: ['ON', 'OFF']
104105

105-
runs-on: ${{matrix.os}}
106+
runs-on: windows-latest
106107

107108
steps:
108109
- name: Checkout
@@ -112,11 +113,11 @@ jobs:
112113

113114
- name: Set VCPKG_PATH with hwloc
114115
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
116+
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
116117

117118
- name: Set VCPKG_PATH without hwloc
118119
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
120+
run: echo "VCPKG_PATH=${{github.workspace}}/build/vcpkg/packages/tbb_x64-windows;${{github.workspace}}/build/vcpkg/packages/jemalloc_x64-windows" >> $env:GITHUB_ENV
120121

121122
- name: Initialize vcpkg
122123
uses: lukka/run-vcpkg@5e0cab206a5ea620130caf672fce3e4a6b5666a1 # v11.5
@@ -141,6 +142,7 @@ jobs:
141142
run: >
142143
cmake
143144
-B ${{env.BUILD_DIR}}
145+
-DCMAKE_BUILD_TYPE=${{matrix.build_type}}
144146
-DCMAKE_PREFIX_PATH="${{env.VCPKG_PATH}}"
145147
-DCMAKE_C_COMPILER=${{matrix.compiler.c}}
146148
-DCMAKE_CXX_COMPILER=${{matrix.compiler.cxx}}
@@ -153,6 +155,7 @@ jobs:
153155
-DUMF_BUILD_LEVEL_ZERO_PROVIDER=ON
154156
-DUMF_BUILD_CUDA_PROVIDER=ON
155157
-DUMF_TESTS_FAIL_ON_SKIP=ON
158+
${{ matrix.umfd_lib == 'ON' && '-DUMF_USE_DEBUG_POSTFIX=ON' || '' }}
156159
157160
- name: Build UMF
158161
shell: cmd
@@ -163,6 +166,25 @@ jobs:
163166
working-directory: ${{env.BUILD_DIR}}
164167
run: ctest -C ${{matrix.build_type}} --output-on-failure --test-dir test
165168

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

CMakeLists.txt

+78-20
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ macro(umf_option)
5858
option(${ARGV})
5959
endmacro()
6060

61+
# All CMake options have to be explicitly set in the build_umfd target's
62+
# configuration command
6163
umf_option(UMF_BUILD_SHARED_LIBRARY "Build UMF as shared library" OFF)
6264
umf_option(UMF_BUILD_LEVEL_ZERO_PROVIDER "Build Level Zero memory provider" ON)
6365
umf_option(UMF_BUILD_CUDA_PROVIDER "Build CUDA memory provider" ON)
@@ -148,6 +150,8 @@ if(UMF_DEVELOPER_MODE)
148150
UMF_DEVELOPER_MODE=1)
149151
endif()
150152

153+
message(STATUS "CMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}")
154+
151155
if(NOT UMF_BUILD_LIBUMF_POOL_JEMALLOC)
152156
set(UMF_POOL_JEMALLOC_ENABLED FALSE)
153157
set(JEMALLOC_FOUND FALSE)
@@ -293,6 +297,7 @@ else()
293297
set(HWLOC_ENABLE_TESTING OFF)
294298
set(HWLOC_SKIP_LSTOPO ON)
295299
set(HWLOC_SKIP_TOOLS ON)
300+
set(HWLOC_SKIP_INCLUDES ON)
296301

297302
FetchContent_Declare(
298303
hwloc_targ
@@ -436,25 +441,72 @@ elseif(UMF_BUILD_CUDA_PROVIDER)
436441
message(STATUS "CUDA_INCLUDE_DIRS = ${CUDA_INCLUDE_DIRS}")
437442
endif()
438443

444+
# Build the umfd target in a separate directory with Debug configuration
439445
if(WINDOWS AND UMF_USE_DEBUG_POSTFIX)
440-
# Build debug umf library with the d suffix that is compiled with /MDd so
441-
# users can link against it in debug builds.
442-
set(CMAKE_DEBUG_POSTFIX d)
443-
446+
# The build_umfd target's configuration command requires to have
447+
# CMAKE_PREFIX_PATH with semicolons escaped
448+
string(JOIN "\;" UMFD_CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH})
444449
add_custom_target(
445-
umfd ALL
446-
COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target umf
447-
--config Debug
448-
COMMENT "Building debug umf library with the d suffix")
450+
build_umfd ALL
451+
COMMAND
452+
${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" -S ${UMF_CMAKE_SOURCE_DIR}
453+
-B ${CMAKE_BINARY_DIR}/umfd_build -DCMAKE_BUILD_TYPE=Debug
454+
-DCMAKE_DEBUG_POSTFIX=d
455+
-DCMAKE_PREFIX_PATH="${UMFD_CMAKE_PREFIX_PATH}"
456+
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
457+
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
458+
-DUMF_USE_DEBUG_POSTFIX=OFF
459+
-DUMF_BUILD_SHARED_LIBRARY=${UMF_BUILD_SHARED_LIBRARY}
460+
-DUMF_BUILD_LEVEL_ZERO_PROVIDER=${UMF_BUILD_LEVEL_ZERO_PROVIDER}
461+
-DUMF_BUILD_CUDA_PROVIDER=${UMF_BUILD_CUDA_PROVIDER}
462+
-DUMF_BUILD_LIBUMF_POOL_JEMALLOC=${UMF_BUILD_LIBUMF_POOL_JEMALLOC}
463+
-DUMF_BUILD_TESTS=OFF -DUMF_BUILD_GPU_TESTS=OFF
464+
-DUMF_BUILD_BENCHMARKS=OFF -DUMF_BUILD_BENCHMARKS_MT=OFF
465+
-DUMF_BUILD_EXAMPLES=OFF -DUMF_BUILD_GPU_EXAMPLES=OFF
466+
-DUMF_BUILD_FUZZTESTS=OFF -DUMF_DISABLE_HWLOC=${UMF_DISABLE_HWLOC}
467+
-DUMF_LINK_HWLOC_STATICALLY=${UMF_LINK_HWLOC_STATICALLY}
468+
-DUMF_HWLOC_NAME=${UMF_HWLOC_NAME}
469+
-DUMF_INSTALL_RPATH=${UMF_INSTALL_RPATH} -DUMF_DEVELOPER_MODE=OFF
470+
-DUMF_FORMAT_CODE_STYLE=OFF -DUMF_TESTS_FAIL_ON_SKIP=OFF
471+
-DUMF_USE_ASAN=OFF -DUMF_USE_UBSAN=OFF -DUMF_USE_TSAN=OFF
472+
-DUMF_USE_MSAN=OFF -DUMF_USE_VALGRIND=OFF -DUMF_USE_COVERAGE=OFF
473+
-DUMF_PROXY_LIB_BASED_ON_POOL=${UMF_PROXY_LIB_BASED_ON_POOL}
474+
COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR}/umfd_build --target
475+
umf --config Debug
476+
COMMENT
477+
"Configuring and building umfd.dll in a separate directory with Debug configuration"
478+
)
449479

450-
# Copy built UMF libraries to the Release build subdirectory
480+
# Copy built UMF libraries to the main binary directory and remove
481+
# umfd_build
482+
if(CMAKE_CONFIGURATION_TYPES)
483+
# Multi-config generator (e.g., Visual Studio)
484+
set(UMFD_DLL_SRC "${CMAKE_BINARY_DIR}/umfd_build/bin/Debug/umfd.dll")
485+
set(UMFD_LIB_SRC "${CMAKE_BINARY_DIR}/umfd_build/lib/Debug/umfd.lib")
486+
set(UMFD_DLL "${CMAKE_BINARY_DIR}/bin/$<CONFIG>/umfd.dll")
487+
set(UMFD_LIB "${CMAKE_BINARY_DIR}/lib/$<CONFIG>/umfd.lib")
488+
else()
489+
# Single-config generator (e.g., Ninja)
490+
set(UMFD_DLL_SRC "${CMAKE_BINARY_DIR}/umfd_build/bin/umfd.dll")
491+
set(UMFD_LIB_SRC "${CMAKE_BINARY_DIR}/umfd_build/lib/umfd.lib")
492+
set(UMFD_DLL "${CMAKE_BINARY_DIR}/bin/umfd.dll")
493+
set(UMFD_LIB "${CMAKE_BINARY_DIR}/lib/umfd.lib")
494+
endif()
495+
496+
if(UMF_BUILD_SHARED_LIBRARY)
497+
add_custom_command(
498+
TARGET build_umfd
499+
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${UMFD_DLL_SRC}
500+
${UMFD_DLL}
501+
COMMENT "Copying umfd.dll to the main binary directory")
502+
endif()
451503
add_custom_command(
452-
TARGET umfd
453-
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/bin/Debug/umfd.dll
454-
${CMAKE_BINARY_DIR}/bin/Release/umfd.dll
455-
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/lib/Debug/umfd.lib
456-
${CMAKE_BINARY_DIR}/lib/Release/umfd.lib
457-
COMMENT "Copying debug libraries to the Release build directory")
504+
TARGET build_umfd
505+
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${UMFD_LIB_SRC}
506+
${UMFD_LIB}
507+
COMMAND ${CMAKE_COMMAND} -E remove_directory
508+
${CMAKE_BINARY_DIR}/umfd_build DEPENDS ${UMFD_DLL}
509+
COMMENT "Copying umfd.lib to the main library directory")
458510
endif()
459511

460512
# This build type check is not possible on Windows when CMAKE_BUILD_TYPE is not
@@ -849,12 +901,18 @@ endif()
849901
# --------------------------------------------------------------------------- #
850902
# Configure make install/uninstall and packages
851903
# --------------------------------------------------------------------------- #
852-
# Install umfd target
904+
# Install the umfd library files as part of the umfd component
853905
if(WINDOWS AND UMF_USE_DEBUG_POSTFIX)
854-
install(FILES ${CMAKE_BINARY_DIR}/bin/Debug/umfd.dll
855-
DESTINATION ${CMAKE_INSTALL_BINDIR})
856-
install(FILES ${CMAKE_BINARY_DIR}/lib/Debug/umfd.lib
857-
DESTINATION ${CMAKE_INSTALL_LIBDIR})
906+
if(UMF_BUILD_SHARED_LIBRARY)
907+
install(
908+
FILES ${UMFD_DLL}
909+
DESTINATION ${CMAKE_INSTALL_BINDIR}
910+
COMPONENT umfd)
911+
endif()
912+
install(
913+
FILES ${UMFD_LIB}
914+
DESTINATION ${CMAKE_INSTALL_LIBDIR}
915+
COMPONENT umfd)
858916
endif()
859917

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

test/test_installation.py

+16-5
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ class UmfInstaller:
2828
proxy (bool): Determines whether the proxy library should be built together with the UMF library
2929
pools (List[str]): A list of enabled pools during the UMF compilation
3030
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
31+
umfd_lib (bool): Determines if the UMF was built with the umfd library
32+
hwloc (bool): Determines if hwloc is installed and should be checked
3233
"""
3334

3435
def __init__(
@@ -42,6 +43,7 @@ def __init__(
4243
pools: List[str],
4344
umf_version: Version,
4445
umfd_lib: bool,
46+
hwloc: bool,
4547
):
4648
self.workspace_dir = workspace_dir
4749
self.build_dir = build_dir
@@ -52,6 +54,7 @@ def __init__(
5254
self.pools = pools
5355
self.umf_version = umf_version
5456
self.umfd_lib = umfd_lib
57+
self.hwloc = hwloc
5558
self.match_list = self._create_match_list()
5659

5760
def _create_match_list(self) -> List[str]:
@@ -76,9 +79,7 @@ def _create_match_list(self) -> List[str]:
7679
lib_prefix = "lib"
7780

7881
bin = []
79-
if platform.system() == "Windows" and (
80-
self.shared_library or self.proxy or self.umfd_lib
81-
):
82+
if platform.system() == "Windows" and (self.shared_library or self.proxy):
8283
bin.append("bin")
8384
if self.shared_library:
8485
bin.append("bin/umf.dll")
@@ -103,8 +104,11 @@ def _create_match_list(self) -> List[str]:
103104
f"lib/cmake/umf/umf-targets-{self.build_type}.cmake",
104105
"lib/cmake/umf/umf-targets.cmake",
105106
]
107+
106108
for pool in self.pools:
107109
lib.append(f"lib/{lib_prefix}{pool}.{lib_ext_static}")
110+
if platform.system() == "Windows" and self.hwloc:
111+
lib.append(f"lib/{lib_prefix}hwloc.{lib_ext_static}")
108112
if self.shared_library:
109113
lib.append(f"lib/{lib_prefix}umf.{lib_ext_shared}")
110114
if platform.system() == "Windows" and self.umfd_lib:
@@ -122,6 +126,8 @@ def _create_match_list(self) -> List[str]:
122126
lib.append(f"lib/{lib_prefix}umf.{self.umf_version}.{lib_ext_shared}")
123127
else:
124128
lib.append(f"lib/{lib_prefix}umf.{lib_ext_static}")
129+
if self.umfd_lib and platform.system() == "Windows":
130+
lib.append(f"lib/{lib_prefix}umfd.{lib_ext_static}")
125131

126132
if self.proxy:
127133
lib.append(f"lib/{lib_prefix}umf_proxy.{lib_ext_shared}")
@@ -135,7 +141,6 @@ def _create_match_list(self) -> List[str]:
135141
f"lib/{lib_prefix}umf_proxy.{self.umf_version.major}.{lib_ext_shared}"
136142
)
137143

138-
share = []
139144
share = [
140145
"share",
141146
"share/doc",
@@ -296,6 +301,11 @@ def parse_arguments(self) -> argparse.Namespace:
296301
action="store_true",
297302
help="Add this argument if the UMF was built with the umfd library",
298303
)
304+
self.parser.add_argument(
305+
"--hwloc",
306+
action="store_true",
307+
help="Add this argument if hwloc is installed and should be checked",
308+
)
299309
return self.parser.parse_args()
300310

301311
def run(self) -> None:
@@ -320,6 +330,7 @@ def run(self) -> None:
320330
pools,
321331
umf_version,
322332
self.args.umfd_lib,
333+
self.args.hwloc,
323334
)
324335

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

0 commit comments

Comments
 (0)