CMake Cheat sheet

CMake can be frustrating sometimes. Here’s some important commands and snippets that might prove to be useful.

Basic minimal CMakeLists.txt

template to use on a new project

cmake_minimum_required(VERSION 3.25)


project(project_name C)

set(CMAKE_C_STANDARD 11)


add_executable(executable_name
    source1.c
    source2.c
    )
target_include_directories(executable_name 
    PRIVATE dir1
    PRIVATE dir2
    )

Compile and link an external library during build

Useful when you want to build against a static library inside a subdirectory

include(ExternalProject)


set(<library_name>_PREFIX ${CMAKE_BINARY_DIR}/<library_name>)
set(<library_name>_SOURCE_DIR ${CMAKE_SOURCE_DIR}/<library_name>)
set(<library_name>_BINARY_DIR ${<library_name>_PREFIX}/build)
set(<library_name>_INCLUDE_DIR ${<library_name>_PREFIX}/include)
set(<library_name>_STATIC_LIB ${<library_name>_PREFIX}/lib/lib<library_name>.a)
file(MAKE_DIRECTORY ${<library_name>_INCLUDE_DIR})

ExternalProject_Add(lib<library_name>
        PREFIX ${<library_name>_PREFIX}
        SOURCE_DIR ${<library_name>_SOURCE_DIR}
        BINARY_DIR ${<library_name>_BINARY_DIR}
        CMAKE_ARGS -DBUILD_SHARED_LIBS:BOOL=OFF
        CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${<library_name>_PREFIX}
        BUILD_BYPRODUCTS ${<library_name>_STATIC_LIB}
        )

add_library(<library_name> STATIC IMPORTED GLOBAL)
add_dependencies(<library_name> lib<library_name>)
set_target_properties(<library_name> PROPERTIES IMPORTED_LOCATION ${<library_name>_STATIC_LIB})
set_target_properties(<library_name> PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${<library_name>_INCLUDE_DIR})


target_link_libraries(<target_name> <library_name>)

Additional references

CMake cheatsheet (for CMake 3.20 – pdf file) (source)

Official CMake reference


Posted

in

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *