Targets, Properties, And More¶
Target Types¶
Two basic types:
ADD_EXECUTABLE()
andADD_LIBRARY()
ADD_EXECUTABLE()
is not relevant …Only entry point into dependency graph
⟶ does not propagate anything to dependers
There are no dependers
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 |
Properties: PRIVATE
, PUBLIC
, INTERFACE
?¶
PUBLIC
propagated to dependersDependency through
#include <other.h>
in a header file ⟶ all includers need to knowblacklist
availability in approach 2 (but only ifblacklist
has compiled code)PUBLIC
only possible when target has compiled code
PRIVATE
does not propagateFor 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 to dependersJust like
PUBLIC
- except thatPUBLIC
is not possible onINTERFACE
targets (e.g. header-only libraries)Asymmetric; smells like it does in many corners of CMake
Documentation has no clear explanation. Exceptions, and paragraph-long explanations.