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, они будут выполняться в порядке, но не обязательно в составе состояния shell или пакетной скрипта. (Чтобы запустить полную скрипт, используйте команду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 - Указать
.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])
Это определяет новую команду, которая будет связана со сборкой указанной <target>. <target> должна быть определена в текущей директории; цели, определённые в других директориях, не могут быть указаны.
Время выполнения команды определяется тем, какой из следующих вариантов указан:
-
PRE_BUILD - Выполняется до выполнения любых других правил в целевом объекте. Поддерживается только в Visual Studio 8 и более поздних версиях. Для всех остальных генераторов
PRE_BUILDбудет рассматриваться какPRE_LINK. -
PRE_LINK - Выполняется после компиляции исходных данных, но перед связыванием двоичного файла или запуском утилиты библиотекаря или архиватора статической библиотеки. Это не определено для целевых объектов, созданных командой
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.11/command/add_custom_command.html