Spec-Zone.ru › CMake 3.5

cmake-language(7)

  • Организация
    • Директории
    • Скрипты
    • Модули
  • Синтаксис
    • Кодировка
    • Файлы исходного кода
    • Вызовы команд
    • Аргументы команд
      • Аргумент в скобках
      • Аргумент в кавычках
      • Необработанный аргумент
    • Последовательности экранирования
    • Ссылки на переменные
    • Комментарии
      • Комментарий в скобках
      • Однострочный комментарий
  • Управляющие структуры
    • Условные блоки
    • Циклы
    • Определения команд
  • Переменные
  • Списки

Организация

Файлы входных данных CMake написаны на языке CMake в файлах исходного кода, названных CMakeLists.txt или заканчивающихся расширением .cmake.

Файлы исходного кода языка CMake в проекте организованы следующим образом:

  • Директории (CMakeLists.txt),
  • Скрипты (<script>.cmake), и
  • Модули (<module>.cmake).

Директории

При обработке CMake проекта исходного дерева, точкой входа является файл исходного кода, называемый CMakeLists.txt в корневой директории исходного кода. Этот файл может содержать всю спецификацию сборки или использовать команду add_subdirectory() для добавления поддиректорий к сборке. Каждая поддиректория, добавленная с помощью команды, также должна содержать файл CMakeLists.txt в качестве точки входа в эту директорию. Для каждой исходной директории, файл CMakeLists.txt которой обрабатывается CMake, генерируется соответствующая директория в дереве сборки, которая служит рабочей и выходной директорией по умолчанию.

Скрипты

Индивидуальный файл исходного кода <script>.cmake может быть обработан в режиме скрипта с помощью инструмента командной строки cmake(1) с опцией -P. Режим скрипта просто выполняет команды в заданном файле исходного кода языка CMake и не генерирует систему сборки. Он не позволяет использовать команды CMake, которые определяют целевые объекты сборки или действия.

Модули

Код языка CMake в директориях Директории или скриптах Скрипты может использовать команду include() для загрузки файла исходного кода <module>.cmake в рамках контекста включающего файла. См. справочную страницу cmake-modules(7) для документации модулей, включенных в дистрибутив CMake. Деревья исходных кодов проектов также могут предоставлять свои модули и указывать их расположение(я) в переменной CMAKE_MODULE_PATH.

Синтаксис

Кодировка

Файл исходного кода языка CMake может быть написан в текстовом формате 7-битного ASCII для максимальной портативности на всех поддерживаемых платформах. Новые строки могут быть закодированы как \n или \r\n, но будут преобразованы в \n при чтении файлов ввода.

Обратите внимание, что реализация 8-битная, поэтому файлы исходного кода могут быть закодированы в UTF-8 на платформах с системными API, поддерживающими эту кодировку. Кроме того, CMake 3.2 и выше поддерживают файлы исходного кода, закодированные в UTF-8 в Windows (используя UTF-16 для вызовов системных API). Кроме того, CMake 3.0 и выше допускают ведущий UTF-8 Byte-Order Mark в файлах исходного кода.

Файлы исходного кода

Файл исходного кода языка CMake состоит из нуля или более вызовов команд, разделенных символами новой строки и необязательно пробелами и комментариями:

file         ::=  file_element*
file_element ::=  command_invocation line_ending |
                  (bracket_comment|space)* line_ending
line_ending  ::=  line_comment? newline
space        ::=  <match '[ \t]+'>
newline      ::=  <match '\n'>

Обратите внимание, что любая строка исходного файла, которая не находится внутри аргументов команд или комментария в скобках, может оканчиваться однострочным комментарием.

Вызовы команд

Вызов команды — это имя, за которым следуют заключённые в скобки аргументы, разделённые пробелами:

command_invocation  ::=  space* identifier space* '(' arguments ')'
identifier          ::=  <match '[A-Za-z_][A-Za-z0-9_]*'>
arguments           ::=  argument? separated_arguments*
separated_arguments ::=  separation+ argument? |
                         separation* '(' arguments ')'
separation          ::=  space | line_ending

Например:

add_executable(hello world.c)

Имена команд регистронезависимы. Вложенные необработанные скобки в аргументах должны быть сбалансированы. Каждый ( или ) передаётся вызову команды как буквальный необработанный аргумент. Это может использоваться в вызовах команды if() для заключения условий. Например:

if(FALSE AND (FALSE OR TRUE)) # evaluates to FALSE

Примечание

Версии CMake до 3.0 требуют, чтобы идентификаторы имён команд были по крайней мере из 2 символов.

Версии CMake до 2.8.12 молча принимают необработанный аргумент или аргумент в кавычках непосредственно после аргумента в кавычках и не разделённые пробелами. Для совместимости CMake 2.8.12 и выше принимают такой код, но выдают предупреждение.

Аргументы команд

Существует три типа аргументов внутри вызовов команд:

argument ::=  bracket_argument | quoted_argument | unquoted_argument

Аргумент в скобках

Аргумент в скобках, вдохновлённый синтаксисом длинных скобок Lua, заключает содержимое между открывающими и закрывающими «скобками» одинаковой длины:

bracket_argument ::=  bracket_open bracket_content bracket_close
bracket_open     ::=  '[' '='{len} '['
bracket_content  ::=  <any text not containing a bracket_close
                       of the same {len} as the bracket_open>
bracket_close    ::=  ']' '='{len} ']'

Открывающая скобка длины len >= 0 записывается [ , за которой следуют len = , за которыми следует [. Соответствующая закрывающая скобка записывается ] , за которой следуют len = , за которыми следует ]. Скобки не вложены. Для заключённых скобок всегда можно выбрать уникальную длину.

Содержимое аргумента в скобках состоит из всего текста между открывающей и закрывающей скобками, за исключением того, что одна новая строка сразу после открывающей скобки, если она есть, игнорируется. Никакой оценки заключённого содержимого, такого как последовательности экранирования или ссылки на переменные, не выполняется. Аргумент в скобках всегда передаётся вызову команды ровно как один аргумент.

Например:

message([=[
This is the first line in a bracket argument with bracket length 1.
No \-escape sequences or ${variable} references are evaluated.
This is always one argument even though it contains a ; character.
The text does not end on a closing bracket of length 0 like ]].
It does end in a closing bracket of length 1.
]=])

Примечание

Версии CMake до 3.0 не поддерживают аргументы в скобках. Они интерпретируют открывающую скобку как начало необработанного аргумента.

Аргумент в кавычках

Аргумент в кавычках заключает содержимое между открывающими и закрывающими двойными кавычками:

quoted_argument     ::=  '"' quoted_element* '"'
quoted_element      ::=  <any character except '\' or '"'> |
                         escape_sequence |
                         quoted_continuation
quoted_continuation ::=  '\' newline

Содержимое аргумента в кавычках состоит из всего текста между открывающими и закрывающими кавычками. Оба последовательности экранирования и ссылки на переменные оцениваются. Аргумент в кавычках всегда передаётся вызову команды ровно как один аргумент.

Например:

message("This is a quoted argument containing multiple lines.
This is always one argument even though it contains a ; character.
Both \\-escape sequences and ${variable} references are evaluated.
The text does not end on an escaped double-quote like \".
It does end in an unescaped double quote.
")

Последний \ в любой строке, оканчивающейся нечётным числом обратных слэшей, рассматривается как продолжение строки и игнорируется вместе с символом новой строки, который следует непосредственно за ним. Например:

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 до 3.0 не поддерживают продолжение с \. Они сообщают об ошибках в аргументах в кавычках, содержащих строки, оканчивающиеся нечётным числом \ символов.

Необработанный аргумент

Необработанный аргумент не заключён в какой-либо синтаксис кавычек. Он не может содержать пробелов, (, ), #, ", или \ за исключением случаев, когда они экранированы обратным слэшем:

unquoted_argument ::=  unquoted_element+ | unquoted_legacy
unquoted_element  ::=  <any character except whitespace or one of '()#"\'> |
                       escape_sequence
unquoted_legacy   ::=  <see note in text>

Содержимое необработанного аргумента состоит из всего текста в непрерывном блоке разрешённых или экранированных символов. Оба последовательности экранирования и ссылки на переменные оцениваются. Результирующее значение делится так же, как списки делятся на элементы. Каждый непустой элемент передаётся вызову команды как аргумент. Таким образом, необработанный аргумент может передаваться вызову команды как ноль или более аргументов.

Например:

foreach(arg
    NoSpace
    Escaped\ Space
    This;Divides;Into;Five;Arguments
    Escaped\;Semicolon
    )
  message("${arg}")
endforeach()

Примечание

Для поддержки устаревшего кода CMake, аргументы без кавычек могут также содержать строки в двойных кавычках ("...", возможно, содержащие горизонтальные пробелы), и ссылки на переменные в стиле make ($(MAKEVAR)). Неэкранированные двойные кавычки должны быть сбалансированы, не могут появляться в начале аргумента без кавычек и рассматриваются как часть содержимого. Например, аргументы без кавычек -Da="b c", -Da=$(v), и a" "b"c"d интерпретируются буквально.

Вышеупомянутое «unquoted_legacy» производство представляет такие аргументы. Мы не рекомендуем использовать устаревшие аргументы без кавычек в новом коде. Вместо этого используйте аргумент в кавычках или аргумент в скобках для представления содержимого.

Последовательности экранирования

Последовательность экранирования — это \ за которым следует один символ:

escape_sequence  ::=  escape_identity | escape_encoded | escape_semicolon
escape_identity  ::=  '\' <match '[^A-Za-z0-9;]'>
escape_encoded   ::=  '\t' | '\r' | '\n'
escape_semicolon ::=  '\;'

\ за которым следует не буквенно-цифровой символ, просто кодирует буквенный символ без интерпретации его как синтаксиса. \t, \r, или \n кодируют табуляцию, возврат каретки или символ новой строки соответственно. \; вне ссылок на переменные кодирует себя, но может использоваться в аргументе без кавычек для кодирования ; без разделения значения аргумента на нем. \; внутри ссылок на переменные кодирует буквенный символ ;. (См. также документацию по политике CMP0053 для исторических соображений.)

Ссылки на переменные

Ссылка на переменную имеет вид ${variable_name} и оценивается внутри аргумента в кавычках или аргумента без кавычек. Ссылка на переменную заменяется значением переменной или пустой строкой, если переменная не задана. Ссылки на переменные могут быть вложены и вычисляются изнутри наружу, например ${outer_${inner_variable}_variable}.

Буквенные ссылки на переменные могут состоять из буквенно-цифровых символов, символов /_.+-, и последовательностей экранирования. Вложенные ссылки могут использоваться для вычисления переменных любого имени. (См. также документацию по политике CMP0053 для исторических соображений.)

Раздел Переменные описывает область действия имен переменных и то, как устанавливаются их значения.

Ссылка на переменную среды имеет вид $ENV{VAR} и оценивается в тех же контекстах, что и обычная ссылка на переменную.

Комментарии

Комментарий начинается с символа #, который не находится внутри аргумента в скобках, аргумента в кавычках или экранирован с помощью \ как части аргумента без кавычек. Существуют два типа комментариев: комментарий в скобках и строчный комментарий.

Комментарий в скобках

# сразу за которым следует аргумент в скобках образует комментарий в скобках, состоящий из всего содержимого скобок:

bracket_comment ::=  '#' bracket_argument

Например:

#[[This is a bracket comment.
It runs until the close bracket.]]
message("First Argument\n" #[[Bracket Comment]] "Second Argument")

Примечание

Версии CMake до 3.0 не поддерживают комментарии в скобках. Они интерпретируют открывающую # как начало строчного комментария.

Строчный комментарий

# не сразу за которым следует аргумент в скобках образует строчный комментарий, который продолжается до конца строки:

line_comment ::=  '#' <any text not starting in a bracket_argument
                       and not containing a newline>

Например:

# This is a line comment.
message("First Argument\n" # This is a line comment :)
        "Second Argument") # This is a line comment.

Структуры управления

Условные блоки

Команды if()/elseif()/else()/endif() разделяют блоки кода, которые будут выполняться условно.

Циклы

Команды foreach()/endforeach() и while()/endwhile() разделяют блоки кода, которые будут выполняться в цикле. Внутри таких блоков команда break() может быть использована для преждевременного завершения цикла, а команда continue() — для немедленного перехода к следующей итерации.

Определения команд

Команды macro()/endmacro(), и function()/endfunction() разделяют блоки кода, которые будут записаны для последующего вызова в качестве команд.

Переменные

Переменные — это базовая единица хранения в языке CMake. Их значения всегда являются строкового типа, хотя некоторые команды могут интерпретировать строки как значения других типов. Команды set() и unset() явно устанавливают или удаляют переменную, но и другие команды имеют семантику, которая также изменяет переменные. Имена переменных чувствительны к регистру и могут состоять практически из любого текста, но мы рекомендуем придерживаться имен, состоящих только из буквенно-цифровых символов плюс _ и -.

Переменные имеют динамический область действия. Каждое «установка» или «удаление» переменной создает привязку в текущей области действия:

Область действия функции
Определения команд, созданные командой function(), создают команды, которые при вызове обрабатывают записанные команды в новой области действия привязки переменных. Переменная «установка» или «удаление» связывается в этой области действия и видна для текущей функции и любых вложенных вызовов, но не после возвращения функции.
Область действия каталога

Каждый из каталогов в дереве исходных файлов имеет свои собственные привязки переменных. Перед обработкой файла CMakeLists.txt для каталога CMake копирует все привязки переменных, которые в данный момент определены в родительском каталоге, если таковые имеются, чтобы инициализировать новую область действия каталога. CMake скрипты, при обработке с cmake -P, связывают переменные в одной области действия «каталога».

Переменная «установка» или «удаление», не находящаяся внутри вызова функции, связывается с текущей областью действия каталога.

Постоянный кэш
CMake хранит отдельный набор «кэш»-переменных, или «кэш-записей», значения которых сохраняются во время нескольких запусков в рамках дерева проекта. У кэш-записей есть изолированная область действия привязки, изменяемая только по явному запросу, например, опцией CACHE команд set() и unset().

При оценке ссылок на переменные, CMake сначала ищет привязку в стеке вызовов функций, если таковой имеется, а затем обращается к привязке в текущей области действия каталога, если таковая имеется. Если найдена привязка «установки», используется ее значение. Если найдена привязка «удаления» или привязка не найдена, CMake ищет кэш-запись. Если кэш-запись найдена, используется ее значение. В противном случае ссылка на переменную оценивается как пустая строка.

В руководстве cmake-variables(7) описаны многие переменные, которые предоставляются CMake или имеют значение для CMake при их установке кодом проекта.

Списки

Хотя все значения в CMake хранятся как строки, строка может рассматриваться как список в определенных контекстах, например, во время оценки аргумента без кавычек. В таких контекстах строка разделяется на элементы списка путем разделения по символам ;, не следующим за неравным числом символов [ и ], и не предшествующих непосредственно символу \. Последовательность \; не разделяет значение, но заменяется на ; в результирующем элементе.

Список элементов представлен как строка путем конкатенации элементов, разделенных ;. Например, команда set() сохраняет несколько значений в целевой переменной как список:

set(srcs a.c b.c c.c) # sets "srcs" to "a.c;b.c;c.c"

Списки предназначены для простых случаев, таких как список исходных файлов, и не должны использоваться для сложных задач обработки данных. Большинство команд, которые строят списки, не экранируют ; символы в элементах списка, тем самым уплощая вложенные списки:

set(x a "b;c") # sets "x" to "a;b;c", not "a;b\;c"

© 2000–2019 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.5/manual/cmake-language.7.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API