cmake_minimum_required(VERSION 3.14.0)

# POLICIES #####################
if (POLICY CMP0076)
    cmake_policy(SET CMP0076 NEW)
endif ()

configure_file(
        ${CMAKE_CURRENT_SOURCE_DIR}/include/pallas/pallas_config.h.in
        ${CMAKE_CURRENT_BINARY_DIR}/include/pallas/pallas_config.h
        @ONLY
)

if (_PIP AND NOT Python3_DYNAMIC)
    add_library(pallas STATIC)
    set_property(TARGET pallas PROPERTY POSITION_INDEPENDENT_CODE ON)
else()
    add_library(pallas SHARED)
endif()

set(PALLAS_HEADERS
        include/pallas/pallas_archive.h
        include/pallas/pallas_attribute.h
        ${CMAKE_CURRENT_BINARY_DIR}/include/pallas/pallas_config.h
        include/pallas/pallas.h
        include/pallas/pallas_read.h
        include/pallas/pallas_write.h
        include/pallas/pallas_record.h
)
set(PALLAS_UTILS_HEADERS
        include/pallas/utils/pallas_log.h
        include/pallas/utils/pallas_dbg.h
        include/pallas/utils/pallas_hash.h
        include/pallas/utils/pallas_linked_vector.h
        include/pallas/utils/pallas_storage.h
        include/pallas/utils/pallas_timestamp.h
       include/pallas/utils/pallas_parameter_handler.h
)

target_sources(pallas
        PRIVATE
        src/pallas.cpp
        src/pallas_archive.cpp
        src/pallas_attribute.cpp
        src/pallas_dbg.cpp
        src/pallas_hash.cpp
        src/pallas_read.cpp
        src/pallas_storage.cpp
        src/pallas_timestamp.cpp
        src/pallas_write.cpp
        src/pallas_linked_vector.cpp
        src/pallas_parameter_handler.cpp
        src/pallas_record.cpp
        ${PALLAS_UTILS_HEADERS}
        PUBLIC
        ${PALLAS_HEADERS}
)

target_include_directories(pallas
        PUBLIC
        ${CMAKE_CURRENT_SOURCE_DIR}
        include
        ${ZSTD_INCLUDE_DIRS}
        ${CMAKE_CURRENT_BINARY_DIR}/include/pallas/
)
if (ZFP_FOUND)
    target_include_directories(pallas PUBLIC ${ZFP_INCLUDE_DIRS})
    target_link_libraries(pallas PRIVATE ${ZFP_LIBRARIES})
endif ()


if (SZ_FOUND)
    target_include_directories(pallas PUBLIC ${SZ_INCLUDE_DIRS})
    target_link_libraries(pallas PRIVATE ${SZ_LIBRARIES})
endif ()

set_property(TARGET pallas
        PROPERTY PUBLIC_HEADER ${PALLAS_HEADERS}
)
set_property(TARGET pallas
        PROPERTY PRIVATE_HEADER ${PALLAS_UTILS_HEADERS}
)

target_compile_options(pallas
        PUBLIC
        -D_GNU_SOURCE
        PRIVATE
        -Wall -Wextra ${WARNINGS}
)

if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
    target_compile_options(pallas PRIVATE -Wno-nontrivial-memaccess)
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
    target_compile_options(pallas PRIVATE -Wno-class-memaccess)
endif()
message("Warning list: ${WARNINGS}")

target_link_libraries(pallas
        PUBLIC
        unordered_dense::unordered_dense
        dl
        PRIVATE
        ${CMAKE_DL_LIBS}
        m
        ${ZSTD_LIBRARIES}
)
target_link_directories(pallas PRIVATE ${ZSTD_LIBRARY_DIRS})
if (DOXYGEN_FOUND AND BUILD_DOC)
    set(DOXYGEN_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/doc")
    set(DOXYGEN_EXTRACT_PRIVATE YES)
    set(DOXYGEN_EXTRACT_PRIV_VIRTUAL YES)
    set(DOXYGEN_EXTRACT_ALL YES)
    set(DOXYGEN_EXTRACT_PACKAGE YES)
    set(DOXYGEN_HTML_COLORSTYLE LIGHT)
    set(DOXYGEN_GENERATE_LATEX NO)
    set(DOXYGEN_JAVADOC_AUTOBRIEF YES)
    set(DOXYGEN_RECURSIVE YES)

    set(DOXYGEN_ENABLE_PREPROCESSING YES)
    set(DOXYGEN_MACRO_EXPANSION YES)
    set(DOXYGEN_EXPAND_ONLY_PREDEF YES)
#    set(DOXYGEN_MACRO_EXPANSION YES)

    set(DOXYGEN_PREDEFINED "CXX(x)=x" \\\n
            "C_CXX(x,y)=y" \\\n
            "DEFINE_Vector(type, name)=std::vector<type> name { std::vector<type>() }" \\\n
            "DEFINE_TokenCountMap(name)=TokenCountMap name" \\\n
            "PALLAS(x)=pallas::x" \\\n
            "__cplusplus")

    set(DOXYGEN_STRIP_FROM_PATH "${CMAKE_CURRENT_SOURCE_DIR}" ${CMAKE_CURRENT_BINARY_DIR})

    # note the option ALL which allows to build the docs together with the application
    doxygen_add_docs(pallas_doc ALL
            WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
            COMMENT "Generating API documentation with Doxygen"
            ${CMAKE_CURRENT_SOURCE_DIR}/include/pallas/
            ${CMAKE_CURRENT_SOURCE_DIR}/include/pallas/utils
            ${CMAKE_CURRENT_BINARY_DIR}/include/pallas/
            ${CMAKE_CURRENT_SOURCE_DIR}/src
    )

    install(DIRECTORY "${DOXYGEN_OUTPUT_DIRECTORY}" TYPE DOC)
else ()
    if (NOT DOXYGEN_FOUND)
        message("Doxygen need to be installed to generate the doxygen documentation")
    endif ()
endif ()

if (NOT _PIP)
    install(TARGETS pallas EXPORT PALLASLibTargets
          LIBRARY DESTINATION ${INSTALL_LIBDIR}
          PUBLIC_HEADER DESTINATION ${INSTALL_INCLUDEDIR}/pallas
          PRIVATE_HEADER DESTINATION ${INSTALL_INCLUDEDIR}/pallas/utils
  )
    install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/pallas.config DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/)
endif()

