1
0
mirror of synced 2024-12-22 12:40:00 +01:00
2024-11-07 14:42:03 +00:00

1.9 KiB

Works with 3.15 and tested through 3.31

cmake_minimum_required(VERSION 3.15...3.31)

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

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()