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 # ====================================================================