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]
[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 Generators удалят
BYPRODUCTSи другие файлыGENERATEDво времяmake clean.Этот ключевое слово нельзя использовать с
APPEND(см. политикуCMP0175). Все побочные продукты должны быть заданы в первом вызовеadd_custom_command(OUTPUT...)для файлов вывода.Добавлена в версии 3.20: Аргументы к
BYPRODUCTSмогут использовать ограниченный наборgenerator expressions. Зависимые от целей выражения не допускаются.Изменено в версии 3.28: В целях, использующих Наборы файлов, побочные продукты пользовательских команд теперь считаются закрытыми, если они не указаны в наборе файлов, не являющихся закрытыми. См. политику
CMP0154. -
COMMAND -
Укажите командную строку(и) для выполнения во время сборки. Обычно указывается по крайней мере одна
COMMAND, но некоторые шаблоны могут её опустить, например, добавление команд в отдельных вызовах с использованиемAPPEND.Если указано более одной
COMMAND, они будут выполняться в порядке, но не обязательно будут объединены в состояние shell или пакетный скрипт. Для выполнения полного скрипта используйте команду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()), создаётся зависимость на уровне цели, чтобы убедиться, что цель построена перед любой целью, использующей эту пользовательскую команду. Кроме того, если цель — исполняемый файл или библиотека, создаётся зависимость на уровне файла, чтобы заставить пользовательскую команду перевыполняться всякий раз, когда цель перекомпилируется. - Если аргумент — абсолютный путь, создаётся зависимость на уровне файла от этого пути.
- Если аргумент — имя файла исходного кода, добавленного в цель или для которого задано свойство исходного файла, создаётся зависимость на уровне файла от этого файла исходного кода.
- Если аргумент — относительный путь и он существует в текущем каталоге исходных данных, создаётся зависимость на уровне файла от этого файла в текущем каталоге исходных данных.
- В противном случае, создаётся зависимость на уровне файла от этого пути относительно текущего каталога двоичных файлов.
Если какая-либо зависимость является
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это помещает команду вconsoleпул задачpool.Этот ключевое слово не может быть использовано с
APPEND(см. политикуCMP0175). Если добавленные команды нуждаются в доступе к терминалу, это должно быть установлено при первом вызовеadd_custom_command(OUTPUT...)для выходных файлов. -
VERBATIM -
Все аргументы команд будут правильно экранированы для инструмента сборки, чтобы вызываемая команда получала каждый аргумент без изменений. Обратите внимание, что один уровень экранирования все еще используется процессором языка CMake перед тем, как add_custom_command даже увидит аргументы. Рекомендуется использовать
VERBATIM, так как это обеспечивает правильное поведение. КогдаVERBATIMне задано, поведение зависит от платформы, так как нет защиты от специальных символов, специфичных для инструмента.Это ключевое слово не может быть использовано с
APPEND(см. политикуCMP0175). Если добавленные команды должны обрабатываться какVERBATIM, это должно быть установлено при первом вызовеadd_custom_command(OUTPUT...)для выходных файлов. -
WORKING_DIRECTORY -
Выполнить команду с заданным текущим каталогом. Если это относительный путь, он будет интерпретироваться относительно каталога сборки, соответствующего текущему каталогу исходных файлов.
Этот параметр в настоящее время игнорируется, если указан
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.
Примечание
DEPFILEне может быть указан одновременно с параметромIMPLICIT_DEPENDSдля Генераторов Makefile.Добавлена в версии 3.21: Добавлена поддержка Генераторов Visual Studio с VS 2012 и выше, и для генератора
Xcode. Также добавлена поддержкаgenerator expressions.Добавлена в версии 3.29: Генераторы Ninja теперь будут включать зависимости в базу данных "журнала зависимостей", если файл не указан в
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 будет рассматривать зависимости этого целевого объекта как неявные зависимости для пользовательской команды в случае, если эта пользовательская команда требует файлов, неявно созданных этими целевыми объектами.
Этот параметр можно включить для всех пользовательских команд, установив CMAKE_ADD_CUSTOM_COMMAND_DEPENDS_EXPLICIT_ONLY в ON.
Этот ключевой параметр нельзя использовать с 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
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–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/latest/command/add_custom_command.html