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.\ ")
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
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.
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.