ADD_LIBRARY(JFJochIndexing STATIC Indexer.h Indexer.cpp IndexerFactory.h IndexerFactory.cpp IndexerThreadPool.cpp IndexerThreadPool.h AnalyzeIndexing.cpp AnalyzeIndexing.h FitProfileRadius.cpp FitProfileRadius.h PostIndexingRefinement.h FFTResult.h FFTIndexer.cpp FFTIndexer.h PostIndexingRefinement.cpp MultiLatticeSearch.cpp MultiLatticeSearch.h SpindleBlindFraction.cpp SpindleBlindFraction.h HarmonicContamination.cpp HarmonicContamination.h SpindleCuspLoss.cpp SpindleCuspLoss.h LeftoverLattices.cpp LeftoverLattices.h) TARGET_LINK_LIBRARIES(JFJochIndexing JFJochCommon JFJochLatticeSearch) IF (JFJOCH_CUDA_AVAILABLE) # A source archive carries no submodules, which is exactly what is wanted here: ffbidx's bundled # eigen submodule must NOT be added, or it would add_subdirectory a second Eigen3::Eigen target. # ffbidx instead resolves Eigen via the project-level Eigen3 (the find_package(Eigen3) at the top # of image_analysis/CMakeLists.txt). The clone this replaces passed GIT_SUBMODULES "" to get the # same tree. FetchContent_Declare( fast-indexer URL https://github.com/paulscherrerinstitute/fast-feedback-indexer/archive/a94fd4f5c55289e70860feea358182d2072e02b5.tar.gz URL_HASH SHA256=275590cb41db783b822b1c8403abc2b3c9986f3d98a1a7361fc0ad478ff466c0 ) FetchContent_MakeAvailable(fast-indexer) TARGET_SOURCES(JFJochIndexing PRIVATE CUDAMemHelpers.h FFTIndexerGPU.cu FFTIndexerGPU.h FFBIDXIndexer.cpp FFBIDXIndexer.h) # Link cuFFT statically where a static cuFFT exists. It is the only CUDA component that was # ever dynamic (cudart and the fast-feedback indexer are already static), and as a .so it forced # every self-contained artifact to carry the library beside its executables and find it again # through an $ORIGIN rpath -- machinery that silently failed for any executable that was not the # one the rpath had been set on. Static, a Linux artifact is one file that runs, and a cross # build has no alternative anyway: NVIDIA's cross-linux-sbsa packages ship libcufft_static.a and # no libcufft.so at all. # # The Windows CUDA toolkit ships no cufft_static.lib, so CUDA::cufft_static does not exist there # and the dynamic library is the only option; the top-level CMakeLists installs the DLL beside # the executable for the self-contained builds. Test the target rather than the platform, so a # toolkit that gains or loses the static library is handled without another special case. # Both halves matter: the server build keeps the shared library (its .deb/.rpm take CUDA from the # distro, and every executable there -- broker, tests, tools -- would otherwise need the device # link below), and Windows has no static cuFFT to link even for the portable products. IF (JFJOCH_PORTABLE_ONLY AND TARGET CUDA::cufft_static) TARGET_LINK_LIBRARIES(JFJochIndexing fast_indexer_static CUDA::cufft_static) ELSE() TARGET_LINK_LIBRARIES(JFJochIndexing fast_indexer_static CUDA::cufft) ENDIF() ELSE() MESSAGE(WARNING "CUDA is strongly recommended for image analysis." ) TARGET_LINK_LIBRARIES(JFJochIndexing Eigen3::Eigen) ENDIF() # The CPU fast-feedback indexer is always built. Without errno and FP traps to preserve, GCC and Clang # vectorise its scoring loops (sqrt, rint, min/max); neither option changes a computed value. TARGET_SOURCES(JFJochIndexing PRIVATE FFBIDXIndexerCPU.cpp FFBIDXIndexerCPU.h) IF (NOT MSVC) SET_SOURCE_FILES_PROPERTIES(FFBIDXIndexerCPU.cpp PROPERTIES COMPILE_OPTIONS "-fno-math-errno;-fno-trapping-math") ENDIF() # FFTW (fftw3f) is always available via FetchContent -> the CPU FFT indexer is always built. TARGET_SOURCES(JFJochIndexing PRIVATE FFTIndexerCPU.cpp FFTIndexerCPU.h) TARGET_LINK_LIBRARIES(JFJochIndexing fftw3f)