Windows: viewer installer and rugnux zip from one build
Build Packages / Create release (push) Successful in 39s
Build Packages / build:portable:macos-arm64:nocuda (push) Successful in 3m23s
Build Packages / build:portable:linux-x86_64:nocuda (push) Successful in 7m4s
Build Packages / build:portable:linux-x86_64:cuda (push) Successful in 8m27s
Build Packages / HDF5 consumer tests (DIALS, XDS) (push) Successful in 22m22s
Build Packages / build:portable:windows-x86_64:nocuda (push) Successful in 19m38s
Build Packages / build:rugnux:linux-aarch64:cuda (push) Successful in 5m22s
Build Packages / build:portable:windows-x86_64:cuda (push) Successful in 25m12s
Build Packages / build:jfjoch:rocky8:nocuda (push) Successful in 12m38s
Build Packages / build:jfjoch:rocky9:nocuda (push) Successful in 13m30s
Build Packages / build:jfjoch:ubuntu2204:nocuda (push) Successful in 12m55s
Build Packages / build:jfjoch:ubuntu2404:nocuda (push) Successful in 12m47s
Build Packages / build:jfjoch:rocky8:cuda-sls9 (push) Successful in 14m8s
Build Packages / build:jfjoch:rocky9:cuda-sls9 (push) Successful in 15m48s
Build Packages / build:jfjoch:rocky8:cuda (push) Successful in 15m3s
Build Packages / Generate python client (push) Successful in 33s
Build Packages / Build documentation (push) Successful in 48s
Build Packages / build:jfjoch:rocky9:cuda (push) Successful in 16m18s
Build Packages / build:jfjoch:ubuntu2204:cuda (push) Successful in 14m34s
Build Packages / build:jfjoch:ubuntu2404:cuda (push) Successful in 14m46s
Build Packages / Unit tests (push) Successful in 1h47m51s

The per-generator CPack config written for macOS is now generic and shared: the installer/.dmg
generator gets the viewer, the archive generator (TGZ/ZIP) every other component. A Windows
viewer-only build therefore packs NSIS;ZIP - the jfjoch-viewer installer and
rugnux-<version>-win64-<variant>.zip, name unchanged - and the cuFFT DLL is installed into both
components. CI folds build-rugnux-windows into build-windows (cuda and nocuda, so the Windows
rugnux gains a -cpu zip) and checks the zip holds rugnux.exe, no viewer, and in the CUDA variant
the cuFFT DLL. JFJOCH_RUGNUX_ONLY remains for the aarch64 cross build.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
leonarski_fandClaude Opus 5.5 committed 2026-10-07 21:04:17 +02:00
1 parent 07ae3c3a40
commit 36366295f2
3 files changed
+53 -93

No files matched your search

+21 -64
View File
@@ -151,8 +151,10 @@ jobs:
python3 gitea_upload_file.py "$tgz"
done
# One build packs the viewer installer and the rugnux .zip (CPackProjectConfig.cmake in
# CMakeLists.txt gives each generator its components).
build-windows:
name: build:viewer:windows-x86_64:${{ matrix.variant }}
name: build:portable:windows-x86_64:${{ matrix.variant }}
# Uploads to the release, so it waits for the job that creates it.
needs: create-release
runs-on: windows-11-cuda-qt
@@ -192,22 +194,35 @@ jobs:
run: |
cd build\tests
jfjoch_portable_test.exe "[portable]"
- name: Build installer (NSIS)
- name: Build installer (NSIS) and rugnux zip
shell: cmd
run: |
for /f "usebackq tokens=*" %%i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -property installationPath`) do set "VSPATH=%%i"
call "%VSPATH%\VC\Auxiliary\Build\vcvars64.bat"
cd build
cpack
- name: Upload installer to release
- name: Verify the rugnux zip
shell: powershell
run: |
# rugnux.exe and, in the CUDA variant, the cuFFT DLL it needs - and no viewer.
$zip = Get-ChildItem -Path build -Filter 'rugnux-*-win64-*.zip'
if ($zip.Count -ne 1) { throw 'Expected one rugnux zip in build/' }
Add-Type -AssemblyName System.IO.Compression.FileSystem
$names = [System.IO.Compression.ZipFile]::OpenRead($zip[0].FullName).Entries | ForEach-Object { $_.FullName }
$names
if (-not ($names -match 'rugnux\.exe$')) { throw 'rugnux.exe missing from the zip' }
if ($names -match 'jfjoch_viewer') { throw 'the viewer is in the rugnux zip' }
if ('${{ matrix.use_cuda }}' -eq 'ON' -and -not ($names -match 'cufft64_.*\.dll$')) { throw 'cuFFT DLL missing from the CUDA zip' }
- name: Upload installer and rugnux zip to release
if: github.event_name == 'workflow_dispatch' && (github.event.inputs.create_release == 'true' || github.event.inputs.create_release == true)
shell: powershell
env:
TOKEN: ${{ secrets.PIP_REPOSITORY_API_TOKEN }}
run: |
# NSIS installer named jfjoch-viewer-<version>-win64-{cuda<major>|cpu}.exe (see CMakeLists.txt).
$files = Get-ChildItem -Path build -Filter 'jfjoch-viewer-*-win64-*.exe'
if ($files.Count -eq 0) { throw 'No Windows installer found in build/' }
# NSIS installer jfjoch-viewer-<version>-win64-{cuda<major>|cpu}.exe and
# rugnux-<version>-win64-{cuda<major>|cpu}.zip (see CMakeLists.txt).
$files = @(Get-ChildItem -Path build -Filter 'jfjoch-viewer-*-win64-*.exe') + @(Get-ChildItem -Path build -Filter 'rugnux-*-win64-*.zip')
if ($files.Count -ne 2) { throw 'Expected the installer and the rugnux zip in build/' }
foreach ($file in $files) {
python gitea_upload_file.py $file.FullName
if ($LASTEXITCODE -ne 0) { throw "Upload failed for $($file.Name)" }
@@ -412,64 +427,6 @@ jobs:
python3 gitea_upload_file.py "$tgz"
done
build-rugnux-windows:
name: build:rugnux:windows-x86_64:cuda
# Uploads to the release, so it waits for the job that creates it.
needs: create-release
runs-on: windows-11-cuda-qt
timeout-minutes: 120
steps:
- uses: actions/checkout@v4
# cmd, not bash: the Windows runner has no bash, and every cmake invocation needs the MSVC
# environment from vcvars64.bat first -- same shape as build-windows above. No Qt in
# CMAKE_PREFIX_PATH: JFJOCH_RUGNUX_ONLY is the portable subtree minus viewer/, and every
# library it needs is now fetched and built by the configure, so C:/deps is only a leftover.
- name: Configure rugnux build
shell: cmd
run: |
for /f "usebackq tokens=*" %%i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -property installationPath`) do set "VSPATH=%%i"
call "%VSPATH%\VC\Auxiliary\Build\vcvars64.bat"
cmake -G Ninja -B build-rugnux -DJFJOCH_RUGNUX_ONLY=ON -DJFJOCH_USE_CUDA=ON -DCMAKE_BUILD_TYPE=Release ${{ env.MSVC_ARCH_CMAKE_FLAGS }} -DCMAKE_PREFIX_PATH="C:/deps"
- name: Build rugnux
shell: cmd
run: |
for /f "usebackq tokens=*" %%i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -property installationPath`) do set "VSPATH=%%i"
call "%VSPATH%\VC\Auxiliary\Build\vcvars64.bat"
cmake --build build-rugnux
# The quick cross-platform checks (tests/PortableTest.cpp and the [portable] cases), before
# anything is packaged. CPU-only: the runner has no GPU.
- name: Build portable tests
shell: cmd
run: |
for /f "usebackq tokens=*" %%i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -property installationPath`) do set "VSPATH=%%i"
call "%VSPATH%\VC\Auxiliary\Build\vcvars64.bat"
cmake --build build-rugnux --target jfjoch_portable_test
- name: Run portable tests
shell: cmd
run: |
cd build-rugnux\tests
jfjoch_portable_test.exe "[portable]"
- name: Build rugnux zip
shell: cmd
run: |
for /f "usebackq tokens=*" %%i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -property installationPath`) do set "VSPATH=%%i"
call "%VSPATH%\VC\Auxiliary\Build\vcvars64.bat"
cd build-rugnux
cpack
- name: Upload rugnux zip to release
if: github.event_name == 'workflow_dispatch' && (github.event.inputs.create_release == 'true' || github.event.inputs.create_release == true)
shell: powershell
env:
TOKEN: ${{ secrets.PIP_REPOSITORY_API_TOKEN }}
run: |
# Zip named rugnux-<version>-win64-{cuda<major>|cpu}.zip (see CMakeLists.txt).
$files = Get-ChildItem -Path build-rugnux -Filter 'rugnux-*-win64-*.zip'
if ($files.Count -eq 0) { throw 'No rugnux zip found in build-rugnux/' }
foreach ($file in $files) {
python gitea_upload_file.py $file.FullName
if ($LASTEXITCODE -ne 0) { throw "Upload failed for $($file.Name)" }
}
# ---- Jungfraujoch --------------------------------------------------------------------------------
unit-tests:
name: Unit tests
+31 -28
View File
@@ -61,11 +61,12 @@ SET(JFJOCH_VIEWER_BUILD OFF CACHE BOOL "Compile Jungfraujoch viewer")
# The portable products come out of two build modes; every artifact holds exactly one program:
#
# JFJOCH_VIEWER_ONLY jfjoch_viewer .tar.gz (Linux) / installer (Windows) / .dmg (macOS)
# and, on Linux and macOS, also rugnux and the XDS plugin, each a .tar.gz
# and also rugnux (.tar.gz; .zip on Windows) and, on Linux and macOS,
# the XDS plugin (.tar.gz)
# JFJOCH_RUGNUX_ONLY rugnux .tar.gz (Linux, incl. cross-built aarch64) / .zip (Windows)
#
# The viewer build compiles everything rugnux needs anyway, so one build packs all three; the
# rugnux-only mode remains for where there is no Qt (the aarch64 cross build) and for Windows.
# rugnux-only mode remains for where there is no Qt (the aarch64 cross build).
#
# They used to be one package: the viewer tarball also carried rugnux and two CLI tools, which made
# the download confusing (a GUI package containing a batch processor) and meant a rugnux user had to
@@ -683,9 +684,8 @@ IF (WIN32 AND JFJOCH_CUDA_AVAILABLE AND JFJOCH_PORTABLE_ONLY AND NOT TARGET CUDA
IF (NOT _cufft_dll)
MESSAGE(FATAL_ERROR "cuFFT runtime DLL not found under ${CUDAToolkit_BIN_DIR}")
ENDIF()
IF (JFJOCH_RUGNUX_ONLY)
INSTALL(FILES ${_cufft_dll} DESTINATION bin COMPONENT rugnux)
ELSE()
INSTALL(FILES ${_cufft_dll} DESTINATION bin COMPONENT rugnux)
IF (JFJOCH_VIEWER_ONLY)
INSTALL(FILES ${_cufft_dll} DESTINATION bin COMPONENT viewer)
ENDIF()
ENDIF()
@@ -701,7 +701,7 @@ SET(CPACK_PACKAGE_NAME "jfjoch")
if (JFJOCH_RUGNUX_ONLY)
set(CPACK_COMPONENTS_ALL rugnux)
elseif (JFJOCH_VIEWER_ONLY AND WIN32)
set(CPACK_COMPONENTS_ALL viewer)
set(CPACK_COMPONENTS_ALL viewer rugnux) # there is no native XDS for Windows, so no plugin
elseif (JFJOCH_VIEWER_ONLY)
set(CPACK_COMPONENTS_ALL viewer rugnux xds_plugin)
else()
@@ -740,34 +740,41 @@ else()
set(_jfjoch_tgz_variant "cpu")
endif()
set(CPACK_ARCHIVE_VIEWER_FILE_NAME "jfjoch_viewer-${JFJOCH_VERSION}-${_jfjoch_tgz_os}-${_jfjoch_tgz_variant}")
set(CPACK_ARCHIVE_RUGNUX_FILE_NAME "rugnux-${JFJOCH_VERSION}-${_jfjoch_tgz_os}-${CMAKE_SYSTEM_PROCESSOR}-${_jfjoch_tgz_variant}")
if (WIN32)
set(CPACK_ARCHIVE_RUGNUX_FILE_NAME "rugnux-${JFJOCH_VERSION}-win64-${_jfjoch_tgz_variant}")
else()
set(CPACK_ARCHIVE_RUGNUX_FILE_NAME "rugnux-${JFJOCH_VERSION}-${_jfjoch_tgz_os}-${CMAKE_SYSTEM_PROCESSOR}-${_jfjoch_tgz_variant}")
endif()
set(CPACK_ARCHIVE_XDS_PLUGIN_FILE_NAME "jfjoch_xds_plugin-${JFJOCH_VERSION}-${_jfjoch_tgz_os}-${CMAKE_SYSTEM_PROCESSOR}")
# macOS and Windows pack the viewer as a .dmg / NSIS installer and the other programs of the same
# build (rugnux; on macOS also the XDS plugin) as archives, one each. CPack reads
# CPACK_PROJECT_CONFIG_FILE once per generator, which is where each generator gets its components.
file(WRITE ${CMAKE_BINARY_DIR}/CPackProjectConfig.cmake [=[
if (CPACK_GENERATOR STREQUAL "TGZ" OR CPACK_GENERATOR STREQUAL "ZIP")
list(REMOVE_ITEM CPACK_COMPONENTS_ALL viewer)
set(CPACK_ARCHIVE_COMPONENT_INSTALL ON)
set(CPACK_COMPONENTS_GROUPING IGNORE)
else()
set(CPACK_COMPONENTS_ALL viewer)
endif()
]=])
# OS-aware packaging: DragNDrop (.dmg) on macOS, NSIS installer on Windows, DEB on Debian/Ubuntu,
# RPM on RHEL/Rocky. macOS/Windows are checked first because the /etc/* probes below are Linux-only.
if (APPLE AND NOT JFJOCH_RUGNUX_ONLY)
# .dmg containing jfjoch_viewer.app (Qt runtime already deployed into the bundle). Named like the
# Windows and Linux artifacts; CMAKE_SYSTEM_PROCESSOR is arm64 on Apple Silicon.
# rugnux and the XDS plugin come out of the same build as .tar.gz archives, one each. CPack
# reads CPACK_PROJECT_CONFIG_FILE once per generator, which is where each one gets its own
# components: the viewer alone in the .dmg, the two others in the archives.
# plus rugnux and the XDS plugin as .tar.gz, see CPackProjectConfig.cmake above
set(CPACK_GENERATOR "DragNDrop;TGZ")
set(CPACK_PROJECT_CONFIG_FILE ${CMAKE_BINARY_DIR}/CPackProjectConfig.cmake)
set(CPACK_PACKAGE_FILE_NAME "jfjoch-viewer-${JFJOCH_VERSION}-macos-${CMAKE_SYSTEM_PROCESSOR}")
set(CPACK_DMG_VOLUME_NAME "Jungfraujoch Viewer ${JFJOCH_VERSION}")
file(WRITE ${CMAKE_BINARY_DIR}/CPackProjectConfig.cmake [=[
if (CPACK_GENERATOR STREQUAL "TGZ")
set(CPACK_COMPONENTS_ALL rugnux xds_plugin)
set(CPACK_ARCHIVE_COMPONENT_INSTALL ON)
set(CPACK_COMPONENTS_GROUPING IGNORE)
else()
set(CPACK_COMPONENTS_ALL viewer)
set(CPACK_COMPONENTS_GROUPING ALL_COMPONENTS_IN_ONE)
endif()
]=])
set(CPACK_PROJECT_CONFIG_FILE ${CMAKE_BINARY_DIR}/CPackProjectConfig.cmake)
elseif (WIN32 AND NOT JFJOCH_RUGNUX_ONLY)
# NSIS installer .exe (Qt runtime deployed next to the binary by windeployqt).
set(CPACK_GENERATOR "NSIS")
# NSIS installer .exe (Qt runtime deployed next to the binary by windeployqt), plus rugnux as
# a .zip, see CPackProjectConfig.cmake above.
set(CPACK_GENERATOR "NSIS;ZIP")
set(CPACK_PROJECT_CONFIG_FILE ${CMAKE_BINARY_DIR}/CPackProjectConfig.cmake)
# GPLv3 text shown as the click-through license page of the installer.
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE")
@@ -808,11 +815,7 @@ elseif (WIN32)
set(CPACK_GENERATOR "ZIP")
set(CPACK_ARCHIVE_COMPONENT_INSTALL ON)
set(CPACK_COMPONENTS_GROUPING ALL_COMPONENTS_IN_ONE)
if (JFJOCH_CUDA_AVAILABLE)
set(CPACK_PACKAGE_FILE_NAME "rugnux-${JFJOCH_VERSION}-win64-cuda${CUDAToolkit_VERSION_MAJOR}")
else()
set(CPACK_PACKAGE_FILE_NAME "rugnux-${JFJOCH_VERSION}-win64-cpu")
endif()
set(CPACK_PACKAGE_FILE_NAME ${CPACK_ARCHIVE_RUGNUX_FILE_NAME})
elseif (JFJOCH_VIEWER_ONLY OR JFJOCH_RUGNUX_ONLY)
# Linux portable products: self-contained .tar.gz archives (Qt is linked statically, so there is
# nothing external to ship alongside a binary). Built on the oldest supported distro (RHEL 8) for
+1 -1
View File
@@ -19,7 +19,7 @@ result see [Deployment](DEPLOYMENT.md); for the package-repository URLs see
| `jfjoch-viewer-<version>-macos-arm64.dmg` | Gitea release page | macOS disk image with `jfjoch_viewer.app` (Apple Silicon), the Qt runtime and the license notices inside the app |
| `rugnux-<version>-linux-x86_64-cuda<major>.tgz`, `...-linux-x86_64-cpu.tgz` | Gitea release page | Portable Linux [`rugnux`](RUGNUX.md), the offline analysis CLI, and the license notices. One executable |
| `rugnux-<version>-linux-aarch64-cuda<major>.tgz` | Gitea release page | The same, cross-built for 64-bit Arm — NVIDIA GH200 and DGX Spark |
| `rugnux-<version>-win64-cuda<major>.zip` | Gitea release page | The same for Windows, plus the cuFFT DLL |
| `rugnux-<version>-win64-cuda<major>.zip`, `...-win64-cpu.zip` | Gitea release page | The same for Windows, plus the cuFFT DLL in the CUDA variant |
| `rugnux-<version>-macos-arm64-cpu.tgz` | Gitea release page | The same for macOS on Apple Silicon, CPU only |
| `jfjoch-writer` `.rpm` / `.deb` | Gitea release page | The writer alone, for a file-writing machine without the rest of the stack |
| `jfjoch_xds_plugin-<version>-linux-x86_64.tgz` | Gitea release page | XDS HDF5 read plugin (`lib/libjfjoch_xds_plugin.so.<n>`, built on RHEL 8) and its license notices; see [Integration with MX software](SOFTWARE_INTEGRATION.md) |