Targets, Properties, And More#
Target Types#
Two basic types:
add_executable()andadd_library()add_executable()is simpleNo other node depends on it
Rather, executables only depend on other nodes
⟶ Entry points into dependency graph
As such, executables rarely have properties attached to them
add_library()…Type
Description
Normal library
STATIC(default),SHARED,MODULE. Has sources to be built.Object libraries
Technically much like normal libraries, but not an archive or shared object (only virtual, implemented by CMake)
Interface libraries
No sources; only there to propagate properties to dependers, and to have further dependencies on their own.
Properties#
(For a complete list see add_library())
Target function |
Property name |
Description |
Documentation |
|---|---|---|---|
|
|
Macros set on the compiler command line ( |
|
|
|
Non-macro compiler flags/options |
|
|
|
Include directories |
|
|
(Much more complicated, see documentation) |
Dependencies, in the widest sense |
|
|
Any property, including custom properties |
See documentation |
Properties: PRIVATE, PUBLIC, INTERFACE?#
PUBLIC: propagated to containing target itself, and to all dependers, transitivelyDependency through
#include <other.h>in a header file ⟶ all includers need to knowPUBLICproperties only possible when target has compiled code
PRIVATE: propagated to containing target itself, invisible to dependersFor example, one might structure a target’s source code into
src/,private-inc/, andpublic-inc/⟶private-inc/would betarget_include_directories(... PRIVATE ...)For example,
target_compile_definitions()for target-local compilation only
INTERFACE: propagated only to dependers, invisible to containing targetJust like
PUBLIC- except thatPUBLICis not possible onINTERFACEtargets (e.g. header-only libraries)Asymmetric (a smell that is encountered in many dark corners of CMake)
Documentation has no clear explanation. Exceptions, and paragraph-long explanations.
Demo Time#
Move on to Screenplay: Public And Private Include Directories