cmake_minimum_required(VERSION 3.14) project(tl-generator HOMEPAGE_URL https://tl.tartanllama.xyz DESCRIPTION "Single-header, ranges-compatible generator type built on C++20 coroutines" VERSION 0.3.0 LANGUAGES CXX) include(CMakePackageConfigHelpers) include(CMakeDependentOption) include(GNUInstallDirs) include(FetchContent) include(CTest) find_program(DPKG_BUILDPACKAGE_FOUND dpkg-buildpackage) find_program(RPMBUILD_FOUND rpmbuild) if (NOT DEFINED CMAKE_CXX_STANDARD) set(CMAKE_CXX_STANDARD 20) endif() option(GENERATOR_BUILD_PACKAGE "Build packages" ON) cmake_dependent_option(GENERATOR_BUILD_TESTS "Enable tl::generator tests" ON "BUILD_TESTING" OFF) cmake_dependent_option(GENERATOR_BUILD_PACKAGE_DEB "Create DEB Package (${PROJECT_NAME})" ON "GENERATOR_BUILD_PACKAGE;DPKG_BUILDPACKAGE_FOUND" OFF) cmake_dependent_option(GENERATOR_BUILD_PACKAGE_RPM "Create RPM Package (${PROJECT_NAME})" ON "GENERATOR_BUILD_PACKAGE;RPMBUILD_FOUND" OFF) cmake_dependent_option(GENERATOR_BUILD_PACKAGE_MSI "Create MSI (${PROJECT_NAME})" ON "GENERATOR_BUILD_PACKAGE;CMAKE_HOST_WIN32" OFF) add_library(generator INTERFACE) target_include_directories(generator INTERFACE $ $) if (NOT CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR) add_library(tl::generator ALIAS generator) endif() configure_package_config_file( "${PROJECT_SOURCE_DIR}/cmake/${PROJECT_NAME}-config.cmake.in" "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config.cmake" INSTALL_DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/${PROJECT_NAME}") write_basic_package_version_file( "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake" COMPATIBILITY SameMajorVersion ARCH_INDEPENDENT) install(TARGETS generator EXPORT ${PROJECT_NAME}-targets) install(EXPORT ${PROJECT_NAME}-targets DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/${PROJECT_NAME}" NAMESPACE tl:: FILE "${PROJECT_NAME}-targets.cmake") install(FILES "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake" "${PROJECT_BINARY_DIR}/${PROJECT_NAME}-config.cmake" DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/${PROJECT_NAME}") install(DIRECTORY "include/" TYPE INCLUDE) if (GENERATOR_BUILD_TESTS) set(CMAKE_POLICY_DEFAULT_CMP0077 NEW) set(CATCH_INSTALL_HELPERS OFF) set(CATCH_BUILD_TESTING OFF) set(CATCH_INSTALL_DOCS OFF) FetchContent_Declare(Catch2 URL https://github.com/catchorg/Catch2/archive/v2.9.2.zip) FetchContent_MakeAvailable(Catch2) file(GENERATE OUTPUT catch.main.cpp CONTENT [[ #define CATCH_CONFIG_MAIN #include ]]) set_property(SOURCE ${PROJECT_BINARY_DIR}/catch.main.cpp PROPERTY GENERATED ON) add_library(${PROJECT_NAME}-catch-main OBJECT) target_sources(${PROJECT_NAME}-catch-main PRIVATE ${PROJECT_BINARY_DIR}/catch.main.cpp) target_compile_options(${PROJECT_NAME}-catch-main PUBLIC $<$,$>:-stdlib=libc++> $<$>:-Wall -Wextra> $<$:-fcoroutines>) target_link_options(${PROJECT_NAME}-catch-main PUBLIC $<$,$>:-stdlib=libc++>) target_link_libraries(${PROJECT_NAME}-catch-main PUBLIC Catch2::Catch2 generator) file(GLOB test-sources CONFIGURE_DEPENDS tests/*.cpp) foreach (source IN LISTS test-sources) get_filename_component(name "${source}" NAME_WE) set(test "${PROJECT_NAME}-test-${name}") add_executable(${test} "${source}" $) target_link_libraries(${test} PRIVATE ${PROJECT_NAME}-catch-main) add_test(NAME ${PROJECT_NAME}::test::${name} COMMAND ${test}) endforeach() endif() if (NOT GENERATOR_BUILD_PACKAGE) return() endif() list(APPEND source-generators TBZ2 TGZ TXZ ZIP) if (GENERATOR_BUILD_PACKAGE_MSI) list(APPEND binary-generators "WIX") endif() if (GENERATOR_BUILD_PACKAGE_DEB) list(APPEND binary-generators "DEB") endif() if (GENERATOR_BUILD_PACKAGE_RPM) list(APPEND binary-generators "RPM") endif() set(CPACK_SOURCE_GENERATOR ${source-generators}) set(CPACK_GENERATOR ${binary-generators}) set(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}") set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_FILENAME}") set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Sy Brand") list(APPEND CPACK_SOURCE_IGNORE_FILES /.git/ /build/ .gitignore .DS_Store) include(CPack)