cmake_minimum_required(VERSION 3.24)

foreach(LIBRARY IN LISTS SCALUQ_LIBRARIES)
    target_link_libraries(${LIBRARY} PUBLIC
        Kokkos::kokkos
        nlohmann_json::nlohmann_json
    )
    target_include_directories(${LIBRARY} PRIVATE $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include>)
    target_include_directories(${LIBRARY} PRIVATE ${eigen_SOURCE_DIR})
    if(SCALUQ_STATIC_ANALYSIS)
        target_include_directories(${LIBRARY} BEFORE PRIVATE
            ${CMAKE_CURRENT_SOURCE_DIR}/analysis_stubs)
    endif()
    if(${LIBRARY} STREQUAL scaluq_base)
        target_sources(${LIBRARY} PRIVATE
            base/kokkos.cpp
            base/util/utility.cpp
        )
    else()
        if(NOT SCALUQ_STATIC_ANALYSIS)
            target_precompile_headers(${LIBRARY} PRIVATE
                "${CMAKE_CURRENT_SOURCE_DIR}/scaluq_pch.hpp")
        endif()
        target_link_libraries(${LIBRARY} PRIVATE scaluq_base)
        target_sources(${LIBRARY} PRIVATE
            gate/merge_gate.cpp
            gate/gate_matrix.cpp
            gate/update_ops_matrix.cpp
            gate/update_ops_standard.cpp
            gate/update_ops_dm_standard.cpp
            state/state_vector.cpp
            state/state_vector_batched.cpp
            state/density_matrix.cpp
            operator/operator.cpp
            operator/operator_batched.cpp
            util/utility.cpp
            types.cpp
        )

        if(${LIBRARY} MATCHES "scaluq_default_")
            target_sources(${LIBRARY} PRIVATE
                circuit/circuit.cpp
                qasm/qasm2.cpp
                operator/pauli_operator.cpp
                gate/gate_pauli.cpp
                gate/gate_probabilistic.cpp
                gate/gate_measurement.cpp
                gate/gate_standard.cpp
                gate/gate.cpp
                gate/param_gate_pauli.cpp
                gate/param_gate_probabilistic.cpp
                gate/param_gate_standard.cpp
                gate/param_gate.cpp
            )
        endif()
    endif()
endforeach()

install(DIRECTORY ${PROJECT_SOURCE_DIR}/include/scaluq DESTINATION include/scaluq)
install(TARGETS scaluq ${SCALUQ_LIBRARIES} kokkos kokkoscore kokkoscontainers kokkosalgorithms kokkossimd nlohmann_json EXPORT scaluqTargets LIBRARY DESTINATION lib PUBLIC_HEADER DESTINATION include)
install(EXPORT scaluqTargets FILE scaluq-config.cmake DESTINATION share/cmake/scaluq/ NAMESPACE scaluq::)
