add_custom_command
Добавить пользовательское правило сборки в сгенерированную систему сборки.
Существует два основных синтаксиса для add_custom_command.
Генерация файлов
Первый синтаксис предназначен для добавления пользовательской команды для создания выходного файла:
add_custom_command(OUTPUT output1 [output2 ...]
COMMAND command1 [ARGS] [args1...]
[COMMAND command2 [ARGS] [args2...] ...]
[MAIN_DEPENDENCY depend]
[DEPENDS [depends...]]
[BYPRODUCTS [files...]]
[IMPLICIT_DEPENDS <lang1> depend1
[<lang2> depend2] ...]
[WORKING_DIRECTORY dir]
[COMMENT comment]
[DEPFILE depfile]
[VERBATIM] [APPEND] [USES_TERMINAL]
[COMMAND_EXPAND_LISTS])
Это определяет команду для генерации указанных OUTPUT файлов. Цели, созданные в той же директории (файл CMakeLists.txt), которые указывают любой вывод пользовательской команды как входной файл, получают правило генерации файла с помощью команды во время сборки. Не указывайте вывод более чем в одной независимой цели, которая может собираться параллельно, иначе две копии правила могут конфликтовать (вместо этого используйте команду add_custom_target() для управления командой и сделайте другие цели зависимыми от неё). В терминах makefile это создает новую цель в следующем виде:
OUTPUT: MAIN_DEPENDENCY DEPENDS
COMMAND
Параметры:
-
APPEND - Добавить значения параметров
COMMANDиDEPENDSк пользовательской команде для первого указанного выходного файла. Должна быть предварительно выполнена команда с тем же выходом. ПараметрыCOMMENT,MAIN_DEPENDENCY, иWORKING_DIRECTORYв настоящее время игнорируются при указании APPEND, но могут быть использованы в будущем. -
BYPRODUCTS -
Указать файлы, которые ожидается создать командой, но время модификации которых может быть или не быть новее, чем у зависимостей. Если имя побочного продукта — относительный путь, он будет интерпретирован относительно директории дерева сборки, соответствующей текущей директории исходных файлов. Каждый файл побочного продукта будет автоматически помечен свойством исходного файла
GENERATED.Явное указание побочных продуктов поддерживается генератором
Ninja, чтобы сообщить инструменту сборкиninjaкак перегенерировать побочные продукты, если они отсутствуют. Это также полезно, когда другие правила сборки (например, пользовательские команды) зависят от побочных продуктов. Ninja требует правила сборки для любого сгенерированного файла, от которого зависит другое правило, даже если есть только зависимости по порядку, чтобы убедиться, что побочные продукты будут доступны до сборки их зависимостей.Параметр
BYPRODUCTSигнорируется генераторами, отличными от Ninja, за исключением пометки побочных продуктовGENERATED. -
COMMAND -
Указать командную строку(и) для выполнения во время сборки. Если указано более одной командной строки
COMMAND, они будут выполнены в порядке, но не обязательно объединены в состоятельное командное или пакетное сценарии. (Для запуска полного сценария используйте командуconfigure_file()или командуfile(GENERATE)для его создания, а затем укажитеCOMMANDдля запуска.) Опциональный аргументARGSпредназначен для обратной совместимости и будет проигнорирован.Если
COMMANDуказывает имя целевого исполняемого файла (созданного командойadd_executable()), он будет автоматически заменён расположением созданного во время сборки исполняемого файла. При необходимости свойство целевого исполняемого файлаCROSSCOMPILING_EMULATORтакже будет добавлено в начало команды, чтобы позволить исполняемому файлу выполняться на хост-системе. (ИспользуйтеTARGET_FILEgenerator expressionдля ссылки на исполняемый файл позднее в командной строке.) Кроме того, будет добавлена зависимость на уровне цели, чтобы целевой исполняемый файл был собран перед любой целью, использующей эту пользовательскую команду. Однако ЭТО НЕ добавляет зависимость на уровне файла, которая заставит пользовательскую команду повторно выполняться при каждой перекомпиляции исполняемого файла.Аргументы к
COMMANDмогут использоватьgenerator expressions. Ссылки на имена целей в выражениях генератора подразумевают зависимости на уровне целей, но НЕ зависимости на уровне файлов. Перечислите имена целей с помощью параметраDEPENDSдля добавления зависимостей на уровне файлов. -
COMMENT - Отобразить данное сообщение перед выполнением команд во время сборки.
-
DEPENDS -
Указать файлы, от которых зависит команда. Если какая-либо зависимость является
OUTPUTдругой пользовательской команды в той же директории (файлCMakeLists.txt). CMake автоматически включает другую пользовательскую команду в цель, в которой построена эта команда. ЕслиDEPENDSне указано, команда будет запускаться всякий раз, когдаOUTPUTотсутствует; если команда фактически не создаётOUTPUT, то правило всегда будет выполняться. ЕслиDEPENDSуказывает любую цель (созданную командойadd_custom_target(),add_executable()илиadd_library()), создаётся зависимость на уровне цели, чтобы убедиться, что цель собрана перед любой целью, использующей эту пользовательскую команду. Кроме того, если цель является исполняемым файлом или библиотекой, создаётся зависимость на уровне файла, чтобы заставить пользовательскую команду повторно выполняться при каждой перекомпиляции цели.Аргументы к
DEPENDSмогут использоватьgenerator expressions. -
COMMAND_EXPAND_LISTS - Списки в аргументах
COMMANDбудут расширены, включая те, что созданы с помощьюgenerator expressions, что позволяет расширить аргументыCOMMANDтакие как${CC} "-I$<JOIN:$<TARGET_PROPERTY:foo,INCLUDE_DIRECTORIES>,;-I>" foo.cc. -
IMPLICIT_DEPENDS - Запрос сканирования неявных зависимостей входного файла. Указанный язык определяет язык программирования, сканер зависимостей которого должен быть использован. В настоящее время поддерживаются только сканеры языков
CиCXX. Язык должен быть указан для каждого файла в спискеIMPLICIT_DEPENDS. Обнаруженные зависимости добавляются к зависимостям пользовательской команды во время сборки. Обратите внимание, что параметрIMPLICIT_DEPENDSв настоящее время поддерживается только для генераторов Makefile и будет проигнорирован другими генераторами. -
MAIN_DEPENDENCY - Указать основной входной исходный файл для команды. Это обрабатывается так же, как любое значение, заданное для параметра
DEPENDS, но также указывает генераторам Visual Studio, где разместить пользовательскую команду. Каждый исходный файл может иметь не более одной команды, указывающей его как основную зависимость. Команда компиляции (например, для библиотеки или исполняемого файла) считается неявной основной зависимостью, которая безмолвно перезаписывается указанием пользовательской команды. -
OUTPUT - Указать выходные файлы, которые ожидается создать командой. Если имя выходного файла — относительный путь, он будет интерпретирован относительно директории дерева сборки, соответствующей текущей директории исходных файлов. Каждый выходной файл будет автоматически помечен свойством исходного файла
GENERATED. Если выход пользовательской команды не создаётся как файл на диске, он должен быть помечен свойством исходного файлаSYMBOLIC. -
USES_TERMINAL - Команде будет предоставлен прямой доступ к терминалу, если это возможно. С генератором
Ninjaэто помещает команду в пул задачconsolepool. -
VERBATIM - Все аргументы команд будут должным образом экранированы для инструмента сборки, чтобы вызванная команда получила каждый аргумент неизменённым. Обратите внимание, что один уровень экранирования всё ещё используется процессором языка CMake перед тем, как add_custom_command увидит аргументы. Рекомендуется использовать
VERBATIM, так как это обеспечивает правильное поведение. ЕслиVERBATIMне задан, поведение зависит от платформы, так как нет защиты от специальных символов, специфичных для инструмента. -
WORKING_DIRECTORY - Выполнить команду с указанной текущей рабочей директорией. Если это относительный путь, он будет интерпретирован относительно директории дерева сборки, соответствующей текущей директории исходных файлов.
-
DEPFILE - Указать файл зависимостей
.dдля генератораNinja. Файл.dсодержит зависимости, обычно выводимые самой пользовательской командой. ИспользованиеDEPFILEс генераторами, отличными от Ninja, является ошибкой.
События сборки
Второй синтаксис добавляет пользовательскую команду к цели, такой как библиотека или исполняемый файл. Это полезно для выполнения операции до или после сборки цели. Команда становится частью цели и будет выполняться только при сборке самой цели. Если цель уже собрана, команда не будет выполняться.
add_custom_command(TARGET <target>
PRE_BUILD | PRE_LINK | POST_BUILD
COMMAND command1 [ARGS] [args1...]
[COMMAND command2 [ARGS] [args2...] ...]
[BYPRODUCTS [files...]]
[WORKING_DIRECTORY dir]
[COMMENT comment]
[VERBATIM] [USES_TERMINAL])
Это определяет новую команду, которая будет связана со сборкой указанного <target>. <target> должен быть определен в текущей директории; целевые объекты, определенные в других директориях, не могут быть указаны.
Время выполнения команды определяется следующим:
-
PRE_BUILD - В Генераторах Visual Studio, выполняется до выполнения любых других правил в целевом объекте. В других генераторах, выполняется непосредственно перед
PRE_LINKкомандами. -
PRE_LINK - Выполняется после компиляции исходных кодов, но перед компоновкой двоичного файла или выполнением инструментария для создания статической библиотеки (librarian или archiver). Это не определено для целевых объектов, созданных командой
add_custom_target(). -
POST_BUILD - Выполняется после выполнения всех остальных правил в целевом объекте.
Примечание
Поскольку выражения генератора могут использоваться в пользовательских командах, возможно определение COMMAND строк или целых пользовательских команд, которые вычисляются как пустые строки для определенных конфигураций. Для генераторов Visual Studio 2010 (и более новых) эти строки команд или пользовательские команды будут опущены для конкретной конфигурации, и не будет добавлена «команда-пустая-строка».
Это позволяет добавить отдельные события сборки для каждой конфигурации.
© 2000–2019 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.12/command/add_custom_command.html