From f2b0515fdd1cb84bebe24cac59498b682b49de80 Mon Sep 17 00:00:00 2001 From: Johannes Stoelp Date: Sat, 4 Nov 2023 21:34:00 +0100 Subject: cmake: add note about PRIVATE/PUBLIC/INTERFACE --- src/development/cmake.md | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/development/cmake.md (limited to 'src/development/cmake.md') diff --git a/src/development/cmake.md b/src/development/cmake.md new file mode 100644 index 0000000..d0bbeea --- /dev/null +++ b/src/development/cmake.md @@ -0,0 +1,39 @@ +# cmake(1) + +## `PRIVATE` / `PUBLIC` / `INTERFACE` + +These modifier control where properties for a given target are visible. + +- `PRIVATE`: Only for the target itself. +- `PUBLIC`: For the target itself and anyone linking against it. +- `INTERFACE`: Only for anyone linking against the target. + +The following gives an example for preprocessor definitions specified on a +library target. This behaves in the same way for other properties like for +example include directories. +```cmake +# CMakeLists.txt + +cmake_minimum_required(VERSION 3.14) +project(moose) + +# -- LIBRARY +add_library(liba STATIC liba.cc) +target_compile_definitions(liba PUBLIC DEF_PUBLIC) +target_compile_definitions(liba PRIVATE DEF_PRIVATE) +target_compile_definitions(liba INTERFACE DEF_INTERFACE) + +# -- APPLICATION +add_executable(main main.cc) +target_link_libraries(main liba) +``` + +```sh +> touch liba.cc; echo "int main() {}" > main.cc +> cmake -B build -S . -G Ninja +> ninja -C build -j1 --verbose +[1/4] /usr/bin/c++ -DDEF_PRIVATE -DDEF_PUBLIC [..] .../liba.cc +[2/4] [..] +[3/4] /usr/bin/c++ -DDEF_INTERFACE -DDEF_PUBLIC [..] .../main.cc +[4/4] [..] +``` -- cgit v1.2.3