cmake_minimum_required(VERSION 3.13)
project(cninja
  LANGUAGES CXX
  VERSION 3.7.9
  HOMEPAGE_URL "https://github.com/jcelerier/cninja"
  DESCRIPTION "Opinionated CMake config manager"
)

enable_testing()

if(CMAKE_VERSION VERSION_GREATER 3.19)
  cmake_policy(SET CMP0110 OLD)
endif()

set(CMAKE_INCLUDE_CURRENT_DIR ON)

# Dependencies
find_package(Boost REQUIRED)
find_package(Catch2)

# Create target
add_library(cn STATIC)

target_include_directories(cn
  PUBLIC
    3rdparty/fmt/include
    3rdparty/filesystem/include

    src/
)

target_sources(cn
  PRIVATE
    src/cn/builtins.hpp
    src/cn/check.hpp
    src/cn/config.hpp
    src/cn/fmt.hpp
    src/cn/fs.hpp
    src/cn/graph.hpp
    src/cn/generate.hpp
    src/cn/options.hpp
    src/cn/system.hpp
    src/cn/util.hpp

    src/cn/builtins.cpp
    src/cn/check.cpp
    src/cn/config.cpp
    src/cn/fs.cpp
    src/cn/generate.cpp
    src/cn/graph.cpp
    src/cn/options.cpp

    src/builtins/asan.cmake
    src/builtins/clang.cmake
    src/builtins/compiler.cmake
    src/builtins/debugmode.cmake
    src/builtins/debugsplit.cmake
    src/builtins/debugsyms.cmake
    src/builtins/default.cmake
    src/builtins/earlybinding.cmake
    src/builtins/era.cmake
    src/builtins/examples.cmake
    src/builtins/fast.cmake
    src/builtins/finish.cmake
    src/builtins/gcc.cmake
    src/builtins/gdbindex.cmake
    src/builtins/libcxx.cmake
    src/builtins/linker.cmake
    src/builtins/linker-optimizations.cmake
    src/builtins/linker-warnings.cmake
    src/builtins/lld.cmake
    src/builtins/mold.cmake
    src/builtins/lto.cmake
    src/builtins/no-examples.cmake
    src/builtins/no-tests.cmake
    src/builtins/plain.cmake
    src/builtins/post.cmake
    src/builtins/pre.cmake
    src/builtins/small.cmake
    src/builtins/start.cmake
    src/builtins/static.cmake
    src/builtins/tests.cmake
    src/builtins/tsan.cmake
    src/builtins/ubsan.cmake
    src/builtins/visibility.cmake
    src/builtins/warnings.cmake
)

target_compile_features(cn
  PUBLIC
    cxx_std_23
)

target_link_libraries(cn
  PUBLIC
    Boost::boost
)

add_executable(cninja src/main.cpp)
target_link_libraries(cninja PRIVATE cn)

# Generate the builtins header
include(cmake/generate-builtins.cmake)

# Install target
install(
  TARGETS
    cninja
  RUNTIME DESTINATION
    bin
)

# Tests
include(cmake/setup-tests.cmake)
if(TARGET Catch2::Catch2)
  add_executable(graph_test tests/unit/graph.cpp)
  target_link_libraries(graph_test PRIVATE cn Catch2::Catch2WithMain)

  include(CTest)
  include(Catch)
  catch_discover_tests(graph_test)
endif()

# Packaging
set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY OFF)
set(CPACK_GENERATOR "ZIP")
include(CPack)
