Как разбить строки на несколько строк в CMake? - PullRequest
75 голосов
/ 03 октября 2011

У меня обычно есть политика в моем проекте, чтобы никогда не создавать строки в текстовых файлах, длина строки которых превышает 80, поэтому их легко редактировать во всех типах редакторов (вы знаете сделку). Но с CMake у меня возникает проблема, заключающаяся в том, что я не знаю, как разбить простую строку на несколько строк, чтобы избежать одной огромной строки. Рассмотрим этот основной код:

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

Он уже превышает ограничение в 80 строк. Итак, как мне разбить строку в CMake на несколько строк, не доходя до многословия (несколько list(APPEND ...) или тому подобное)?

Ответы [ 4 ]

68 голосов
/ 16 января 2015

Обновление для CMake 3.0 и новее :

Возможно продолжение строки при \.см. 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.\
")

Наличие версий CMake:

Debian Wheezy (2013): 2,8,9
Backian Debian Wheezy: 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 доступен через Homebrew, Macports и Fink
Windows: cmake-3 доступен через Chocolatey

44 голосов
/ 23 мая 2013

CMake 3.0 и новее

Используйте команду string(CONCAT):

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

Хотя CMake 3.0 и новее поддерживают продолжение строки аргументов в кавычках , вы не можете сделать отступвторая или последующие строки без получения отступа, включенного в вашу строку.

CMake 2.8 и старше

Вы можете использовать список.Каждый элемент списка можно поместить в новую строку:

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

Список, используемый без кавычек, объединяется без пробелов:

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

Если вам действительно нужна строка,сначала вы можете преобразовать список в строку:

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

Любые точки с запятой в ваших исходных строках будут рассматриваться как разделители элементов списка и удаляться.Они должны быть спасены:

set(MY_LIST "Hello World "
            "with a \;semicolon")
8 голосов
/ 03 октября 2011

Это все еще немного многословно, но если предел в 80 символов действительно вас раздражает, вы можете многократно добавлять к одной и той же переменной:

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

Дает вывод:

$ cmake  ~/project/tmp
-- version: 1.0.0-rc1
-- Configuring done
-- Generating done
-- Build files have been written to: /home/rsanderson/build/temp
7 голосов
/ 05 октября 2011

Нет способа разбить строковый литерал на несколько строк в файлах CMakeLists.txt или в сценариях CMake. Если вы включите новую строку в строку, в самой строке будет буквальный символ новой строки.

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

Однако CMake использует пробел для разделения аргументов, поэтому вы можете изменить пробел, являющийся разделителем аргументов, на новую строку где угодно, без изменения поведения.

Вы можете перефразировать эту длинную строку:

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

как эти две короткие строки:

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

Они полностью эквивалентны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...