cmake_minimum_required(VERSION 3.20 FATAL_ERROR)

set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
include(PreventInSourceBuilds)

project(LibHeinz VERSION 4.0.0 LANGUAGES CXX)

## Options.

if(NOT DEFINED BUILD_SHARED_LIBS)
    option(BUILD_SHARED_LIBS "Build as shared library" ON)
endif()
option(PEDANTIC "Compile with pedantic warnings" ON)
option(WERROR "Treat warnings as errors" OFF)

## Compiler settings.

set(CMAKE_CXX_STANDARD 20)
add_compile_options(-O2)
if(WIN32)
    set(WINDOWS_EXPORT_ALL_SYMBOLS ON)
    message(STATUS "compiling for Windows")
else()
    add_compile_options(-Wall -Wno-unknown-pragmas)
    if(PEDANTIC)
        add_compile_options(-pedantic)
    endif()
endif()
if(WERROR)
    add_compile_options(-Werror)
endif()

## Subdirectories.

include(GNUInstallDirs)
include(CTest)

add_subdirectory(heinz)
add_subdirectory(test)

## CPack settings.

include(InstallRequiredSystemLibraries)
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
set(CPACK_PACKAGE_VERSION_MAJOR "${LibHeinz_VERSION_MAJOR}")
set(CPACK_PACKAGE_VERSION_MINOR "${LibHeinz_VERSION_MINOR}")
set(CPACK_SOURCE_GENERATOR "TGZ")
include(CPack)

## Config files.

set(CMAKECONFIG_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")

include(CMakePackageConfigHelpers)
configure_package_config_file("${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in"
    "${CMAKE_CURRENT_BINARY_DIR}/LibHeinzConfig.cmake"
    INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR}
    NO_SET_AND_CHECK_MACRO
    NO_CHECK_REQUIRED_COMPONENTS_MACRO)

write_basic_package_version_file(
    "${CMAKE_CURRENT_BINARY_DIR}/LibHeinzConfigVersion.cmake"
    VERSION "${LibHeinz_VERSION}"
    COMPATIBILITY SameMajorVersion)

install(FILES
    "${PROJECT_BINARY_DIR}/LibHeinzConfig.cmake"
    "${PROJECT_BINARY_DIR}/LibHeinzConfigVersion.cmake"
    DESTINATION ${CMAKECONFIG_INSTALL_DIR} COMPONENT dev)

install(EXPORT LibHeinzTargets
    NAMESPACE "LibHeinz::"
    FILE "LibHeinzTargets.cmake"
    DESTINATION ${CMAKECONFIG_INSTALL_DIR})
