Skip to content

Cmake

CMake is the most popular build system generator for C++. It generates platform-specific build files from simple configuration files.

MyProject/
├── CMakeLists.txt
├── main.cpp
└── include/
└── utils.h
cmake_minimum_required(VERSION 3.10)
project(MyProject)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_executable(myapp main.cpp)
Terminal window
mkdir build
cd build
cmake ..
make
./myapp
# Set variable
set(MY_VAR "value")
# Use variable
${MY_VAR}
# List
set(SOURCES main.cpp util.cpp helper.cpp)
# Cache variables
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
cmake_minimum_required(VERSION 3.10)
project(MyProject)
set(CMAKE_CXX_STANDARD 17)
# Collect all .cpp files automatically
file(GLOB SOURCES "src/*.cpp")
add_executable(myapp ${SOURCES})
include_directories(${CMAKE_SOURCE_DIR}/include)
add_executable(myapp
main.cpp
src/util.cpp
src/helper.cpp
)
add_executable(myapp main.cpp)
target_include_directories(myapp PRIVATE ${CMAKE_SOURCE_DIR}/include)
target_compile_features(myapp PRIVATE cxx_std_17)
# Static library
add_library(mylib STATIC src/lib.cpp)
# Shared library
add_library(myshared SHARED src/lib.cpp)
# Link library
add_executable(myapp main.cpp)
target_link_libraries(myapp mylib)
# Find a package
find_package(Threads REQUIRED)
# Use package
add_executable(myapp main.cpp)
target_link_libraries(myapp Threads::Threads)
# Boost
find_package(Boost REQUIRED)
target_link_libraries(myapp Boost::filesystem)
# OpenSSL
find_package(OpenSSL REQUIRED)
target_link_libraries(myapp OpenSSL::SSL OpenSSL::Crypto)
# Threads
find_package(Threads REQUIRED)
target_link_libraries(myapp Threads::Threads)
option(ENABLE_TESTS "Enable unit tests" ON)
option(USE_OPENGL "Use OpenGL rendering" OFF)
if(ENABLE_TESTS)
enable_testing()
add_subdirectory(tests)
endif()
cmake_minimum_required(VERSION 3.16)
project(MyApp VERSION 1.0.0)
# C++ Standard
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Output directories
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
# Find packages
find_package(Threads REQUIRED)
# Source files
file(GLOB SOURCES
${CMAKE_SOURCE_DIR}/src/*.cpp
)
# Create executable
add_executable(myapp ${SOURCES})
# Include directories
target_include_directories(myapp
PRIVATE ${CMAKE_SOURCE_DIR}/include
)
# Link libraries
target_link_libraries(myapp
Threads::Threads
)
# Install rules
install(TARGETS myapp
RUNTIME DESTINATION bin
)
  1. Use modern CMake (3.10+)
  2. Prefer target_ commands over global commands*
  3. Use VERSION in project()
  4. Set C++ standard explicitly
  5. Use out-of-source builds
  • CMake generates build files from CMakeLists.txt
  • Use target_* commands for better organization
  • find_package locates external libraries
  • Always use out-of-source builds

Now let’s learn about testing in C++.

Next Chapter: 11_testing/52_unit_testing.md - Unit Testing with Google Test