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)
Leave a Reply