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
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
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:
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. DEBUG
or RELEASE
configurations
add_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_PROPERTY
generator expression you could do a lot of things e.g.
file(GENERATE
OUTPUT "includes.txt"
CONTENT "$<TARGET_PROPERTY:motor,INCLUDE_DIRECTORIES>
"
)
CMake doesn't pick up INTERFACE_INCLUDE_DIRECTORIES of linked library