192 lines
6.5 KiB
CMake
192 lines
6.5 KiB
CMake
# CMakeList.txt : Top-level CMake project file, do global configuration
|
|
# and include sub-projects here.
|
|
#
|
|
cmake_minimum_required (VERSION 3.10)
|
|
|
|
list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/tools/cmake)
|
|
include(SubDirList)
|
|
|
|
get_filename_component(PROJECT_DIR ${CMAKE_CURRENT_SOURCE_DIR} NAME)
|
|
string(REPLACE " " "_" PROJECT_DIR ${PROJECT_DIR})
|
|
project(${PROJECT_DIR})
|
|
|
|
set(PROJECT_VERSION_MAJOR 0)
|
|
set(PROJECT_VERSION_MINOR 1)
|
|
set(PROJECT_VERSION_PATCH 0)
|
|
set(PROJECT_VERSION_BRANCH "N/A")
|
|
set(PROJECT_VERSION_COMMIT "N/A")
|
|
|
|
# Get the current working branch
|
|
execute_process(
|
|
COMMAND git rev-parse --abbrev-ref HEAD
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
OUTPUT_VARIABLE PROJECT_VERSION_BRANCH
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
|
|
# Get the latest commit hash
|
|
execute_process(
|
|
COMMAND git rev-parse --short HEAD
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
OUTPUT_VARIABLE PROJECT_VERSION_COMMIT
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
|
|
set(PROJECT_VERSION_FULL ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}-${PROJECT_VERSION_BRANCH}-${PROJECT_VERSION_COMMIT})
|
|
|
|
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
|
|
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/${CMAKE_BUILD_TYPE}/lib)
|
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/${CMAKE_BUILD_TYPE}/lib)
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/${CMAKE_BUILD_TYPE}/bin)
|
|
|
|
set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install)
|
|
|
|
set(CMAKE_CACHEFILE_DIR ${CMAKE_SOURCE_DIR}/build)
|
|
|
|
include(CTest)
|
|
enable_testing()
|
|
|
|
set(CMAKE_CXX_STANDARD 20)
|
|
set(CPACK_PROJECT_NAME ${${PROJECT_NAME}_NAME})
|
|
set(CPACK_PROJECT_VERSION ${${PROJECT_NAME}_VERSION})
|
|
include(CPack)
|
|
|
|
option(${PROJECT_NAME}_BUILD_ENGINE "Build engine library" ON)
|
|
option(${PROJECT_NAME}_BUILD_APPS "Build supplimentary applications" ON)
|
|
option(${PROJECT_NAME}_BUILD_DEPS "Build dependencies" ON)
|
|
|
|
option(ONLY_COVERAGE "Build only tests necessary for coverage" OFF)
|
|
option(LIBCPP "Build with libc++" OFF)
|
|
option(ENABLE_COVERAGE "Enable coverage reporting for gcc/clang" OFF)
|
|
option(ENABLE_ASAN "Enable address sanitizer" OFF)
|
|
option(BUILD_SHARED_LIBS "Enable compilation of shared libraries" OFF)
|
|
option(ENABLE_TESTING "Enable the building of the test" OFF)
|
|
option(ENABLE_CLANG_TIDY "Enable testing with clang-tidy" OFF)
|
|
option(ENABLE_CPPCHECK "Enable testing with cppcheck" OFF)
|
|
option(SIMPLE_BUILD "Build the project as minimally as possible" OFF)
|
|
option(BUILD_DOC "Build the project's documentation" OFF)
|
|
option(FORCE_COLORED_OUTPUT "Always produce ANSI-colored output (GNU/Clang only)." OFF)
|
|
option(DEBUG_LOGGING "Enabling debug logging" OFF)
|
|
|
|
add_library(project_warnings INTERFACE)
|
|
add_library(project_options INTERFACE)
|
|
|
|
if(ONLY_COVERAGE OR ENABLE_COVERAGE)
|
|
target_compile_options(project_options INTERFACE --coverage -O0 -g)
|
|
target_link_libraries(project_options INTERFACE --coverage)
|
|
endif()
|
|
|
|
if(ENABLE_ASAN)
|
|
target_compile_options(project_options INTERFACE -fsanitize=address)
|
|
target_link_libraries(project_options INTERFACE -fsanitize=address)
|
|
endif()
|
|
|
|
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
|
target_compile_options(project_warnings
|
|
INTERFACE
|
|
-Wall
|
|
-Wextra
|
|
-Wshadow
|
|
-Wnon-virtual-dtor
|
|
-Wold-style-cast
|
|
-Wcast-align
|
|
-Wunused
|
|
-Woverloaded-virtual
|
|
-Wpedantic
|
|
-Wconversion
|
|
-Wsign-conversion
|
|
-Wnull-dereference
|
|
-Wdouble-promotion
|
|
-Wformat=2)
|
|
endif()
|
|
|
|
# some GCC specific warnings. These flags are added only if the used compiler is GCC.
|
|
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
|
target_compile_options(project_warnings
|
|
INTERFACE
|
|
-Wmisleading-indentation
|
|
-Wduplicated-cond
|
|
-Wlogical-op
|
|
-Wuseless-cast
|
|
)
|
|
target_link_libraries(project_options INTERFACE stdc++fs)
|
|
endif()
|
|
|
|
if (${FORCE_COLORED_OUTPUT})
|
|
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
|
target_compile_options(project_options INTERFACE -fdiagnostics-color=always)
|
|
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
|
|
target_compile_options(project_options INTERFACE -fcolor-diagnostics)
|
|
endif ()
|
|
endif ()
|
|
|
|
find_program(CCACHE ccache)
|
|
if(CCACHE)
|
|
set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE})
|
|
endif()
|
|
|
|
if(ENABLE_CPPCHECK)
|
|
find_program(CPPCHECK cppcheck)
|
|
if(CPPCHECK)
|
|
set(CMAKE_CXX_CPPCHECK
|
|
${CPPCHECK}
|
|
--suppress=syntaxError
|
|
--enable=all
|
|
--inconclusive)
|
|
else()
|
|
message(SEND_ERROR "cppcheck requested but executable not found")
|
|
endif()
|
|
endif()
|
|
|
|
if(ENABLE_CLANG_TIDY)
|
|
find_program(CLANGTIDY clang-tidy)
|
|
if(CLANGTIDY)
|
|
set(CMAKE_CXX_CLANG_TIDY ${CLANGTIDY})
|
|
else()
|
|
message(SEND_ERROR "clang-tidy requested but executable not found")
|
|
endif()
|
|
endif()
|
|
|
|
if(BUILD_DOC)
|
|
find_package(Doxygen)
|
|
if (DOXYGEN_FOUND)
|
|
SET(DOXYGEN_IN ${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile.in)
|
|
SET(DOXYGEN_OUT ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
|
|
|
|
configure_file(${DOXYGEN_IN} ${DOXYGEN_OUT} @ONLY)
|
|
|
|
add_custom_target(doc ALL
|
|
COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_OUT}
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
|
COMMENT "Buidling Doxygen documentation"
|
|
VERBATIM )
|
|
else (DOXYGEN_FOUND)
|
|
message("No doxygen binary found on the system.")
|
|
SET(${BUILD_DOC} OFF)
|
|
endif ()
|
|
endif()
|
|
|
|
message(STATUS "")
|
|
message(STATUS "Summary")
|
|
#message(STATUS "")
|
|
#message(STATUS "Build libs: \t ${${PROJECT_NAME}_BUILD_DEPS}")
|
|
#message(STATUS "Build src: \t ${${PROJECT_NAME}_BUILD_ENGINE}")
|
|
message(STATUS "")
|
|
message(STATUS "Build type: \t ${CMAKE_BUILD_TYPE}")
|
|
message(STATUS "Install prefix: \t ${CMAKE_INSTALL_PREFIX}")
|
|
message(STATUS "Testing enabled: \t ${ENABLE_TESTING}")
|
|
message(STATUS "Clang-tidy: \t ${ENABLE_CLANG_TIDY}")
|
|
message(STATUS "Cppcheck: \t ${ENABLE_CPPCHECK}")
|
|
message(STATUS "Compiler: \t ${CMAKE_CXX_COMPILER_ID}")
|
|
message(STATUS "Sanizizers: \t ${ENABLE_ASAN}")
|
|
message(STATUS "Shared libs: \t ${BUILD_SHARED_LIBS}")
|
|
message(STATUS "Build libcpp: \t ${LIBCPP}")
|
|
message(STATUS "CCache executable:\t ${CCACHE}")
|
|
message(STATUS "Building doc: \t ${BUILD_DOC}")
|
|
message(STATUS "Force color output:\t ${FORCE_COLORED_OUTPUT}")
|
|
message(STATUS "")
|
|
message(STATUS "Version: \t ${${PROJECT_NAME}_VERSION}")
|
|
message(STATUS "")
|
|
|
|
add_subdirectory("libs")
|
|
add_subdirectory("srcs")
|