Как разделить выражение генератора CMake на несколько строк? [Дубликат]

По моему мнению, важно иметь еще один слой (ViewModel) поверх уровня модели для сложных приложений, выполняющих большую часть операций CRUD, поскольку имеет следующие преимущества:

  1. To установить свободную связь между моделью и контроллером. Так что любые изменения, связанные с DataModel, не будут влиять на контроллер.
  2. Если вы правильно реализовали слой ViewModel вашего приложения, предоставив максимальный уровень IOC (Inversion of Control) через DI (зависимость от инъекций с использованием Unity / других фреймворков) и т. д., это также поможет вам MOQ ваши модели ViewModels (зависимости) для тестирования только логики контроллера.
66
задан jww 16 September 2017 в 21:52
поделиться

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

Доступность версий 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 доступен через Homebrew , Macports и Fink Windows: cmake-3 доступен через Chocolatey

56
ответ дан Hotschke 17 August 2018 в 09:45
поделиться
  • 1
    Проблема с подходом CMake 3.0 заключается в том, что он не игнорирует отступ. Это означает, что многострочные строки не могут быть отступом с остальной частью кода. – void.pointer 18 January 2017 в 16:45
  • 2
    @ void.pointer Я столкнулся с той же проблемой, вы выяснили, как отступать с несколькими линиями? – user3667089 3 February 2017 в 01:09

Невозможно разбить строковый литерал на несколько строк в файлах 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 использует пробелы для разделения аргументов, поэтому вы можете изменить пространство, разделяющее аргумент, на (/ g1)

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

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

в качестве этих двух более коротких строк:

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

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

7
ответ дан DLRdave 17 August 2018 в 09:45
поделиться

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, вы можете сначала преобразовать список в строку:

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")
36
ответ дан Douglas Royds 17 August 2018 в 09:45
поделиться
  • 1
    Для очень длинных строк новая строка после имени переменной еще больше улучшает этот шаблон (в этом примере это необязательно). – sage 11 February 2017 в 18:10

Это все еще немного многословно, но если ограничение 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
ответ дан Rian Sanderson 17 August 2018 в 09:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: