I'm trying for long time to understand the benefit of generator expressions such as $<xxx:yy> in CMake, when and how to use them. Can anybody explain it clearly with some examples. Many thank in advance
1 Answer
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" )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
1 Comment
CMAKE_CURRENT_BINARY_DIR", why?
Can anybody explain it clearly- too broad. Should someone repeat CMake documentation? Or other manual? Otherwise, explain what exactly you don't understand, e.g. which expression, or which example.$<xxx:yy>is nearly a half of all usage of generator expressions. Its meaning in short: if generator expressionxxxis evaluated to TRUE (as boolean), then value of generator expressionyyis used. Otherwise, empty string is used. Usefullness of this kind of expression is: when value of the left generator expressions depends on configuration option, and build system supports multiconfiguration (e.g. Visual Studio), then such expression cannot be rewritten withif, as concrete configuration isn't known at this stage.