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/SUMMARY.md | 1 + src/development/README.md | 1 + src/development/cmake.md | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 src/development/cmake.md (limited to 'src') diff --git a/src/SUMMARY.md b/src/SUMMARY.md index b6da0b7..a17f1ca 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -45,6 +45,7 @@ - [c++](./development/c++.md) - [glibc](./development/glibc.md) - [gcc](./development/gcc.md) + - [cmake](./development/cmake.md) - [make](./development/make.md) - [ld.so](./development/ld.so.md) - [symbol versioning](./development/symbolver.md) diff --git a/src/development/README.md b/src/development/README.md index 117ef17..af18a02 100644 --- a/src/development/README.md +++ b/src/development/README.md @@ -4,6 +4,7 @@ - [c++](./c++.md) - [glibc](./glibc.md) - [gcc](./gcc.md) +- [cmake](./cmake.md) - [make](./make.md) - [ld.so](./ld.so.md) - [symbol versioning](./symbolver.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