Comment définir la variable globale dans une fonction pour cmake?
Je suis en train d'écrire un CMakeLists.txt pour générer des fichiers et de compiler les fichiers générés. J'ai créer une fonction pour ajouter un peu de chemin du fichier de chaînes de caractères à une variable de liste globale.
Mon CMakeLists.txt:
set(source_list "nothing")
function(test file_path)
list(APPEND source_list ${file_path})
endfunction(test)
test(abc.txt)
test(def.txt)
message("At last, the source_list is:\"${source_list}\"")
Le cmake sortie:
At last, the source_list is:"nothing"
Quelqu'un a suggéré qu'à l'utilisation de la macro au lieu de la fonction, mais j'ai besoin d'utiliser une variable locale, donc j'ai besoin d'utiliser la fonction au lieu de macro.
Comment puis-je régler correctement la variable globale source_list dans la fonction test()? Ne peut pas cmake le faire dans un simple et normale?
OriginalL'auteur sean | 2012-04-05
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser
set
au lieu delist
affecter la variable dans la portée parent.Remplacez donc votre
list
de commande avec:Pourquoi incorporer deux réponses dans le seul? Vous semble mal comprendre la Question/Réponse modèle sur un Débordement de Pile. Nous n'avons PAS tendance à avoir toutes les solutions un seul a accepté de répondre à. Au lieu de cela, avoir une réponse par la solution est parfait. Et une réponse de qualité est principalement mesurée par le vote, de bonne réponse n'a pas besoin d'être marqué avec le vert accepter la marque. S'il vous plaît, revenir ce qui répond à la fusion.
OriginalL'auteur Fraser
PARENT_SCOPE est seulement pour les parents, il ne fonctionnera pas si vous avez d'autres non script parent qui veulent le voir ainsi.
Vous avez besoin de cache pour le vrai "global" comme de la variable. Dans votre cas, utilisez:
INTERNAL
impliciteFORCE
, ce qui signifie: Utiliser leFORCE
possibilité d'écraser les données existantes.OriginalL'auteur Ding-Yi Chen
Une autre approche consiste à utiliser les propriétés à l'échelle mondiale. Une fois que vous avez mis:
on peut lire de partout:
J'ai utilisé dans les exemples ci-dessus les différents noms de la propriété (
source_list_property
) et variable (source_list
). Peut-être qu'il est préférable d'utiliser le même nom. Mais le point est d'utiliser une propriété en tant que variables globales, et non pas sur l'attribution de noms.Mondiales telles propriétés ne sont pas dans le cache.
OriginalL'auteur Maxim Suslov
Bâtiment sur Maxim Suslov, en réponse, le code suivant a travaillé pour un problème similaire, j'ai fait face:
Fonction add_source peut être appelée à partir de l'intérieur de n'importe quel sous-répertoire.
OriginalL'auteur Marios V