cmake_minimum_required(VERSION 3.19 FATAL_ERROR) project(BillySheet LANGUAGES CXX C) #set(GLEW_USE_STATIC_LIBS ON) find_package(OpenGL REQUIRED) find_package(GLEW REQUIRED) find_package(Boost REQUIRED COMPONENTS stacktrace_addr2line) include_directories(${Boost_INCLUDE_DIR}) file(GLOB_RECURSE SOURCE_HEADERS include/*.h include/*.hpp external/ImFileDialog/*.h ) file(GLOB_RECURSE SOURCE_FILES src/*.cpp external/ImFileDialog/ImFileDialog.cpp ) set(SOURCES ${SOURCE_HEADERS} ${SOURCE_FILES}) find_program(CCACHE_FOUND ccache) if (CCACHE_FOUND) message(STATUS "ccache found !") set_property(GLOBAL PROPERTY C_COMPILER_LAUNCHER ccache) set_property(GLOBAL PROPERTY C_LINKER_LAUNCHER ccache) set_property(GLOBAL PROPERTY CXX_COMPILER_LAUNCHER ccache) set_property(GLOBAL PROPERTY CXX_LINKER_LAUNCHER ccache) else () message(STATUS "ccache not found") endif () add_subdirectory(external/svector) option(BUILD_SHARED_LIBS "Build shared libraries" OFF) option(GLFW_BUILD_EXAMPLES "Build the GLFW example programs" OFF) option(GLFW_BUILD_TESTS "Build the GLFW test programs" OFF) option(GLFW_BUILD_DOCS "Build the GLFW documentation" OFF) option(GLFW_INSTALL "Generate installation target" OFF) option(GLFW_VULKAN_STATIC "Assume the Vulkan loader is linked with the application" OFF) add_subdirectory(external/glfw) option(SPDLOG_ENABLE_PCH "Build static or shared library using precompiled header to speed up compilation time" ON) option(SPDLOG_BUILD_WARNINGS "Enable compiler warnings" ON) option(SPDLOG_PREVENT_CHILD_FD "Prevent from child processes to inherit log file descriptors" ON) option(SPDLOG_NO_THREAD_ID "prevent spdlog from querying the thread id on each log call if thread id is not needed" ON) option(SPDLOG_NO_TLS "prevent spdlog from using thread local storage" ON) option(SPDLOG_NO_ATOMIC_LEVELS "prevent spdlog from using of std::atomic log levels (use only if your code never modifies log levels concurrently" ON) add_subdirectory(external/spdlog) set(JSON_BuildTests OFF CACHE INTERNAL "") option(JSON_ImplicitConversions "Enable implicit conversions." OFF) option(JSON_SystemInclude "Include as system headers (skip for clang-tidy)." ON) add_subdirectory(external/json) option(CATCH_INSTALL_DOCS "Install documentation alongside library" OFF) option(CATCH_INSTALL_EXTRAS "Install extras alongside library" OFF) add_subdirectory(external/catch2) set(COMPILE_FLAGS -pipe -march=znver3 # change to native or your architecture. -mtune=znver3 # same as above -mrdseed # be careful about this, this is linked to the x86 architecture. -mrdrnd # same as above -Wall -Wextra -Wpedantic # -Wpadded -pedantic $<$:-ffunction-sections -fdata-sections> -fuse-ld=gold -funroll-loops -fdevirtualize-at-ltrans -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free ) set(LINKER_OPTIONS -Wl,--sort-common,--as-needed$<$:,--gc-sections,--strip-all> -fuse-ld=gold -fdevirtualize-at-ltrans ) set(LINKER_FLAGS jemalloc ) option(ENABLE_COVERAGE "Enabling coverage" OFF) if (${ENABLE_COVERAGE}) message(STATUS "Coverage enabled") list(APPEND COMPILE_FLAGS --coverage) list(APPEND LINKER_OPTIONS --coverage) list(APPEND LINKER_FLAGS gcov) endif () add_subdirectory("Unit testing") add_executable(BillySheet ${SOURCES}) target_include_directories(BillySheet PRIVATE include include/imgui external/ImFileDialog) set_target_properties(BillySheet spdlog svector PROPERTIES CXX_STANDARD 17 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF INTERPROCEDURAL_OPTIMIZATION ON # UNITY_BUILD ON ) set_target_properties(spdlog svector PROPERTIES UNITY_BUILD ON) set_target_properties(glfw PROPERTIES C_STANDARD 11 C_STANDARD_REQUIRED ON C_EXTENSIONS OFF INTERPROCEDURAL_OPTIMIZATION ON UNITY_BUILD ON ) target_compile_definitions(BillySheet PRIVATE $<$:_GLIBCXX_DEBUG> $<$:SPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_DEBUG> $<$:SPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_ERROR>) target_compile_definitions(spdlog PRIVATE $<$:_GLIBCXX_DEBUG>) target_compile_definitions(svector INTERFACE $<$:_GLIBCXX_DEBUG>) target_compile_definitions(glfw PRIVATE $<$:_GLIBCXX_DEBUG>) target_compile_options(spdlog PRIVATE ${COMPILE_FLAGS}) target_compile_options(svector INTERFACE ${COMPILE_FLAGS}) target_compile_options(glfw PRIVATE ${COMPILE_FLAGS}) target_compile_options(BillySheet PRIVATE ${COMPILE_FLAGS}) target_link_options(spdlog PRIVATE ${LINKER_OPTIONS}) target_link_options(svector INTERFACE ${LINKER_OPTIONS}) target_link_options(glfw PRIVATE ${LINKER_OPTIONS}) target_link_options(BillySheet PRIVATE ${LINKER_OPTIONS}) target_link_libraries(spdlog PRIVATE ${LINKER_FLAGS}) target_link_libraries(svector INTERFACE ${LINKER_FLAGS}) target_link_libraries(glfw PRIVATE ${LINKER_FLAGS}) target_link_libraries(BillySheet glfw spdlog::spdlog_header_only svector::svector OpenGL::OpenGL GLEW::GLEW nlohmann_json::nlohmann_json ${Boost_LIBRARIES} ${LINKER_FLAGS} )