🎉 init(cmake): init modern cmake template
This commit is contained in:
78
CMakeLists.txt
Normal file
78
CMakeLists.txt
Normal file
@@ -0,0 +1,78 @@
|
||||
# Works with 3.14 and tested through 3.29
|
||||
cmake_minimum_required(VERSION 3.14...3.29)
|
||||
|
||||
# Project name and a few useful settings. Other commands can pick up the results
|
||||
project(
|
||||
ModernCMakeExample
|
||||
VERSION 0.1
|
||||
DESCRIPTION "An example project with CMake"
|
||||
LANGUAGES CXX)
|
||||
|
||||
# Only do these if this is the main project, and not if it is included through add_subdirectory
|
||||
if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
|
||||
|
||||
# Optionally set things like CMAKE_CXX_STANDARD, CMAKE_POSITION_INDEPENDENT_CODE here
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
# set(CMAKE_CXX_STANDARD_REQUIRED 17)
|
||||
set(default_build_type "Release")
|
||||
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
||||
message(STATUS "Setting build type to '${default_build_type}' as none was specified.")
|
||||
set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE
|
||||
STRING "Choose the type of build." FORCE)
|
||||
# Set the possible values of build type for cmake-gui
|
||||
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
|
||||
"Debug" "Release" "MinSizeRel" "RelWithDebInfo")
|
||||
endif()
|
||||
|
||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||
|
||||
# Let's ensure -std=c++xx instead of -std=g++xx
|
||||
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||
|
||||
# Let's nicely support folders in IDEs
|
||||
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||
|
||||
# Testing only available if this is the main app
|
||||
# Note this needs to be done in the main CMakeLists
|
||||
# since it calls enable_testing, which must be in the
|
||||
# main CMakeLists.
|
||||
include(CTest)
|
||||
|
||||
# Docs only available if this is the main app
|
||||
find_package(Doxygen)
|
||||
if(Doxygen_FOUND)
|
||||
add_subdirectory(docs)
|
||||
else()
|
||||
message(STATUS "Doxygen not found, not building docs")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# FetchContent added in CMake 3.11, downloads during the configure step
|
||||
# FetchContent_MakeAvailable was added in CMake 3.14; simpler usage
|
||||
include(FetchContent)
|
||||
|
||||
# Accumulator library
|
||||
# This is header only, so could be replaced with git submodules or FetchContent
|
||||
find_package(Boost REQUIRED)
|
||||
# Adds Boost::boost
|
||||
|
||||
# Formatting library
|
||||
FetchContent_Declare(
|
||||
fmtlib
|
||||
GIT_REPOSITORY https://github.com/fmtlib/fmt.git
|
||||
GIT_TAG 5.3.0)
|
||||
FetchContent_MakeAvailable(fmtlib)
|
||||
# Adds fmt::fmt
|
||||
|
||||
# The compiled library code is here
|
||||
add_subdirectory(src)
|
||||
|
||||
# The executable code is here
|
||||
add_subdirectory(apps)
|
||||
|
||||
# Testing only available if this is the main app
|
||||
# Emergency override MODERN_CMAKE_BUILD_TESTING provided as well
|
||||
if((CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME OR MODERN_CMAKE_BUILD_TESTING)
|
||||
AND BUILD_TESTING)
|
||||
add_subdirectory(tests)
|
||||
endif()
|
Reference in New Issue
Block a user