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)
TARGET_LINK_LIBRARIES(JFJochIndexing JFJochCommon JFJochLatticeSearch)

IF (JFJOCH_CUDA_AVAILABLE)
    # GIT_SUBMODULES "" -> do not fetch ffbidx's bundled eigen submodule; 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).
    FetchContent_Declare(
            fast-indexer
            GIT_REPOSITORY https://github.com/paulscherrerinstitute/fast-feedback-indexer/
            GIT_TAG a94fd4f5c55289e70860feea358182d2072e02b5
            GIT_SUBMODULES ""
    )

    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()

# 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)
