# libxckernel build. Machine-generated by xckernel; do not edit.
# Copyright (c) 2026 Susi Lehtola.
cmake_minimum_required(VERSION 3.16)
project(xckernel VERSION 0.1.0 LANGUAGES CXX)

option(XCKERNEL_FORTRAN "Build the Fortran interface module" ON)
# The response-kernel sources grow steeply with derivative order; exclude
# orders you do not need at configure time (kernels above the limit are
# declared in the header but not compiled).
set(XCKERNEL_MAX_ORDER 4 CACHE STRING
    "Highest derivative order to compile (0-4)")

add_library(xckernel)
if(XCKERNEL_MAX_ORDER GREATER_EQUAL 0)
    target_sources(xckernel PRIVATE
        src/xck_lda_r_o0.cpp
        src/xck_gga_r_o0.cpp
        src/xck_mgga_tau_r_o0.cpp
    )
endif()
if(XCKERNEL_MAX_ORDER GREATER_EQUAL 1)
    target_sources(xckernel PRIVATE
        src/xck_lda_r_o1.cpp
        src/xck_lda_ua_o1.cpp
        src/xck_lda_ub_o1.cpp
        src/xck_gga_r_o1.cpp
        src/xck_gga_ua_o1.cpp
        src/xck_gga_ub_o1.cpp
        src/xck_mgga_tau_r_o1.cpp
        src/xck_mgga_tau_ua_o1.cpp
        src/xck_mgga_tau_ub_o1.cpp
    )
endif()
if(XCKERNEL_MAX_ORDER GREATER_EQUAL 2)
    target_sources(xckernel PRIVATE
        src/xck_lda_r_o2.cpp
        src/xck_lda_ua_o2.cpp
        src/xck_lda_ub_o2.cpp
        src/xck_lda_st_o2_p.cpp
        src/xck_lda_st_o2_m.cpp
        src/xck_gga_r_o2.cpp
        src/xck_gga_ua_o2.cpp
        src/xck_gga_ub_o2.cpp
        src/xck_gga_st_o2_p.cpp
        src/xck_gga_st_o2_m.cpp
        src/xck_mgga_tau_r_o2.cpp
        src/xck_mgga_tau_ua_o2.cpp
        src/xck_mgga_tau_ub_o2.cpp
        src/xck_mgga_tau_st_o2_p.cpp
        src/xck_mgga_tau_st_o2_m.cpp
    )
endif()
target_compile_definitions(xckernel PUBLIC
    XCKERNEL_MAX_ORDER=${XCKERNEL_MAX_ORDER})
set_target_properties(xckernel PROPERTIES
    CXX_STANDARD 17
    CXX_STANDARD_REQUIRED ON
    POSITION_INDEPENDENT_CODE ON
    VERSION ${PROJECT_VERSION}
    SOVERSION ${PROJECT_VERSION_MAJOR})
target_include_directories(xckernel PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:include>)

if(XCKERNEL_FORTRAN)
    enable_language(Fortran)
    add_library(xckernel_f03 fortran/xckernel_f03.f90)
    target_link_libraries(xckernel_f03 PUBLIC xckernel)
endif()

include(GNUInstallDirs)
install(TARGETS xckernel EXPORT xckernelTargets
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
install(FILES include/xckernel.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(DIRECTORY include/xckernel DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(FILES manifest.json
    DESTINATION ${CMAKE_INSTALL_DATADIR}/xckernel)
if(XCKERNEL_FORTRAN)
    install(TARGETS xckernel_f03 EXPORT xckernelTargets
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
endif()
install(EXPORT xckernelTargets NAMESPACE xckernel::
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/xckernel)
