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
Répondre
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:
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" )
Différencier par exemple
DEBUG
ouRELEASE
configurationsadd_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
Avec l'expression du générateur
TARGET_PROPERTY
, vous pouvez faire beaucoup de choses par exemplefile(GENERATE OUTPUT "includes.txt" CONTENT "$<TARGET_PROPERTY:motor,INCLUDE_DIRECTORIES>\n" )
CMake doesn't pick up INTERFACE_INCLUDE_DIRECTORIES of linked library
'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
@Tsyvarev J'ai ajouté la documentation de la partie, que je n'ai pas comprise –
'$ ' 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