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]
[JOB_POOL job_pool]
[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 требует правила сборки для любого сгенерированного файла, от которого зависит другое правило, даже если есть только зависимости по порядку, чтобы гарантировать, что побочные продукты будут доступны перед сборкой их зависимостей. -
COMMAND -
Укажите команду(ы) командной строки для выполнения во время сборки. Если указано более одной
COMMAND, они будут выполняться в порядке следования, но не обязательно объединяться в состоятельный командный интерпретатор или пакетную скрипт. (Чтобы запустить полную скрипт, используйте командуconfigure_file()или командуfile(GENERATE)для её создания, а затем укажитеCOMMANDдля запуска.) Необязательный аргументARGSпредназначен для обратной совместимости и будет проигнорирован.Если
COMMANDуказывает имя целевого исполняемого файла (созданного командойadd_executable()), он будет автоматически заменён расположением созданного во время сборки исполняемого файла, если выполняется хотя бы одно из следующих условий:- Целевой файл не компилируется на другом компьютере (т.е. переменная
CMAKE_CROSSCOMPILINGне установлена в значение true). - Целевой файл компилируется на другом компьютере и предоставляется эмулятор (т.е. его свойство целевого файла
CROSSCOMPILING_EMULATORустановлено). В этом случае содержимоеCROSSCOMPILING_EMULATORбудет добавлено перед расположением исполняемого файла целевого файла.
Если ни одно из вышеперечисленных условий не выполняется, предполагается, что имя команды — это программа, которую необходимо найти в
PATHво время сборки.Аргументы
COMMANDмогут использоватьgenerator expressions. Используйте выражение генератораTARGET_FILEдля ссылки на расположение целевого объекта позже в командной строке (т.е. в качестве аргумента команды, а не как команды для выполнения).Всякий раз, когда целевой объект используется как команда для выполнения или упоминается в выражении генератора в качестве аргумента команды, автоматически добавляется зависимость уровня целевого объекта, чтобы указанный целевой объект был собран до любого целевого объекта, использующего эту пользовательскую команду. Однако это НЕ добавляет зависимость уровня файла, которая заставила бы пользовательскую команду повторно выполняться при каждой перекомпиляции исполняемого файла. Перечислите имена целевых объектов с помощью опции
DEPENDSдля добавления таких зависимостей на уровне файлов. - Целевой файл не компилируется на другом компьютере (т.е. переменная
-
COMMENT -
Вывести указанное сообщение перед выполнением команд во время сборки.
-
DEPENDS -
Указать файлы, от которых зависит команда. Если любая зависимость является
OUTPUTдругой пользовательской команды в той же директории (файлCMakeLists.txt), CMake автоматически включает другую пользовательскую команду в целевой объект, в котором построена эта команда. Добавляется зависимость уровня целевого объекта, если любая зависимость указана какBYPRODUCTSцелевого объекта или любого из его событий сборки в той же директории, чтобы убедиться, что побочные продукты будут доступны. Если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 и будет проигнорирована другими генераторами. -
JOB_POOL -
Укажите
poolдля генератораNinja. Несовместимо сUSES_TERMINAL, что подразумевает пулconsole. Использование пула, который не определёнJOB_POOLS, приводит к ошибке в ninja во время сборки. -
MAIN_DEPENDENCY -
Укажите основной входной файл-источник для команды. Это обрабатывается так же, как любое значение, заданное для опции
DEPENDS, но также подразумевает для генераторов Visual Studio, где следует расположить пользовательскую команду. Каждый файл-источник может иметь не более одной команды, указывающей его как основную зависимость. Команда компиляции (т.е. для библиотеки или исполняемого файла) считается неявной основной зависимостью, которая безмолвно перезаписывается указанием пользовательской команды. -
OUTPUT -
Укажите выходные файлы, которые команда должна произвести. Если имя выходного файла — это относительный путь, оно будет интерпретировано относительно каталога дерева сборки, соответствующего текущей директории исходного кода. Каждый выходной файл будет автоматически помечен свойством файла-источника
GENERATED. Если выход пользовательской команды на самом деле не создаётся как файл на диске, он должен быть помечен свойством файла-источникаSYMBOLIC. -
USES_TERMINAL -
Команда получит прямой доступ к терминалу, если это возможно. С генератором
Ninjaэто помещает команду в пулconsolepool. -
VERBATIM -
Все аргументы команд будут правильно экранированы для инструмента сборки, чтобы вызываемая команда получала каждый аргумент без изменений. Обратите внимание, что один уровень экранирования всё ещё используется процессором языка CMake перед тем, как add_custom_command получит аргументы. Рекомендуется использовать
VERBATIM, так как это обеспечивает правильное поведение. ЕслиVERBATIMне указано, поведение зависит от платформы, так как нет защиты от специальных символов, специфичных для инструмента. -
WORKING_DIRECTORY -
Выполнить команду с заданной текущей рабочей директорией. Если это относительный путь, он будет интерпретирован относительно каталога дерева сборки, соответствующего текущей директории исходного кода.
Аргументы
WORKING_DIRECTORYмогут использоватьgenerator expressions. -
DEPFILE -
Укажите
.ddepfile для генератора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]
[COMMAND_EXPAND_LISTS])
Это определяет новую команду, которая будет связана со сборкой указанного <target>. <target> должна быть определена в текущем каталоге; целевые объекты, определенные в других каталогах, могут не быть указаны.
Время выполнения команды определяется выбранным из следующего:
-
PRE_BUILD -
В генераторах Visual Studio выполняется до выполнения любых других правил в целевом объекте. В других генераторах выполняется непосредственно перед
PRE_LINKкомандами. -
PRE_LINK -
Выполняется после компиляции исходных файлов, но перед линковкой двоичного файла или запуском инструмента библиотекаря или архиватора статической библиотеки. Это не определено для целевых объектов, созданных командой
add_custom_target(). -
POST_BUILD -
Выполняется после выполнения всех остальных правил в целевом объекте.
Примечание
Так как в пользовательских командах могут использоваться выражения генератора, возможно определение COMMAND строк или целых пользовательских команд, которые вычисляются как пустые строки для определённых конфигураций. Для генераторов Visual Studio 2010 (и более поздних версий) эти строки команд или пользовательские команды будут опущены для конкретной конфигурации, и не будет добавлена «команда-пустая-строка».
Это позволяет добавить отдельные события сборки для каждой конфигурации.
© 2000–2020 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.16/command/add_custom_command.html