Spec-Zone.ru › CMake 3.19

cmake_language

Новое в версии 3.18.

Вызов метаопераций для команд CMake.

Синопсис

cmake_language(CALL <command> [<arg>...])
cmake_language(EVAL CODE <code>...)
cmake_language(DEFER <options>... CALL <command> [<arg>...])

Введение

Эта команда вызывает метаоперации для встроенных команд CMake или команд, созданных с помощью команд macro() или function().

cmake_language не создаёт новую переменную или область политики.

Вызов команд

cmake_language(CALL <command> [<arg>...])

Вызывает команду с заданным именем <command> с указанными аргументами (если таковые имеются). Например, код:

set(message_command "message")
cmake_language(CALL ${message_command} STATUS "Hello World!")

эквивалентен

message(STATUS "Hello World!")

Примечание

Для обеспечения согласованности кода запрещены следующие команды:

  • if / elseif / else / endif
  • while / endwhile
  • foreach / endforeach
  • function / endfunction
  • macro / endmacro

Вычисление кода

cmake_language(EVAL CODE <code>...)

Вычисляет <code>... как код CMake.

Например, код:

set(A TRUE)
set(B TRUE)
set(C TRUE)
set(condition "(A AND B) OR C")

cmake_language(EVAL CODE "
  if (${condition})
    message(STATUS TRUE)
  else()
    message(STATUS FALSE)
  endif()"
)

эквивалентен

set(A TRUE)
set(B TRUE)
set(C TRUE)
set(condition "(A AND B) OR C")

file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/eval.cmake "
  if (${condition})
    message(STATUS TRUE)
  else()
    message(STATUS FALSE)
  endif()"
)

include(${CMAKE_CURRENT_BINARY_DIR}/eval.cmake)

Отложенные вызовы

Новое в версии 3.19.

cmake_language(DEFER <options>... CALL <command> [<arg>...])

Планирует вызов команды с заданным именем <command> с указанными аргументами (если таковые имеются) на более позднее время. По умолчанию отложенные вызовы выполняются как если бы они были записаны в конце файла CMakeLists.txt текущего каталога, за исключением того, что они выполняются даже после вызова return(). Ссылки на переменные в аргументах вычисляются в момент выполнения отложенного вызова.

Доступны следующие параметры:

DIRECTORY <dir>

Планирует вызов для конца указанного каталога вместо текущего. Указанный <dir> может ссылаться либо на каталог исходного кода, либо на соответствующий каталог библиотек. Относительные пути рассматриваются как относительные к текущему каталогу исходного кода.

Указанный каталог должен быть известен CMake, будучи либо корневым каталогом, либо добавленным с помощью add_subdirectory(). Кроме того, указанный каталог не должен ещё завершить обработку. Это означает, что он может быть текущим каталогом или одним из его предков.

ID <id>

Указывает идентификатор для отложенного вызова. Идентификатор <id> не может быть пустым и не может начинаться с заглавной буквы A-Z. Идентификатор <id> может начинаться с нижнего подчеркивания (_ ), только если он был сгенерирован автоматически предыдущим вызовом, который использовал ID_VAR для получения идентификатора.

ID_VAR <var>

Указывает переменную, в которой будет храниться идентификатор отложенного вызова. Если ID <id> не указан, будет сгенерирован новый идентификатор, и сгенерированный идентификатор будет начинаться с нижнего подчеркивания (_).

Текущий запланированный список отложенных вызовов может быть получен:

cmake_language(DEFER [DIRECTORY <dir>] GET_CALL_IDS <var>)

Это позволит сохранить в <var> список, разделенный точкой с запятой идентификаторов отложенных вызовов.

Подробные сведения о конкретном вызове могут быть получены по его идентификатору:

cmake_language(DEFER [DIRECTORY <dir>] GET_CALL <id> <var>)

Это сохранит в <var> список, разделенный точкой с запятой, где первый элемент — имя вызываемой команды, а оставшиеся элементы — её неуточнённые аргументы (любые символы ; включаются буквально и не могут быть отличить от нескольких аргументов). Если несколько вызовов запланированы с одинаковым идентификатором, то будет возвращён первый из них. Если запланирован ни один вызов с данным идентификатором, переменная будет содержать пустую строку.

Отложенные вызовы могут быть отменены по их идентификатору:

cmake_language(DEFER [DIRECTORY <dir>] CANCEL_CALL <id>...)

Это отменяет все отложенные вызовы, соответствующие любому из заданных идентификаторов. Неизвестные идентификаторы игнорируются.

Примеры отложенных вызовов

Например, код:

cmake_language(DEFER CALL message "${deferred_message}")
cmake_language(DEFER ID_VAR id CALL message "Cancelled Message")
cmake_language(DEFER CANCEL_CALL ${id})
message("Immediate Message")
set(deferred_message "Deferred Message")

выведет:

Immediate Message
Deferred Message

Строка Cancelled Message никогда не выводится, потому что её команда отменена. Ссылка на переменную deferred_message не вычисляется до места вызова, поэтому её можно задать после планирования отложенного вызова.

Для немедленного вычисления ссылок на переменные при планировании отложенного вызова заключите их в cmake_language(EVAL). Однако обратите внимание, что аргументы будут переоценены в отложенном вызове, хотя этого можно избежать с помощью аргументов в скобках. Например:

set(deferred_message "Deferred Message 1")
set(re_evaluated [[${deferred_message}]])
cmake_language(EVAL CODE "
  cmake_language(DEFER CALL message [[${deferred_message}]])
  cmake_language(DEFER CALL message \"${re_evaluated}\")
")
message("Immediate Message")
set(deferred_message "Deferred Message 2")

также выводит:

Immediate Message
Deferred Message 1
Deferred Message 2

© 2000–2020 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.19/command/cmake_language.html

Spec-Zone.ru

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