Cmake generator expressions

2020-02-08 01:48发布

问题:

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:

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:

  1. 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

  2. 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

  3. 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



标签: c++ cmake