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
    # (OVERRIDE_FIND_PACKAGE in the top-level CMakeLists).
    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)
    TARGET_LINK_LIBRARIES(JFJochIndexing fast_indexer_static
            CUDA::cufft
    )
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)
