105 votes

CMake: Comment diviser des chaînes sur plusieurs lignes?

J'ai l'habitude d'avoir une stratégie en mon projet, afin de ne jamais créer des lignes dans le texte des fichiers qui dépassent une longueur de ligne de 80, de sorte qu'ils sont facilement modifiables dans toutes sortes d'éditeurs (vous savez le deal). Mais avec CMake-je obtenir le problème que je ne sais pas comment diviser une simple chaîne de caractères sur plusieurs lignes afin d'éviter une énorme ligne. La base de code:

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}")

Déjà exeeds la 80 de la ligne de limite. Alors, comment puis-je rompre une ligne dans CMake en plusieurs lignes sans arriver à verbose (plusieurs list(APPEND ...) ou autre)?

59voto

Douglas Royds Points 61

Vous pouvez utiliser une liste. Chaque élément de la liste peut être placé sur une nouvelle ligne:

 set(MYPROJ_VERSION_MAJOR "1")
set(MYPROJ_VERSION_MINOR "0")
set(MYPROJ_VERSION_PATCH "0")
set(MYPROJ_VERSION_EXTRA "rc1")
set(MYPROJ_VERSION_LIST "${MYPROJ_VERSION_MAJOR}"
                        ".${MYPROJ_VERSION_MINOR}"
                        ".${MYPROJ_VERSION_PATCH}"
                        "-${MYPROJ_VERSION_EXTRA}")
 

Une liste utilisée sans guillemets est concaténée sans espaces:

 message(STATUS "Version: " ${MYPROJ_VERSION_LIST})
-- Version: 1.0.0-rc1
 

Si vous avez vraiment besoin d'une chaîne, vous pouvez d'abord convertir la liste en chaîne:

 string(REPLACE ";" "" MYPROJ_VERSION ${MYPROJ_VERSION_LIST})
message(STATUS "Version: ${MYPROJ_VERSION}")
-- Version: 1.0.0-rc1
 

9voto

Rian Sanderson Points 1019

C'est toujours un peu bavard, mais si la limite de 80 caractères est vraiment anormale, vous pouvez ajouter à plusieurs reprises à la même variable:

 set(MYPROJ_VERSION_MAJOR "1")
set(MYPROJ_VERSION_MINOR "0")
set(MYPROJ_VERSION_PATCH "0")
set(MYPROJ_VERSION_EXTRA "rc1")
set(MYPROJ_VERSION "${MYPROJ_VERSION_MAJOR}.")
set(MYPROJ_VERSION "${MYPROJ_VERSION}${MYPROJ_VERSION_MINOR}.")
set(MYPROJ_VERSION "${MYPROJ_VERSION}${MYPROJ_VERSION_PATCH}-")
set(MYPROJ_VERSION "${MYPROJ_VERSION}${MYPROJ_VERSION_EXTRA}")
message(STATUS "version: ${MYPROJ_VERSION}")
 

Donne la sortie:

 $ cmake  ~/project/tmp
-- version: 1.0.0-rc1
-- Configuring done
-- Generating done
-- Build files have been written to: /home/rsanderson/build/temp
 

7voto

DLRdave Points 4757

Il n'y a aucun moyen de diviser un littéral de chaîne sur plusieurs lignes CMakeLists.txt fichiers ou CMake scripts. Si vous incluez un retour à la ligne dans une chaîne, il y aura un littéral de saut de ligne dans la chaîne elle-même.

# Don't do this, it won't work, MYPROJ_VERSION will contain newline characters:
set(MYPROJ_VERSION "${VERSION_MAJOR}.
  ${VERSION_MINOR}.${VERSION_PATCH}-
  ${VERSION_EXTRA}")

Cependant, CMake utilise des espaces pour séparer les arguments, de sorte que vous pouvez modifier un espace, c'est un argument séparateur dans un retour à la ligne où vous voulez, sans changer le comportement.

Vous pourriez reformuler plus de cette ligne:

set(MYPROJ_VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-${VERSION_EXTRA}")

comme ces deux lignes plus courtes:

set(MYPROJ_VERSION
  "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}-${VERSION_EXTRA}")

Ils sont tout à fait équivalent.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X