En boucle sur une liste de chaînes
Je voudrais faire une boucle sur la liste des articles, donné dans une chaîne de caractères. Tel que requis par CMake, les éléments sont séparés par des points-virgules. La suite
cmake_minimum_required(VERSION 2.8)
FOREACH(LETTER "a;b;c")
MESSAGE("<<${LETTER}>>")
ENDFOREACH()
interpretes la chaîne "a;b;c"
comme un littéral de chaîne. En revanche, lorsque l'attribution "a;b;c"
à une variable d'abord, tout fonctionne comme prévu.
cmake_minimum_required(VERSION 2.8)
SET(MYLIST "a;b;c")
FOREACH(LETTER ${MYLIST})
MESSAGE("<<${LETTER}>>")
ENDFOREACH()
Est-ce la méthode recommandée pour boucler sur une liste ou est-il une solution plus élégante?
source d'informationauteur Nico Schlömer
Vous devez vous connecter pour publier un commentaire.
La source de votre confusion est probablement CMake est propre interprétation de chaînes entre guillemets.
Par exemple, à la suite de toutes les itérer sur la liste des chaînes correctement:
Le seul cas où cela ne fonctionne pas est
La raison pour laquelle
(1)
et(2)
travail est trouvé dans CMake langue du manuel pour les sociétés non cotées arguments:Notez que ceci est différent de la cité des argumentsqui a également évaluer des Séquences d'Échappement et les Références à des Variables, mais ne faites pas l'extension de la liste. C'est ce qui explique pourquoi
(4)
échoue.L'intéressante question est maintenant de savoir pourquoi
(3)
réussit toujours.set
accepteront de valeur unique et de valeur de la liste des arguments. En fait, tout ce qui est avant la clôture)
ou l'un des mots-clésCACHE
ouPARENT_SCOPE
est considéré comme faisant partie de la valeur. En tant que tel, les deux commandes suivantes sont équivalentes:Dans les deux cas, la valeur de
MYLIST
seraa;b;c
(sans les guillemets).Lorsque nous maintenant d'élargir
${MYLIST}
dans une autre commande, vous pouvez penser à elle en effectuant une simple chaîne de caractères de remplacement avec la valeur deMYLIST
qui esta;b;c
. La commande qui en résulte seront ensuite complété par le règlement de la cotées ou non cotées arguments. Qui est le suivant:bien que ce ne sera pas: