Contents
Generator expressions are evaluated during build system generation to produce information specific to each build configuration.
Generator expressions are allowed in the context of many target properties, such as LINK_LIBRARIES, INCLUDE_DIRECTORIES, COMPILE_DEFINITIONS and others. They may also be used when using commands to populate those properties, such as target_link_libraries(), target_include_directories(), target_compile_definitions() and others.
This means that they enable conditional linking, conditional definitions used when compiling, and conditional include directories and more. The conditions may be based on the build configuration, target properties, platform information or any other queryable information.
Logical expressions are used to create conditional output. The basic expressions are the 0 and 1 expressions. Because other logical expressions evaluate to either 0 or 1, they can be composed to create conditional output:
$<$<CONFIG:Debug>:DEBUG_MODE>
expands to DEBUG_MODE when the Debug configuration is used, and otherwise expands to nothing.
1 if all ? are 1, else 0
The ? must always be either 0 or 1 in boolean expressions.
These expressions expand to some information. The information may be used directly, eg:
include_directories(/usr/include/$<CXX_COMPILER_ID>/)
expands to /usr/include/GNU/ or /usr/include/Clang/ etc, depending on the Id of the compiler.
These expressions may also may be combined with logical expressions:
$<$<VERSION_LESS:$<CXX_COMPILER_VERSION>,4.2.0>:OLD_COMPILER>
expands to OLD_COMPILER if the CMAKE_CXX_COMPILER_VERSION is less than 4.2.0.
Value of the property prop on the target tgt.
Note that tgt is not added as a dependency of the target this expression is evaluated on.
These expressions generate output, in some cases depending on an input. These expressions may be combined with other expressions for information or logical comparison:
-I$<JOIN:$<TARGET_PROPERTY:INCLUDE_DIRECTORIES>, -I>
generates a string of the entries in the INCLUDE_DIRECTORIES target property with each entry preceeded by -I. Note that a more-complete use in this situation would require first checking if the INCLUDE_DIRECTORIES property is non-empty:
$<$<BOOL:$<TARGET_PROPERTY:INCLUDE_DIRECTORIES>>:-I$<JOIN:$<TARGET_PROPERTY:INCLUDE_DIRECTORIES>, -I>>