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