У меня обычно есть политика в моем проекте: никогда не создавать строки в текстовых файлах, длина которых превышает 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 ...)
или тому подобное)?
CMake 3.0 и новее
Используйте
string(CONCAT)
команду:Хотя CMake 3.0 и более поздние версии поддерживают продолжение строки аргументов в кавычках , вы не можете сделать отступ во второй или последующих строках, не включив в строку пробельные символы отступа.
CMake 2.8 и старше
Вы можете использовать список. Каждый элемент списка можно поставить с новой строки:
Список, используемый без кавычек, объединяется без пробелов:
Если вам действительно нужна строка, вы можете сначала преобразовать список в строку:
Любые точки с запятой в исходных строках будут отображаться как разделители элементов списка и удаляться. Их необходимо избежать:
источник
Это все еще немного многословно, но если ограничение в 80 символов действительно вас беспокоит, вы можете несколько раз добавить к той же переменной:
Дает вывод:
источник
Невозможно разделить строковый литерал на несколько строк в файлах CMakeLists.txt или в сценариях CMake. Если вы включите новую строку в строку, в самой строке будет буквальный перевод строки.
Однако CMake использует пробелы для разделения аргументов, поэтому вы можете изменить пробел, являющийся разделителем аргументов, на новую строку в любом месте, не изменяя поведения.
Вы можете перефразировать эту длинную строку:
как эти две более короткие строки:
Они полностью эквивалентны.
источник
Для тех, кто попал сюда из раздела Как разбить выражение генератора CMake на несколько строк? Я хотел бы добавить несколько примечаний.
Метод продолжения строки не будет работать, CMake не может проанализировать список генератора, состоящий из пробелов (отступов) и продолжения строки.
В то время как строковое (CONCAT) решение предоставит выражение генератора, которое может быть вычислено, вычисленное выражение будет заключено в кавычки, если результат содержит пробел.
Для каждой отдельной опции, которую нужно добавить, должен быть создан отдельный список генераторов, поэтому варианты стекирования, как я сделал в следующем, приведут к сбою сборки:
Это связано с тем, что полученные параметры передаются компилятору в кавычках.
Чтобы оценить длинные выражения генератора, представленные с помощью строкового (CONCAT) решения, каждое выражение генератора должно оцениваться как один параметр без пробелов:
Это может быть не связано с вопросом, на который я отправляю ответ, к сожалению, вопрос, на который я отвечаю, ошибочно помечен как дубликат этого вопроса.
Списки генератора не обрабатываются и анализируются так же, как строки, и из-за этого есть дополнительные меры, которые необходимо предпринять, чтобы разделить список генератора на несколько строк.
источник
Пример в исходном вопросе касается только относительно короткой строки. Для более длинных строк (включая примеры, приведенные в других ответах) аргумент в скобках может быть лучше. Из документации:
источник
\n
s. Если вы этого не хотите, я не думаю, что аргументы в скобках - ваше решение.Чтобы сохранить хороший отступ в коде, достаточно просто сделать
Или сформируйте строку напрямую с помощью
как в ответе Дугласа, у которого есть более подробные сведения. Однако я подумал, что это может просто подвести итог важному моменту.
источник