Как разделить строки на несколько строк в CMake?
у меня обычно есть политика в моем проекте, чтобы никогда не создавать строки в текстовых файлах, которые превышают длину строки 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 ответов:
обновление С CMake 3.0 и новее:
продолжение линии можно с помощью
\. смотрите cmake-3.0-docmessage("\ 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 доступно через доморощенного, Macports и Финк
Windows: cmake-3 доступно через шоколадный
С 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")
Это все еще немного многословно, но если предел 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
нет способа разделить строковый литерал на несколько строк в 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}")Они полностью эквивалентны.
Comments