add_custom_command
Добавляет пользовательское правило сборки в сгенерированную систему сборки.
Синтаксис
Generating Files
add_custom_command(OUTPUT <output1> [<output2> ...]
COMMAND <command1> [ARGS] [<args1>...]
[...])
Build Events
add_custom_command(TARGET <target>
PRE_BUILD | PRE_LINK | POST_BUILD
[...]) Создание файлов
-
add_custom_command(OUTPUT <output1> [<output2> ...] COMMAND <command1> [ARGS] [<args1>...] [...]) -
Добавить пользовательскую команду для создания выходного файла:
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>] [JOB_SERVER_AWARE <bool>] [VERBATIM] [APPEND] [USES_TERMINAL] [CODEGEN] [COMMAND_EXPAND_LISTS] [DEPENDS_EXPLICIT_ONLY])Эта команда определяет команду для создания указанных
OUTPUTфайла(ов). Цель, созданная в том же каталоге (файлCMakeLists.txt), в которой любой выходной файл пользовательской команды указан в качестве исходного файла, получает правило для создания этого файла с помощью команды во время сборки.Не указывайте выходной файл более чем в одной независимой цели, которая может собираться параллельно: экземпляры правила могут конфликтовать. Вместо этого используйте команду
add_custom_target()для выполнения команды и задайте зависимости остальных целей от неё. См. приведённый ниже Пример: создание файлов для нескольких целей.Доступны следующие параметры:
-
APPEND -
Добавить значения параметров
COMMANDиDEPENDSк пользовательской команде для первого указанного выходного файла. Ранее уже должен был быть вызван этот вызов команды с тем же выходным файлом.Если в предыдущем вызове выходной файл был указан с помощью генераторного выражения, выходной файл, указанный в текущем вызове, должен совпадать как минимум в одной конфигурации после вычисления генераторных выражений. В этом случае добавленные команды и зависимости применяются ко всем конфигурациям.
Параметры
COMMENT,MAIN_DEPENDENCYиWORKING_DIRECTORYв настоящее время игнорируются, если указанAPPEND, но могут использоваться в будущем. -
BYPRODUCTS -
Добавлено в версии 3.2.
Указать файлы, которые команда должна создать, но время изменения которых может быть как более поздним, так и не более поздним, чем у зависимостей. Если имя дополнительного выходного файла является относительным путём, оно интерпретируется относительно каталога дерева сборки, соответствующего текущему каталогу исходного кода. Для каждого дополнительного выходного файла автоматически устанавливается свойство исходного файла
GENERATED.О мотивации этой функции см. политику
CMP0058.Явное указание дополнительных выходных файлов поддерживается генератором
Ninja, чтобы сообщить инструменту сборкиninja, как заново создать дополнительные выходные файлы, если они отсутствуют. Это также полезно, когда другие правила сборки (например, пользовательские команды) зависят от дополнительных выходных файлов. Ninja требует наличия правила сборки для любого сгенерированного файла, от которого зависит другое правило, даже если зависимости являются только упорядочивающими, чтобы дополнительные выходные файлы были доступны до сборки зависимых от них целей.Генераторы Makefile удаляют
BYPRODUCTSи другие файлыGENERATEDво времяmake clean.Это ключевое слово нельзя использовать с
APPEND(см. политикуCMP0175). Все дополнительные выходные файлы должны быть заданы при первом вызовеadd_custom_command(OUTPUT...)для выходных файлов.Добавлено в версии 3.20: Аргументы
BYPRODUCTSмогут использовать ограниченный наборgenerator expressions. Выражения, зависящие от цели не допускаются.Изменено в версии 3.28: В целях, использующих Наборы файлов, дополнительные выходные файлы пользовательских команд теперь считаются закрытыми, если они не перечислены в незакрытом наборе файлов. См. политику
CMP0154. -
COMMAND -
Указать командную строку (строки), выполняемую во время сборки. Обычно указывается как минимум один
COMMAND, однако в некоторых случаях его можно опустить, например, при добавлении команд отдельными вызовами с помощьюAPPEND.Если указано несколько
COMMAND, они будут выполняться по порядку, но не обязательно будут объединены в оболочку или пакетный сценарий с общим состоянием. Чтобы запустить полноценный сценарий, используйте командуconfigure_file()или командуfile(GENERATE)для его создания, а затем укажитеCOMMANDдля его запуска.Необязательный аргумент
ARGSпредусмотрен для обратной совместимости и будет проигнорирован.Если
COMMANDуказывает имя исполняемой цели (созданной командойadd_executable()), оно будет автоматически заменено на путь к исполняемому файлу, созданному во время сборки, если выполняется одно из следующих условий:- Цель не собирается для другой платформы (то есть для переменной
CMAKE_CROSSCOMPILINGне задано значение true). -
Добавлено в версии 3.6: Цель собирается для другой платформы, и указан эмулятор (то есть задано свойство цели
CROSSCOMPILING_EMULATOR). В этом случае содержимоеCROSSCOMPILING_EMULATORбудет добавлено перед командой, до пути к исполняемому файлу цели.
Если ни одно из перечисленных условий не выполняется, предполагается, что имя команды обозначает программу, которую нужно найти в
PATHво время сборки.Аргументы
COMMANDмогут использоватьgenerator expressions. Используйте генераторное выражениеTARGET_FILE, чтобы указать путь к цели далее в командной строке (то есть в качестве аргумента команды, а не самой выполняемой команды).При использовании любого из следующих генераторных выражений, основанных на цели, в качестве выполняемой команды или в аргументе команды автоматически добавляется зависимость уровня цели, чтобы указанная цель собиралась до любой цели, использующей эту пользовательскую команду (см. политику
CMP0112).TARGET_FILETARGET_LINKER_FILETARGET_SONAME_FILETARGET_PDB_FILE
Эта зависимость уровня цели НЕ добавляет зависимость уровня файла, которая приводила бы к повторному запуску пользовательской команды при каждой повторной компиляции исполняемого файла. Чтобы добавить такие зависимости уровня файла, укажите имена целей с параметром
DEPENDS. - Цель не собирается для другой платформы (то есть для переменной
-
COMMENT -
Вывести указанное сообщение перед выполнением команд во время сборки. Если указан
APPEND, сообщение будет проигнорировано, хотя в будущей версии оно может использоваться.Добавлено в версии 3.26: Аргументы
COMMENTмогут использоватьgenerator expressions. -
DEPENDS -
Указать файлы, от которых зависит команда. Каждый аргумент преобразуется в зависимость следующим образом:
-
Если аргумент является именем цели (созданной командой
add_custom_target(),add_executable()илиadd_library()), создаётся зависимость уровня цели, чтобы обеспечить сборку этой цели до любой цели, использующей данную пользовательскую команду. Кроме того, если цель является исполняемым файлом или библиотекой, создаётся зависимость уровня файла, чтобы пользовательская команда запускалась повторно при каждой повторной компиляции цели.Изменено в версии 4.4: Ранее исполняемую цель можно было указать, добавив
.exeк имени цели. Теперь это запрещено. См. политикуCMP0212. - Если аргумент является абсолютным путём, для этого пути создаётся зависимость уровня файла.
- Если аргумент является именем исходного файла, добавленного в цель или имеющего заданное свойство исходного файла, для этого исходного файла создаётся зависимость уровня файла.
- Если аргумент является относительным путём и файл существует в текущем каталоге исходного кода, для этого файла в текущем каталоге исходного кода создаётся зависимость уровня файла.
- В противном случае зависимость уровня файла создаётся для этого пути относительно текущего каталога двоичных файлов.
Если какая-либо зависимость является
OUTPUTдругой пользовательской команды в том же каталоге (файлCMakeLists.txt), CMake автоматически добавляет другую пользовательскую команду в цель, при сборке которой выполняется эта команда.Добавлено в версии 3.16: Зависимость уровня цели добавляется, если какая-либо зависимость указана как
BYPRODUCTSцели или одного из событий её сборки в том же каталоге, чтобы обеспечить доступность дополнительных выходных файлов.Если
DEPENDSне указан, команда будет выполняться каждый раз, когда отсутствуетOUTPUT; если команда фактически не создаётOUTPUT, правило будет выполняться всегда.Добавлено в версии 3.1: Аргументы
DEPENDSмогут использоватьgenerator expressions. -
-
COMMAND_EXPAND_LISTS -
Добавлено в версии 3.8.
Списки в аргументах
COMMANDбудут развёрнуты, в том числе списки, созданные с помощьюgenerator expressions, что позволит корректно разворачивать аргументыCOMMAND, такие как${CC} "-I$<JOIN:$<TARGET_PROPERTY:foo,INCLUDE_DIRECTORIES>,;-I>" foo.cc.Это ключевое слово нельзя использовать с
APPEND(см. политикуCMP0175). Если для добавленных команд нужно установить этот параметр, его необходимо задать при первом вызовеadd_custom_command(OUTPUT...)для выходных файлов. -
CODEGEN -
Добавлено в версии 3.31.
Добавляет пользовательскую команду в глобальную цель
codegen, которую можно использовать для выполнения пользовательской команды, избегая при этом большей части графа сборки.Этот параметр поддерживается только генераторами Ninja и генераторами Makefile; другие генераторы его игнорируют. Кроме того, этот параметр разрешён только в том случае, если для политики
CMP0171задано значениеNEW.Это ключевое слово нельзя использовать с
APPEND(см. политикуCMP0175). Его можно задать только при первом вызовеadd_custom_command(OUTPUT...)для выходных файлов. -
IMPLICIT_DEPENDS -
Запросить сканирование неявных зависимостей входного файла. Указанный язык определяет язык программирования, сканер зависимостей которого следует использовать. В настоящее время поддерживаются только сканеры языков
CиCXX. Язык необходимо указать для каждого файла в спискеIMPLICIT_DEPENDS. Зависимости, обнаруженные при сканировании, добавляются к зависимостям пользовательской команды во время сборки. Обратите внимание, что параметрIMPLICIT_DEPENDSв настоящее время поддерживается только генераторами Makefile и игнорируется другими генераторами.Примечание
Этот параметр нельзя указывать одновременно с параметром
DEPFILE. -
JOB_POOL -
Добавлено в версии 3.15.
Указать
poolдля генератораNinja. Несовместим сUSES_TERMINAL, который подразумевает пулconsole. Использование пула, не определённого вJOB_POOLS, приводит к ошибке Ninja во время сборки.Это ключевое слово нельзя использовать с
APPEND(см. политикуCMP0175). Пулы заданий можно указывать только при первом вызовеadd_custom_command(OUTPUT...)для выходных файлов. -
JOB_SERVER_AWARE -
Добавлено в версии 3.28.
Указать, что команда поддерживает сервер заданий GNU Make.
Для генераторов
Unix Makefiles,MSYS MakefilesиMinGW Makefilesк строке рецепта добавляется префикс+. Дополнительные сведения см. в документации GNU Make.Другие генераторы молча игнорируют этот параметр.
Это ключевое слово нельзя использовать с
APPEND(см. политикуCMP0175). Поддержку сервера заданий можно указать только при первом вызовеadd_custom_command(OUTPUT...)для выходных файлов.
-
MAIN_DEPENDENCY -
Указать основной входной исходный файл для команды. Он обрабатывается так же, как любое значение, переданное параметру
DEPENDS, но также подсказывает генераторам Visual Studio, к какому файлу привязать пользовательскую команду. Для каждого исходного файла можно указать не более одной команды в качестве основной зависимости. Команда компиляции (то есть для библиотеки или исполняемого файла) считается неявной основной зависимостью, которая незаметно перезаписывается заданием пользовательской команды.Этот параметр в настоящее время игнорируется, если указан
APPEND, но в будущей версии он может использоваться. -
OUTPUT -
Указать выходные файлы, которые должна создать команда. Для каждого выходного файла автоматически устанавливается свойство исходного файла
GENERATED. Если выходные данные пользовательской команды фактически не создаются на диске в виде файла, для них следует установить свойство исходного файлаSYMBOLIC.Если имя выходного файла является относительным путём, его абсолютный путь определяется относительно:
- каталога сборки, соответствующего текущему каталогу исходного кода (
CMAKE_CURRENT_BINARY_DIR), или - текущего каталога исходного кода (
CMAKE_CURRENT_SOURCE_DIR).
Предпочтителен путь в каталоге сборки, если только путь в дереве исходного кода не упоминается в другом месте текущего каталога как абсолютный путь к исходному файлу.
Путь к выходному файлу не может содержать символы
<или>.Добавлено в версии 3.20: Аргументы
OUTPUTмогут использовать ограниченный наборgenerator expressions. Выражения, зависящие от цели не допускаются.Изменено в версии 3.28: В целях, использующих Наборы файлов, выходные файлы пользовательских команд теперь считаются закрытыми, если они не перечислены в незакрытом наборе файлов. См. политику
CMP0154.Изменено в версии 3.30: Теперь путь к выходному файлу может содержать символы
#, кроме случаев использования генератораBorland Makefiles. - каталога сборки, соответствующего текущему каталогу исходного кода (
-
USES_TERMINAL -
Добавлено в версии 3.2.
Команда по возможности получит прямой доступ к терминалу. В генераторе
Ninjaкоманда помещается в пулconsolepool.Это ключевое слово нельзя использовать с
APPEND(см. политикуCMP0175). Если добавленным командам нужен доступ к терминалу, этот параметр необходимо задать при первом вызовеadd_custom_command(OUTPUT...)для выходных файлов. -
VERBATIM -
Все аргументы команд будут корректно экранированы для инструмента сборки, чтобы вызываемая команда получала каждый аргумент без изменений. Обратите внимание, что обработчик языка CMake всё ещё использует один уровень экранирования до того, как add_custom_command получает аргументы. Рекомендуется использовать
VERBATIM, поскольку это обеспечивает корректное поведение. ЕслиVERBATIMне указан, поведение зависит от платформы, поскольку специальные символы, используемые инструментом, не защищены.Это ключевое слово нельзя использовать с
APPEND(см. политикуCMP0175). Если добавленные команды должны обрабатываться какVERBATIM, этот параметр необходимо задать при первом вызовеadd_custom_command(OUTPUT...)для выходных файлов. -
WORKING_DIRECTORY -
Выполнить команду с указанным текущим рабочим каталогом. Если указан относительный путь, он интерпретируется относительно каталога дерева сборки, соответствующего текущему каталогу исходного кода. Если параметр не указан, используется
CMAKE_CURRENT_BINARY_DIR.Этот параметр в настоящее время игнорируется, если указан
APPEND, но в будущей версии он может использоваться.Добавлено в версии 3.13: Аргументы
WORKING_DIRECTORYмогут использоватьgenerator expressions. -
DEPFILE -
Добавлено в версии 3.7.
Указать файл depfile, содержащий зависимости пользовательской команды. Обычно его создаёт сама пользовательская команда. Это ключевое слово можно использовать только в том случае, если генератор поддерживает его, как описано ниже.
Ожидаемый формат, совместимый с форматом, создаваемым
gccс параметром-M, не зависит от генератора или платформы.Формальный синтаксис, заданный с помощью нотации БНФ с обычными расширениями, выглядит следующим образом:
depfile ::= rule* rule ::= targets (':' (separator dependencies?)?)? eol targets ::= target (separator target)* separator* target ::= pathname dependencies ::= dependency (separator dependency)* separator* dependency ::= pathname separator ::= (space | line_continue)+ line_continue ::= '\' eol space ::= ' ' | '\t' pathname ::= character+ character ::= std_character | dollar | hash | whitespace std_character ::= <any character except '$', '#' or ' '> dollar ::= '$$' hash ::= '\#' whitespace ::= '\ ' eol ::= '\r'? '\n'Примечание
При
pathnameлюбая косая черта и обратная косая черта интерпретируются как разделитель каталогов.Добавлено в версии 3.7: Генератор
NinjaподдерживаетDEPFILEс момента появления этого ключевого слова.Добавлено в версии 3.17: Добавлен генератор
Ninja Multi-Config, который поддерживает ключевое словоDEPFILE.Добавлено в версии 3.20: Добавлена поддержка генераторов Makefile.
Примечание
Для генераторов Makefile нельзя указывать
DEPFILEодновременно с параметромIMPLICIT_DEPENDS.Добавлено в версии 3.21: Добавлена поддержка генераторов Visual Studio для VS 2012 и более поздних версий, а также генератора
Xcode. Также добавлена поддержкаgenerator expressions.Добавлено в версии 3.29: Теперь генераторы Ninja добавляют зависимости в базу данных «deps log», если файл не указан в
OUTPUTSилиBYPRODUCTS.Использование
DEPFILEс генераторами, не перечисленными выше, приводит к ошибке.Если аргумент
DEPFILEявляется относительным путём, он должен быть указан относительноCMAKE_CURRENT_BINARY_DIR; все относительные пути внутриDEPFILEтакже должны быть указаны относительноCMAKE_CURRENT_BINARY_DIR. См. политикуCMP0116, для которой всегда установлено значениеNEWу генераторов Makefile, генераторов Visual Studio и генератораXcode.Это ключевое слово нельзя использовать с
APPEND(см. политикуCMP0175). Файлы depfile можно задать только при первом вызовеadd_custom_command(OUTPUT...)для выходных файлов.
DEPENDS_EXPLICIT_ONLYДобавлено в версии 3.27.
Указывает, что аргумент
DEPENDSкоманды представляет все необходимые команде файлы и неявные зависимости не требуются.Без этого параметра, если какая-либо цель использует выходные данные пользовательской команды, CMake будет считать зависимости этой цели неявными зависимостями пользовательской команды на случай, если ей потребуются файлы, неявно созданные этими целями.
Этот параметр можно включить для всех пользовательских команд, задав значение
ONдляCMAKE_ADD_CUSTOM_COMMAND_DEPENDS_EXPLICIT_ONLY. -
Это ключевое слово нельзя использовать с
APPEND(см. политикуCMP0175). Его можно задать только при первом вызовеadd_custom_command(OUTPUT...)для выходных файлов.Только генераторы Ninja используют эту информацию для удаления ненужных неявных зависимостей.
См. также свойство цели
OPTIMIZE_DEPENDENCIES, которое в некоторых сценариях может предложить другой способ уменьшить влияние зависимостей между целями.
Примеры: создание файлов
Для создания исходных файлов можно использовать пользовательские команды. Например, следующий код:
add_custom_command(
OUTPUT out.c
COMMAND someTool -i ${CMAKE_CURRENT_SOURCE_DIR}/in.txt
-o out.c
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/in.txt
VERBATIM)
add_library(myLib out.c)
добавляет пользовательскую команду для запуска someTool с целью создания out.c, а затем компилирует созданный исходный файл как часть библиотеки. Правило генерации будет выполняться повторно при каждом изменении in.txt.
Добавлено в версии 3.20: Для задания выходных файлов для каждой конфигурации можно использовать выражения генератора. Например, следующий код:
add_custom_command(
OUTPUT "out-$<CONFIG>.c"
COMMAND someTool -i ${CMAKE_CURRENT_SOURCE_DIR}/in.txt
-o "out-$<CONFIG>.c"
-c "$<CONFIG>"
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/in.txt
VERBATIM)
add_library(myLib "out-$<CONFIG>.c")
добавляет пользовательскую команду для запуска someTool с целью создания out-<config>.c, где <config> — конфигурация сборки, а затем компилирует созданный исходный файл как часть библиотеки.
Добавлено в версии 3.31: Используйте параметр CODEGEN, чтобы добавить выходные файлы пользовательской команды в встроенную цель codegen. Это полезно для предоставления сгенерированного кода инструментам статического анализа без сборки всего проекта. Например:
add_executable(someTool someTool.c) add_custom_command( OUTPUT out.c COMMAND someTool -o out.c CODEGEN) add_library(myLib out.c)
Пользователь может собрать цель codegen, чтобы создать out.c. someTool собирается как зависимость, но myLib вообще не собирается.
Пример: создание файлов для нескольких целей
Если одним и тем же выходным файлом пользовательской команды требуется воспользоваться нескольким независимым целям, эту команду необходимо прикрепить к единственной пользовательской цели, от которой зависят все эти цели. Рассмотрим следующий пример:
add_custom_command(
OUTPUT table.csv
COMMAND makeTable -i ${CMAKE_CURRENT_SOURCE_DIR}/input.dat
-o table.csv
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/input.dat
VERBATIM)
add_custom_target(generate_table_csv DEPENDS table.csv)
add_custom_command(
OUTPUT foo.cxx
COMMAND genFromTable -i table.csv -case foo -o foo.cxx
DEPENDS table.csv # file-level dependency
generate_table_csv # target-level dependency
VERBATIM)
add_library(foo foo.cxx)
add_custom_command(
OUTPUT bar.cxx
COMMAND genFromTable -i table.csv -case bar -o bar.cxx
DEPENDS table.csv # file-level dependency
generate_table_csv # target-level dependency
VERBATIM)
add_library(bar bar.cxx)
Выходной файл foo.cxx требуется только цели foo, а выходной файл bar.cxx — только цели bar, но обеим целям транзитивно требуется table.csv. Поскольку foo и bar — независимые цели, которые могут собираться параллельно, мы предотвращаем их конфликт при создании table.csv, размещая соответствующую пользовательскую команду в отдельной цели generate_table_csv. Пользовательские команды, создающие foo.cxx и bar.cxx, указывают зависимость на уровне цели от generate_table_csv, поэтому использующие их цели foo и bar не будут собираться до завершения сборки цели generate_table_csv.
События сборки
-
add_custom_command(TARGET <target> PRE_BUILD | PRE_LINK | POST_BUILD [...]) -
Добавляет событие сборки для такой цели, как библиотека или исполняемый файл. Это удобно для выполнения операции до или после сборки цели. Команда становится частью цели и выполняется только при сборке самой цели. Если цель уже собрана, команда не выполняется.
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] [COMMAND_EXPAND_LISTS] [USES_TERMINAL])Определяет новую команду, связанную со сборкой указанной
<target>.<target>должна быть определена в текущем каталоге; указывать цели, определённые в других каталогах, нельзя.Момент выполнения команды определяется одним из следующих параметров:
-
PRE_BUILD -
Этот параметр имеет особое поведение для генераторов Visual Studio. При использовании одного из генераторов Visual Studio команда выполняется до любых других правил в рамках цели. Для всех остальных генераторов этот параметр ведёт себя так же, как
PRE_LINK. Поэтому рекомендуется не использоватьPRE_BUILD, если только не известно, что используется генератор Visual Studio. -
PRE_LINK -
Выполняется после компиляции исходных файлов, но до компоновки двоичного файла или запуска инструмента управления библиотекой либо архиватора для статической библиотеки. Этот параметр не определён для целей, созданных командой
add_custom_target(). -
POST_BUILD -
Выполняется после выполнения всех остальных правил в рамках цели.
В проектах всегда следует указывать одно из трёх приведённых выше ключевых слов при использовании формы
TARGET. См. политикуCMP0175.Все остальные ключевые слова, указанные выше в сигнатуре, имеют то же значение, что и в форме команды
add_custom_command(OUTPUT). Необходимо указать хотя бы одинCOMMAND; см. политикуCMP0175. -
Примечание
Поскольку в пользовательских командах можно использовать выражения генератора, можно определить строки COMMAND или целые пользовательские команды, которые для некоторых конфигураций вычисляются в пустые строки. Для генераторов Visual Studio эти строки команд или пользовательские команды будут опущены для конкретной конфигурации, и команда с «пустой строкой» добавлена не будет.
Это позволяет добавлять отдельные события сборки для каждой конфигурации.
Добавлено в версии 3.21: Поддержка выражений генератора, зависящих от цели.
Добавлено в версии 3.29: Элемент <target> может быть целью ALIAS.
Примеры: события сборки
Событие POST_BUILD можно использовать для постобработки двоичного файла после компоновки. Например, следующий код:
add_executable(myExe myExe.c)
add_custom_command(
TARGET myExe POST_BUILD
COMMAND someHasher -i "$<TARGET_FILE:myExe>"
-o "$<TARGET_FILE:myExe>.hash"
VERBATIM)
запустит someHasher, чтобы создать файл .hash рядом с исполняемым файлом после компоновки.
Добавлено в версии 3.20: Для задания побочных продуктов для каждой конфигурации можно использовать выражения генератора. Например, следующий код:
add_library(myPlugin MODULE myPlugin.c)
add_custom_command(
TARGET myPlugin POST_BUILD
COMMAND someHasher -i "$<TARGET_FILE:myPlugin>"
--as-code "myPlugin-hash-$<CONFIG>.c"
BYPRODUCTS "myPlugin-hash-$<CONFIG>.c"
VERBATIM)
add_executable(myExe myExe.c "myPlugin-hash-$<CONFIG>.c")
запустит someHasher после компоновки myPlugin, например, чтобы создать файл .c с кодом для проверки хеша myPlugin, который исполняемый файл myExe может использовать для проверки перед загрузкой.
Ninja Multi-Config
Добавлено в версии 3.20: add_custom_command поддерживает возможности межконфигурационной сборки генератора Ninja Multi-Config. Дополнительные сведения см. в документации генератора.
См. также
© 2000–2026 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/latest/command/add_custom_command.html