Как разделить строки на несколько строк в 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 ...) или как)?

745   4  

4 ответов:

обновление С 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.\
")

свободные номера в-х вариантах:

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

    Ничего не найдено.