Build Packages / build:rugnux:windows (push) Failing after 2s
Build Packages / build:rugnux-tgz (x86_64) (push) Failing after 14s
Build Packages / build:rugnux:aarch64 (cross) (push) Failing after 30s
Build Packages / Unit tests (push) Canceled after 2m33s
Build Packages / build:rpm (rocky8) (push) Canceled after 0s
Build Packages / build:rpm (rocky9_sls9) (push) Canceled after 0s
Build Packages / build:rpm (rocky9) (push) Canceled after 0s
Build Packages / build:rpm (ubuntu2204) (push) Canceled after 0s
Build Packages / build:rpm (ubuntu2404) (push) Canceled after 0s
Build Packages / DIALS test (push) Canceled after 0s
Build Packages / XDS test (durin plugin) (push) Canceled after 0s
Build Packages / XDS test (JFJoch plugin) (push) Canceled after 0s
Build Packages / XDS test (neggia plugin) (push) Canceled after 0s
Build Packages / Generate python client (push) Canceled after 0s
Build Packages / build:viewer-tgz:cuda (push) Canceled after 2m29s
Build Packages / Build documentation (push) Canceled after 0s
Build Packages / Create release (push) Canceled after 0s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Canceled after 2m19s
Build Packages / build:viewer-tgz:cpu (push) Canceled after 2m31s
Build Packages / build:rpm (rocky8_sls9) (push) Canceled after 1m54s
Build Packages / build:rpm (rocky9_nocuda) (push) Canceled after 2m21s
Build Packages / build:rpm (rocky8_nocuda) (push) Canceled after 2m23s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Canceled after 2m13s
Build Packages / build:windows:cuda (push) Canceled after 2m42s
Build Packages / build:windows:nocuda (push) Canceled after 2m45s
The viewer tarball also carried rugnux, jfjoch_extract_hkl and jfjoch_recompress. A GUI download that contains a batch processor is confusing on its own, and it forced anyone who only wanted rugnux to take Qt with it. JFJOCH_RUGNUX_ONLY is the viewer-only subtree minus viewer/ and tools/, so it needs no Qt at all, and each of the two options now yields one artifact holding one program: JFJOCH_VIEWER_ONLY jfjoch_viewer .tar.gz / installer / .dmg JFJOCH_RUGNUX_ONLY rugnux .tar.gz / .zip The two CLI tools are still built and no longer installed anywhere. rugnux gets a CPack component of its own, so its notices land in share/doc/jfjoch_rugnux. What makes the split possible is linking cuFFT statically in both products. It was the only CUDA component still dynamic - cudart and the fast-feedback indexer were already static - and shipping it as a .so meant each self-contained archive had to carry the library beside its executables and find it again through an $ORIGIN rpath. That rpath was set on jfjoch_viewer alone, while the same tarball installed three more executables, so those shipped with no runpath at all (cmake strips the build-tree one, which points at the build host's CUDA directory) and could not load the libcufft lying next to them. Static, an artifact is one file that runs: the x86_64 rugnux tarball needs only libc, libstdc++, libgcc_s, libm, libpthread, librt and libdl. The bundling code and the rpath both go away. libcufft_static.a carries a relocatable-device-code object, so a consuming executable needs a CUDA device link; CUDA 13 no longer ships the libcufft_static_nocallback.a that used to avoid this. CUDA_RESOLVE_DEVICE_SYMBOLS emits that step while leaving the host link driver alone, so the -march and -flto flags CI passes still apply. The server build keeps the shared library: its .deb/.rpm take CUDA from the distro, and every executable there would otherwise need the same device link. The guards that exclude server-side targets keyed on NOT JFJOCH_VIEWER_ONLY, which a rugnux-only build does not satisfy - it failed on jfjoch_writer pulling in JFJochImagePuller. They now key on JFJOCH_PORTABLE_ONLY, true for either product, rather than on one product's option in five places. docker/ubuntu2404 additionally cross-compiles rugnux for arm64 SBSA, which is both DGX Spark (GB10, sm_121) and Grace Hopper (GH200, sm_90); one binary with both fatbins runs on either. It needed three things beyond a cross gcc. arm64 is published on ports.ubuntu.com and Noble's deb822 sources carry no Architectures: field, so adding the architecture without splitting the entries 404s on every index. The CUDA cross packages are in neither the x86_64 repo nor the sbsa one but in cross-linux-sbsa, whose fatbinary_section.h ships only in the x86_64 target tree even though it is architecture-neutral. And HDF5 has two try_run probes, so qemu-user-static is needed as CMAKE_CROSSCOMPILING_EMULATOR; every other fetched dependency either guards its run-checks or has none. The cross-built tarball is one ELF aarch64 binary carrying all 17 GPU modules for both sm_90 and sm_121, needing no cuFFT and no CUDA runtime at run time. It is untested on hardware: XDS is x86-64 only, so CI can show it links but only a Spark or a GH200 can show it works. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SQjneRUssfhi1k9rq8Ts3h
61 lines
2.9 KiB
CMake
61 lines
2.9 KiB
CMake
|
|
# Offline analysis CLI tools. These link only the portable libraries (reader,
|
|
# image_analysis, writer, common), so they build in viewer-only / Windows packages too
|
|
# and install into the "viewer" component.
|
|
# jfjoch_extract_hkl and jfjoch_recompress are developer utilities: still built, deliberately not
|
|
# installed into any package. They used to ride inside the viewer tarball, which is part of what
|
|
# made that artifact confusing.
|
|
ADD_EXECUTABLE(jfjoch_extract_hkl jfjoch_extract_hkl.cpp
|
|
XdsIntegrateParser.cpp
|
|
XdsIntegrateParser.h)
|
|
TARGET_LINK_LIBRARIES(jfjoch_extract_hkl JFJochReader)
|
|
|
|
# rugnux, the single offline analysis CLI, lives in rugnux/ next to its library.
|
|
|
|
# In-place re-compress /entry/data/data of a _data file from bitshuffle/LZ4 to bitshuffle/zstd.
|
|
ADD_EXECUTABLE(jfjoch_recompress jfjoch_recompress.cpp)
|
|
TARGET_LINK_LIBRARIES(jfjoch_recompress JFJochHDF5Wrappers)
|
|
|
|
# On Windows these CLIs get getopt/getopt_long from the vendored wingetopt shim (libc has none).
|
|
IF (WIN32)
|
|
TARGET_LINK_LIBRARIES(jfjoch_extract_hkl wingetopt)
|
|
ENDIF()
|
|
|
|
# Online / hardware tools (broker, FPGA, receiver, detector). They link the non-portable
|
|
# libraries and are Linux-only, so they are skipped in a viewer-only build.
|
|
IF(NOT JFJOCH_PORTABLE_ONLY)
|
|
ADD_EXECUTABLE(jfjoch_udp_simulator jfjoch_udp_simulator.cpp UDPSimulator.cpp UDPSimulator.h)
|
|
TARGET_LINK_LIBRARIES(jfjoch_udp_simulator JFJochCommon)
|
|
INSTALL(TARGETS jfjoch_udp_simulator RUNTIME COMPONENT jfjoch)
|
|
|
|
ADD_EXECUTABLE(jfjoch_hdf5_test jfjoch_hdf5_test.cpp)
|
|
TARGET_LINK_LIBRARIES(jfjoch_hdf5_test JFJochWriter JFJochReceiver JFJochCommon)
|
|
INSTALL(TARGETS jfjoch_hdf5_test RUNTIME COMPONENT jfjoch)
|
|
|
|
ADD_EXECUTABLE(jfjoch_pcie_status jfjoch_pcie_status.cpp)
|
|
TARGET_LINK_LIBRARIES(jfjoch_pcie_status JFJochDevice JFJochCommon)
|
|
INSTALL(TARGETS jfjoch_pcie_status RUNTIME COMPONENT jfjoch)
|
|
|
|
ADD_EXECUTABLE(jfjoch_pcie_net_cfg jfjoch_pcie_net_cfg.cpp)
|
|
TARGET_LINK_LIBRARIES(jfjoch_pcie_net_cfg JFJochDevice JFJochCommon)
|
|
INSTALL(TARGETS jfjoch_pcie_net_cfg RUNTIME COMPONENT jfjoch)
|
|
|
|
ADD_EXECUTABLE(jfjoch_pcie_clear_net_counters jfjoch_pcie_clear_net_counters.cpp)
|
|
TARGET_LINK_LIBRARIES(jfjoch_pcie_clear_net_counters JFJochDevice JFJochCommon)
|
|
INSTALL(TARGETS jfjoch_pcie_clear_net_counters RUNTIME COMPONENT jfjoch)
|
|
|
|
ADD_EXECUTABLE(jfjoch_fpga_test jfjoch_fpga_test.cpp)
|
|
TARGET_LINK_LIBRARIES(jfjoch_fpga_test JFJochReceiver)
|
|
INSTALL(TARGETS jfjoch_fpga_test RUNTIME COMPONENT jfjoch)
|
|
|
|
ADD_EXECUTABLE(jfjoch_simplon_test jfjoch_simplon_test.cpp)
|
|
TARGET_LINK_LIBRARIES(jfjoch_simplon_test JFJochDetector JFJochPreview)
|
|
INSTALL(TARGETS jfjoch_simplon_test RUNTIME COMPONENT jfjoch)
|
|
|
|
ADD_EXECUTABLE(jfjoch_lite_perf_test jfjoch_lite_perf_test.cpp)
|
|
TARGET_LINK_LIBRARIES(jfjoch_lite_perf_test JFJochReceiver JFJochWriter)
|
|
INSTALL(TARGETS jfjoch_lite_perf_test RUNTIME COMPONENT jfjoch)
|
|
|
|
ADD_SUBDIRECTORY(xbflash.qspi)
|
|
ENDIF()
|