J'ai généralement une politique dans mon projet, de ne jamais créer de lignes dans les fichiers texte qui dépassent une longueur de ligne de 80, donc ils sont facilement modifiables dans toutes sortes d'éditeurs (vous connaissez l'affaire). Mais avec CMake, j'ai le problème que je ne sais pas comment diviser une simple chaîne en plusieurs lignes pour éviter une ligne énorme. Considérez ce code de base:
set(MYPROJ_VERSION_MAJOR "1")
set(MYPROJ_VERSION_MINOR "0")
set(MYPROJ_VERSION_PATCH "0")
set(MYPROJ_VERSION_EXTRA "rc1")
set(MYPROJ_VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-${VERSION_EXTRA}")
Il dépasse déjà la limite de 80 lignes. Alors, comment diviser une ligne dans CMake en plusieurs lignes sans devenir verbeux (multiple list(APPEND ...)
ou similaire)?
CMake 3.0 et plus récent
Utilisez la
string(CONCAT)
commande:Bien que CMake 3.0 et les versions ultérieures prennent en charge la continuation des arguments entre guillemets , vous ne pouvez pas mettre en retrait la deuxième ou les lignes suivantes sans obtenir l'espace blanc d'indentation inclus dans votre chaîne.
CMake 2.8 et versions antérieures
Vous pouvez utiliser une liste. Chaque élément de la liste peut être mis sur une nouvelle ligne:
Une liste utilisée sans guillemets est concaténée sans espace blanc:
Si vous avez vraiment besoin d'une chaîne, vous pouvez d'abord convertir la liste en chaîne:
Tous les points-virgules dans vos chaînes d'origine seront considérés comme des séparateurs d'éléments de liste et supprimés. Ils doivent être échappés:
la source
C'est encore un peu verbeux, mais si la limite de 80 caractères vous bogue vraiment, vous pouvez ajouter à plusieurs reprises la même variable:
Donne sortie:
la source
Il n'existe aucun moyen de diviser un littéral de chaîne sur plusieurs lignes dans les fichiers CMakeLists.txt ou dans les scripts CMake. Si vous incluez une nouvelle ligne dans une chaîne, il y aura une nouvelle ligne littérale dans la chaîne elle-même.
Cependant, CMake utilise des espaces pour séparer les arguments, vous pouvez donc changer un espace qui est un séparateur d'arguments en une nouvelle ligne où vous le souhaitez, sans changer le comportement.
Vous pouvez reformuler cette ligne plus longue:
comme ces deux lignes plus courtes:
Ils sont tout à fait équivalents.
la source
L'exemple de la question d'origine ne concerne qu'une chaîne relativement courte. Pour les chaînes plus longues (y compris les exemples donnés dans d'autres réponses), un argument entre crochets pourrait être préférable. De la documentation:
la source
\n
art. Si vous ne le souhaitez pas, je ne pense pas que les arguments entre parenthèses soient votre solution.Pour ceux qui ont été amenés ici de Comment diviser une expression de générateur CMake en plusieurs lignes? Je voudrais ajouter quelques notes.
La méthode de continuation de ligne ne fonctionnera pas, CMake ne peut pas analyser une liste de générateurs faite avec des espaces (indentation) et une continuation de ligne.
Alors que la solution de chaîne (CONCAT) fournira une expression de générateur qui peut être évaluée, l'expression évaluée sera entourée de guillemets si le résultat contient un espace.
Pour chaque option individuelle à ajouter, une liste de générateurs distincte doit être construite, donc les options d'empilement comme je l'ai fait dans ce qui suit entraînera l'échec de la construction:
C'est parce que les options résultantes sont passées au compilateur entre guillemets
Pour évaluer de longues expressions de générateur représentées à l'aide de la solution de chaîne (CONCAT), chaque expression de générateur doit s'évaluer en une seule option sans espaces:
Cela n'a peut-être aucun rapport avec la question à laquelle je poste une réponse, malheureusement, la question à laquelle je réponds est à tort marquée comme un double de cette question.
Les listes de générateurs ne sont pas gérées et analysées de la même manière que les chaînes, et pour cette raison, il existe des mesures supplémentaires à prendre pour diviser une liste de générateurs sur plusieurs lignes.
la source
Pour maintenir une bonne indentation dans votre code, il suffit de faire
Ou formez une chaîne directement avec
comme dans la réponse de Douglas qui a plus de détails. Cependant, j'ai pensé que cela pourrait simplement résumer le point essentiel.
la source