I\'m trying for long time to understand the benefit of generator expressions such as $
in CMake, when and how to use them.
Can anybody explain i
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"
)
how do I add external test files to a cmake project
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>\n"
)
CMake doesn't pick up INTERFACE_INCLUDE_DIRECTORIES of linked library