CMake does first parse the CMakeLists.txt files in your project – named “Configuration Phase” – and then it generates your build environment – named “Generation Phase”.
So basically the generator expressions are for everything only the generator could know:
- The name and path of target outputs (mainly when cross-compiling and in multi-configuration environments)
- Or more generally any target property that the generator evaluates to mingle together the compiler/linker calls
Here are examples where I use generator expressions in my project:
-
Copying files next to the executable (in multi-configuration environments you can’t just use variables like
CMAKE_CURRENT_BINARY_DIR)add_custom_command( TARGET library1 POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy "$<TARGET_FILE:library1>" "$<TARGET_FILE_DIR:mainProject>/$<TARGET_FILE_NAME:library1>" )CMake post-build-event: copy compiled libraries
add_custom_command( TARGET myBinary POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/myTest.txt" "$<TARGET_FILE_DIR:myBinary>/myTest.txt" )how do I add external test files to a cmake project
-
Differentiate e.g.
DEBUGorRELEASEconfigurationsadd_compile_options("$<$<CONFIG:DEBUG>:/MDd>")For Cmake, can you modify the release/debug compiler flags with `add_compiler_flags()` command?
Modern way to set compiler flags in cross-platform cmake project
-
With the
TARGET_PROPERTYgenerator expression you could do a lot of things e.g.file(GENERATE OUTPUT "includes.txt" CONTENT "$<TARGET_PROPERTY:motor,INCLUDE_DIRECTORIES>\n" )CMake doesn’t pick up INTERFACE_INCLUDE_DIRECTORIES of linked library