Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cmake generator expressions

Tags:

c++

cmake

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

like image 708
Mauri Avatar asked Sep 13 '17 20:09

Mauri


People also ask

What are CMake generator expressions?

Generator expressions are evaluated during build system generation to produce information specific to each build configuration. Generator expressions are allowed in the context of many target properties, such as LINK_LIBRARIES , INCLUDE_DIRECTORIES , COMPILE_DEFINITIONS and others.

What are generator expressions in Python?

A generator expression is an expression that returns a generator object. Basically, a generator function is a function that contains a yield statement and returns a generator object. The squares generator function returns a generator object that produces square numbers of integers from 0 to length - 1 .


1 Answers

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

like image 151
Florian Avatar answered Oct 25 '22 23:10

Florian