2017-09-13 1 views
4

J'essaye depuis longtemps de comprendre l'avantage de generator expressions tel que $<xxx:yy> dans CMake, quand et comment les utiliser. Quelqu'un peut-il l'expliquer clairement avec quelques exemples. Nombreux remerciements d'avanceCmake expressions de générateur

+0

'Quelqu'un peut-il expliquer clearly' - trop large. Est-ce que quelqu'un devrait répéter [documentation CMake] (https://cmake.org/cmake/help/v3.9/manual/cmake-generator-expressions.7.html)? Ou autre manuel? Sinon, expliquez ** exactement ** ce que vous ne comprenez pas, par ex. quelle expression, ou quel exemple. – Tsyvarev

+0

@Tsyvarev J'ai ajouté la documentation de la partie, que je n'ai pas comprise –

+1

'$ ' est près de la moitié de toute l'utilisation des expressions de générateur. Sa signification en bref: si l'expression du générateur 'xxx' est évaluée à TRUE (comme booléen), alors la valeur de l'expression du générateur' yy' est utilisée. Sinon, une chaîne vide est utilisée. L'utilité de ce type d'expression est la suivante: lorsque la valeur des expressions du générateur de gauche dépend de l'option de configuration et que le système de construction supporte la multiconfiguration (par exemple Visual Studio), cette expression ne peut pas être réécrite avec 'if'. cette étape. – Tsyvarev

Répondre

3

CMake analyse d'abord les fichiers CMakeLists.txt dans votre projet - nommé "Phase de configuration" - et génère ensuite votre environnement de construction - nommé "Phase de génération".

Donc, fondamentalement, les expressions du générateur sont pour tout que le générateur pouvait savoir:

  • Le nom et le chemin des sorties cibles (principalement lorsque les environnements de cross-compilation et en multi-configuration)
  • Ou plus généralement toute propriété cible que le générateur évalue à se mêler ensemble le compilateur appelle/éditeur de liens

Voici des exemples où j'utiliser des expressions du générateur dans mon projet:

  1. Copier des fichiers à côté de l'exécutable (dans des environnements multi-configuration vous ne pouvez pas utiliser des variables comme 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. Différencier par exemple DEBUG ou 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. Avec l'expression du générateur TARGET_PROPERTY, vous pouvez faire beaucoup de choses par exemple

    file(GENERATE 
        OUTPUT "includes.txt" 
        CONTENT "$<TARGET_PROPERTY:motor,INCLUDE_DIRECTORIES>\n" 
    ) 
    

    CMake doesn't pick up INTERFACE_INCLUDE_DIRECTORIES of linked library