Giovanni's Diary > Subjects > Programming > Gists >

C / CMakeLists.txt

Modern Cmake template for C++ projects.

# ====================================================================
# Project:   myproject
# Author:    Giovanni Santini
# Mail:      giovanni.santini@proton.me
# Github:    @San7o
# License:   MIT
# ====================================================================

cmake_minimum_required(VERSION 3.16)

project(myproject
  VERSION 1.0
  DESCRIPTION "C++ project with Cmake"
  LANGUAGES CXX
)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)  # no gnu extensions

find_program(CCACHE_PROGRAM ccache) # use ccache if available
if(CCACHE_PROGRAM)
  message(STATUS "Using ccache: ${CCACHE_PROGRAM}")
  set(CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
endif()

if(MSVC)
  set(WARNING_FLAGS /W4 /permissive-)
  set(DEBUG_FLAGS /Zi /Od)
  set(RELEASE_FLAGS /O2)
  set(DEBUG_DEFINES _DEBUG)
else()
  set(WARNING_FLAGS -Wall -Wextra -Wpedantic)
  set(DEBUG_FLAGS -O0 -ggdb -fsanitize=address)
  set(RELEASE_FLAGS -O3)
  set(DEBUG_DEFINES DEBUG)
  set(DEBUG_LINK_FLAGS -fsanitize=address)
endif()

#
# Options
#

#option(BUILD_SHARED_LIBS "Build libraries as shared" ON)
option(ENABLE_TESTING "Enable unit tests" ON)

if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type (Debug, Release)" FORCE)
endif()
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")

#
# Dependencies
#

# add_subdirectory(external/SFML)

#
# Sources and headers
#

set(SOURCES src/main.cpp)
#set(HEADERS include/myproject.hpp)

#
# Targets
#

add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS})
target_include_directories(${PROJECT_NAME}
  PRIVATE ${PROJECT_SOURCE_DIR}/include)

if(CMAKE_BUILD_TYPE STREQUAL "Debug")
  message(STATUS "Configuring Debug build options...")

  target_compile_definitions(${PROJECT_NAME} PRIVATE ${DEBUG_DEFINES})
  target_compile_options(${PROJECT_NAME}
    PRIVATE ${DEBUG_FLAGS} ${WARNING_FLAGS})
  if(NOT MSVC)
    target_link_options(${PROJECT_NAME} PRIVATE ${DEBUG_LINK_FLAGS})
  endif()
elseif(CMAKE_BUILD_TYPE STREQUAL "Release")
  message(STATUS "Configuring Release build options...")
  target_compile_options(${PROJECT_NAME}
    PRIVATE ${RELEASE_FLAGS} ${WARNING_FLAGS})
endif()

#
# Installation
#

install(TARGETS ${PROJECT_NAME}
  RUNTIME DESTINATION bin
)
install(DIRECTORY include/ DESTINATION include)

#
# Testing
#

if(ENABLE_TESTING)
  message(WARNING "Tests not present")

  #include(CTest)
  #enable_testing()

  #add_executable(tests test/test_main.cpp)
  #target_link_libraries(tests PRIVATE ${PROJECT_NAME})

  #add_test(NAME MyTests COMMAND tests)
endif()

#
# Packaging support
#

include(CMakePackageConfigHelpers)

write_basic_package_version_file(
  "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
  VERSION ${PROJECT_VERSION}
  COMPATIBILITY AnyNewerVersion
)

#
# End of CMakeLists.txt
# ====================================================================

Travel: Gists, Index