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

J’ai généralement une politique dans mon projet, pour ne jamais créer de lignes dans des fichiers texte dépassant une longueur de ligne de 80, elles sont donc facilement modifiables dans tous les types d’éditeurs (vous connaissez l’affaire). Mais avec CMake, le problème est que je ne sais pas comment diviser une simple chaîne en plusieurs lignes pour éviter une énorme ligne. Considérons 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 puis-je diviser une ligne dans CMake en plusieurs lignes sans obtenir de list(APPEND ...) multiple list(APPEND ...) ou similaire)?

Mise à jour pour CMake 3.0 et versions ultérieures :

la suite de ligne est possible avec \ . voir cmake-3.0-doc

 message("\ This is the first line of a quoted argument. \ In fact it is the only line but since it is long \ the source code uses line continuation.\ ") 

Disponibilité des versions de CMake:

Debian Wheezy (2013): 2.8.9
Debian Wheezy-backports: 2.8.11
Debian Jessy (2015): 3.0.2
Ubuntu 14.04 (LTS): 2.8.12
Ubuntu 15.04: 3.0.2
Mac OSX: cmake-3 disponible via Homebrew , Macports et Fink
Windows: cmake-3 disponible via Chocolatey

CMake 3.0 et plus récent

Utilisez la commande ssortingng(CONCAT) :

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

Bien que CMake 3.0 et les versions plus récentes de la ligne de support des arguments cités , vous ne pouvez pas indenter la deuxième ligne ou les lignes suivantes sans obtenir les espaces blancs de l’indentation dans votre chaîne.

CMake 2.8 et plus

Vous pouvez utiliser une liste. Chaque élément de la liste peut être mis 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 espace blanc:

 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 une chaîne:

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

Tout point-virgule dans vos chaînes d’origine sera vu comme séparateur d’éléments de liste et supprimé. Ils doivent s’échapper:

 set(MY_LIST "Hello World " "with a \;semicolon") 

C’est encore un peu verbeux, mais si la limite de 80 caractères vous bogue vraiment, alors vous pourriez append à plusieurs resockets à 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 

Il n’y a aucun moyen de fractionner 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.

 # 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, vous pouvez donc changer un espace qui est un séparateur d’arguments en une nouvelle ligne où vous voulez, sans modifier le comportement.

Vous pourriez reformuler cette ligne plus longue:

 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 entièrement équivalents.