Comment puis-je passer correctement CMake liste (point-virgule-sep), des drapeaux aux set_target_properties?
CMake listes sont essentiellement juste un point-virgule séparées par des chaînes, mais si vous passez une telle variable à une commande, il ne se étend sur plusieurs arguments - par exemple,
set(FLAGS f1 f2 f3)
# now FLAGS == 'f1;f2;f3'
add_custom_command(
...
COMMAND my_cmd ${FLAGS}
...
)
correctement appel my_cmd f1 f2 f3
.
Maintenant si je fais cela avec
set_target_properties(
myTarget PROPERTIES
LINK_FLAGS "${LD_FLAGS}"
)
l'expansion ne se produit pas, et je me retrouve avec un seul LD_FLAG qui contient des points-virgules -- inutile, au lieu de s'élargir en une chaîne séparée par des espaces.
Est-il possible de faire en sorte que quand j'ai passer d'une liste à l'LINK_FLAGS propriété (ou la propriété), il obtient étend sur plusieurs arguments, plutôt qu'un seul?
Grâce,
Dan
Vous devez vous connecter pour publier un commentaire.
Je ne pense pas que
set_target_properties
peut faire l'expansion automatiquement, mais vous pouvez utiliserstring (REPLACE ...)
pour développer une liste dans une chaîne séparée par des espaces:set_target_properties
commande?string (REPLACE ";" " " DEST ${SRC})
remplace le point-virgule avec... une chaîne vide. Seulement cela fonctionne:foreach(OPT ${LD_FLAGS}) set(LINK_FLAGS "${LINK_FLAGS} ${OPT}") endforeach()
. Il serait vraiment drôle, à moins que cette c+++p n'était pas le plus populaire outil de construction d'aujourd'hui.${SRC}
contenues;
à l'intérieur et dans cette forme, il a essaimé à l'intérieur de l'appel (si le remplacement n'a même pas la chance de travailler). Au moins, il vaut la peine de rappeler que cmake répète la même erreur stupide que bash et perl faire.Pour l'utilisation de cmake Liste comme liste, utilisez
Pour l'utilisation de cmake liste de chaîne, (c'est à dire les éléments de la liste sont séparés par des ';'), utilisez
Donc dans votre cas, il suffit de retirer "" devrait être suffisant.
set_target_properties called with incorrect number of arguments.
LINK_FLAGS_*
variables. L'idée ici est d'essayer d'éviter d'utiliser lelist as string
à tous. Au lieu de faire utiliser quelque chose commeset(PROP_LIST "${PROP_LIST} ...")
etset_target_properties(... LINK_FLAGS_* "${PROP_LIST}")
. La tenter d'utiliserPROP_LIST
que la liste va ruiner laset_target_properties
.La
set_property
de commande est conçu pour cehttp://www.cmake.org/cmake/help/v3.0/command/set_property.html
set_target_properties(foo ...)
àset_properties(TARGET foo ...)
. Mais maintenant je vois qu'il y a une différence dans la pluralisation des noms de commande (vs pluriel au singulier). Le nom correct estset_property
(se termine eny
).foo;bar
. Il est malheureux. C'est aussi intéressant qu'il y a maintenant unCOMPILE_OPTIONS
la propriété, qui est une liste, mais le vieuxCOMPILE_FLAGS
est une simple chaîne de caractères.Je l'utilise comme des chaînes de
set(FLAGS " f1 f2 f3")
Notez l'espace à l'avant, il vous permet de concaténer les autres jeux de drapeaux.
Pour les projets plus complexes, au lieu de si-elses vous pouvez également faire un double expansion astuce:
Dans cmake 3.x il existe quelques approches
Haut niveau CMakeLists.txt le fichier ressemble à ceci:
avec le sous-répertoire de fichiers structurés quelque chose comme ceci:
Renforcée source de manipulation de fichier avec target_sources()