Cmake generator expressions

前端 未结 1 1799
礼貌的吻别
礼貌的吻别 2020-12-13 04:37

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

相关标签:
1条回答
  • 2020-12-13 05:25

    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

    0 讨论(0)
提交回复
热议问题