windows: bundle cuFFT in installer and tag the CUDA/CPU variant
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 12m54s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 14m29s
Build Packages / build:rpm (rocky8) (push) Successful in 14m21s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 14m34s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 14m36s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 14m50s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 15m10s
Build Packages / XDS test (neggia plugin) (push) Successful in 7m44s
Build Packages / XDS test (durin plugin) (push) Successful in 8m29s
Build Packages / Generate python client (push) Successful in 31s
Build Packages / Create release (push) Skipped
Build Packages / XDS test (JFJoch plugin) (push) Successful in 8m46s
Build Packages / Build documentation (push) Successful in 56s
Build Packages / build:rpm (rocky9) (push) Successful in 12m39s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 11m23s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 12m5s
Build Packages / DIALS test (push) Successful in 12m59s
Build Packages / Unit tests (push) Successful in 59m10s

cuFFT is the only CUDA component linked dynamically (cudart and the
fast-feedback indexer are static), so the prior Windows installer would
fail to launch the GPU path on a host without a CUDA toolkit. Ship
cufft64_*.dll next to the viewer (CUDA 13 keeps it in bin/x64, earlier
toolkits in bin); the DLL is self-contained, so the installed app needs
only an NVIDIA driver.

Tag the variant where it matters and nowhere else: the installer
filename (-cuda<major> / -cpu) and the Add/Remove Programs entry
("Jungfraujoch (CUDA)" / "(CPU)") advertise it, while the install folder
and Start Menu group stay plain "Jungfraujoch" -- the CUDA build is a
strict superset, so the two variants share a location and replace each
other.

Docs: SOFTWARE.md + JFJOCH_VIEWER.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-21 09:17:52 +02:00
parent 0c1babd0ca
commit ec8a45dc09
4 changed files with 51 additions and 8 deletions
+18 -3
View File
@@ -361,11 +361,26 @@ elseif (WIN32)
# GPLv3 text shown as the click-through license page of the installer.
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE")
# Name the install folder and Start Menu group "Jungfraujoch". CPack uses this single
# variable for both; without it they default to "jfjoch <version>".
# Branding is split across three CPack knobs so the CUDA/CPU variant surfaces exactly where we
# want it and nowhere else:
# - Install folder + Start Menu group come from CPACK_PACKAGE_INSTALL_DIRECTORY and
# CPACK_NSIS_PACKAGE_NAME (the latter feeds $(^Name), the Start Menu group's default folder).
# Both stay plain "Jungfraujoch", so the Start Menu group carries no variant tag and the two
# builds install to the same place (CUDA is a strict superset -- they replace, not coexist).
# - CPACK_NSIS_DISPLAY_NAME is the Add/Remove Programs entry -- tagged "(CUDA)"/"(CPU)".
# - CPACK_PACKAGE_FILE_NAME is the installer .exe filename -- tagged "-cuda<major>"/"-cpu", so
# the (much larger) CUDA download is self-identifying, with the CUDA major version baked in.
# The tag follows JFJOCH_CUDA_AVAILABLE automatically; CUDAToolkit_VERSION_MAJOR is set whenever
# it is ON (find_package(CUDAToolkit) ran in the same guard above).
set(CPACK_PACKAGE_INSTALL_DIRECTORY "Jungfraujoch")
set(CPACK_NSIS_DISPLAY_NAME "Jungfraujoch")
set(CPACK_NSIS_PACKAGE_NAME "Jungfraujoch")
if (JFJOCH_CUDA_AVAILABLE)
set(CPACK_NSIS_DISPLAY_NAME "Jungfraujoch (CUDA)")
set(CPACK_PACKAGE_FILE_NAME "jfjoch-${JFJOCH_VERSION}-win64-cuda${CUDAToolkit_VERSION_MAJOR}")
else()
set(CPACK_NSIS_DISPLAY_NAME "Jungfraujoch (CPU)")
set(CPACK_PACKAGE_FILE_NAME "jfjoch-${JFJOCH_VERSION}-win64-cpu")
endif()
# Start Menu shortcut for the viewer ("<exe basename>;<label>"). The shortcut and the
# Add/Remove Programs entry both use the .exe's embedded icon.
+15 -4
View File
@@ -106,13 +106,24 @@ Notes:
- For a machine without an NVIDIA GPU, add `-DJFJOCH_USE_CUDA=OFF`: the viewer then runs the same
pipeline on the CPU (FFTW indexer) at lower throughput.
To produce a self-contained installer (bundles the Qt runtime via `windeployqt` and the analysis
CLIs), with NSIS installed:
To produce a self-contained installer (bundles the Qt runtime via `windeployqt`, the analysis CLIs,
and — on the CUDA build — the cuFFT runtime DLL, so the target host needs no Qt and no CUDA toolkit,
only an NVIDIA GPU driver), with NSIS installed:
```
cd build-win
cpack
```
The NSIS generator is selected automatically on Windows (no `-G` needed); this writes
`jfjoch-<version>-win64.exe`.
The NSIS generator is selected automatically on Windows (no `-G` needed). The installer filename and
the Add/Remove Programs entry mark the CUDA/CPU variant, while the install folder and Start Menu
group stay plain `Jungfraujoch` (the two variants share an install location and replace each other —
CUDA is a strict superset):
| Build | Installer file | Add/Remove Programs |
| --- | --- | --- |
| CUDA (default) | `jfjoch-<version>-win64-cuda<major>.exe` | `Jungfraujoch (CUDA)` |
| `-DJFJOCH_USE_CUDA=OFF` | `jfjoch-<version>-win64-cpu.exe` | `Jungfraujoch (CPU)` |
`<major>` is the CUDA toolkit major version (e.g. `cuda13`). The cuFFT DLL is ~256 MB, so the CUDA
installer is correspondingly larger — hence the variant tag in the filename.
+3 -1
View File
@@ -10,7 +10,9 @@ but likely possible with providing some packages from external repositories.
The desktop viewer `jfjoch_viewer` (only) can additionally be built on **Windows 11** with Visual
Studio 2026 (MSVC), CUDA 13.3 and Qt 6.11 — see
[jfjoch_viewer ▸ Building from source on Windows](JFJOCH_VIEWER.md#building-from-source-on-windows).
The rest of Jungfraujoch is Linux-only.
The Windows installer bundles the Qt runtime, and on the CUDA build the CUDA runtime (cuFFT) as
well, so end users need neither Qt nor a CUDA toolkit installed — only an NVIDIA GPU driver for the
GPU path. The rest of Jungfraujoch is Linux-only.
## Software dependencies
+15
View File
@@ -168,3 +168,18 @@ IF(Qt6_VERSION VERSION_GREATER_EQUAL "6.5")
NO_UNSUPPORTED_PLATFORM_ERROR)
INSTALL(SCRIPT ${jfjoch_viewer_deploy_script} COMPONENT viewer)
ENDIF()
# Bundle the cuFFT runtime DLL next to the viewer so the installed app runs on Windows hosts that
# have an NVIDIA driver but no CUDA toolkit. cuFFT is the ONLY CUDA component we link dynamically
# (cudart and the fast-feedback indexer are static), so it is the one runtime file the toolkit would
# otherwise have to provide; the DLL is self-contained (depends only on KERNEL32). CUDA 13 keeps
# redistributable DLLs in bin/x64, earlier toolkits in bin -- glob both. Windows + GPU build only.
IF(WIN32 AND JFJOCH_CUDA_AVAILABLE)
FILE(GLOB _cufft_dll
"${CUDAToolkit_BIN_DIR}/x64/cufft64_*.dll"
"${CUDAToolkit_BIN_DIR}/cufft64_*.dll")
IF(NOT _cufft_dll)
MESSAGE(FATAL_ERROR "cuFFT runtime DLL not found under ${CUDAToolkit_BIN_DIR}")
ENDIF()
INSTALL(FILES ${_cufft_dll} DESTINATION bin COMPONENT viewer)
ENDIF()