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> список, разделенный точкой с запятой идентификаторов отложенных вызовов. Идентификаторы относятся к области каталога, в которую отложены вызовы (т. е. где они будут выполнены), которая может отличаться от области, в которой они были созданы. Опция DIRECTORY может быть использована для указания области, для которой необходимо получить идентификаторы вызовов. Если эта опция не указана, будут возвращены идентификаторы вызовов для текущей области каталога.
Подробные сведения о конкретном вызове можно получить из его идентификатора:
cmake_language(DEFER [DIRECTORY <dir>] GET_CALL <id> <var>)
Это поместит в <var> список, разделенный точкой с запятой, в котором первым элементом является имя вызываемой команды, а оставшиеся элементы — ее невычисленные аргументы (любые содержащиеся ; символы включены буквально и не могут быть отличимы от нескольких аргументов). Если несколько вызовов запланированы с одинаковым идентификатором, этот метод возвращает первый из них. Если для заданного идентификатора в указанной DIRECTORY области (или текущей области каталога, если опция DIRECTORY не указана) нет запланированных вызовов, в переменную запишется пустая строка.
Отложенные вызовы можно отменить по их идентификатору:
cmake_language(DEFER [DIRECTORY <dir>] CANCEL_CALL <id>...)
Это отменяет все отложенные вызовы, соответствующие любым из указанных идентификаторов в указанной DIRECTORY области (или текущей области каталога, если опция DIRECTORY не указана). Неизвестные идентификаторы игнорируются молчаливо.
Примеры отложенных вызовов
Например, код:
cmake_language(DEFER CALL message "${deferred_message}")
cmake_language(DEFER ID_VAR id CALL message "Canceled 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–2021 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.21/command/cmake_language.html