add_custom_target

添加一个没有输出的目标,因此它将始终被构建。

add_custom_target(Name [ALL] [command1 [args1...]]
                  [COMMAND command2 [args2...] ...]
                  [DEPENDS depend depend depend ... ]
                  [BYPRODUCTS [files...]]
                  [WORKING_DIRECTORY dir]
                  [COMMENT comment]
                  [JOB_POOL job_pool]
                  [JOB_SERVER_AWARE <bool>]
                  [VERBATIM] [USES_TERMINAL]
                  [COMMAND_EXPAND_LISTS]
                  [SOURCES src1 [src2...]])

添加一个具有给定名称的目标,该目标执行给定的命令。该目标没有输出文件,并且始终被视为已过期,即使命令尝试创建与目标名称相同的名称的文件。使用add_custom_command()命令生成具有依赖项的文件。默认情况下,没有任何内容依赖于自定义目标。使用add_dependencies()命令添加对其他目标的依赖项或来自其他目标的依赖项。

选项为

ALL

指示此目标应添加到默认构建目标中,以便每次运行它(该命令不能称为ALL)。

BYPRODUCTS

在版本 3.2 中添加。

指定命令预期生成的但其修改时间在后续构建中可能更新也可能不更新的文件。如果副产品名称是相对路径,它将相对于对应于当前源目录的构建树目录进行解释。每个副产品文件都将自动标记为GENERATED源文件属性。

请参阅策略CMP0058以了解此功能背后的动机。

副产品的显式规范由Ninja生成器支持,以告知ninja构建工具如何在副产品丢失时重新生成副产品。当其他构建规则(例如自定义命令)依赖于副产品时,它也很有用。Ninja 要求任何其他规则依赖的任何生成的文件都有一个构建规则,即使存在顺序依赖项以确保副产品在依赖项构建之前可用。

Makefile 生成器将在make clean期间删除BYPRODUCTS和其他GENERATED文件。

在版本 3.20 中添加: BYPRODUCTS的参数可以使用generator expressions的受限集。目标相关的表达式不允许使用。

在版本 3.28 中更改: 在使用文件集的自定义目标中,副产品现在被认为是私有的,除非它们列在非私有文件集中。请参阅策略CMP0154

COMMAND

指定在构建时执行的命令行。如果指定了多个COMMAND,则它们将按顺序执行,但不一定组成一个有状态的 shell 或批处理脚本。(要运行完整的脚本,请使用configure_file()命令或file(GENERATE)命令来创建它,然后指定一个COMMAND来启动它。)

如果COMMAND指定了一个可执行目标名称(由add_executable()命令创建),它将自动替换为构建时创建的可执行文件的路径,如果以下任一条件为真

  • 目标未被交叉编译(即CMAKE_CROSSCOMPILING变量未设置为 true)。

  • 在版本 3.6 中添加: 目标正在被交叉编译并且提供了模拟器(即其CROSSCOMPILING_EMULATOR目标属性已设置)。在这种情况下,CROSSCOMPILING_EMULATOR的内容将在目标可执行文件的路径之前添加到命令中。

如果上述两个条件都不满足,则假定命令名称是在构建时在PATH上找到的程序。

COMMAND的参数可以使用generator expressions。使用TARGET_FILE生成器表达式来引用命令行中稍后出现目标的位置(即作为命令参数而不是要执行的命令)。

每当以下基于目标的生成器表达式之一用作要执行的命令或在命令参数中提及时,将自动添加目标级依赖项,以便在构建此自定义目标之前构建提到的目标(请参阅策略CMP0112)。

  • TARGET_FILE

  • TARGET_LINKER_FILE

  • TARGET_SONAME_FILE

  • TARGET_PDB_FILE

命令和参数是可选的,如果未指定,则将创建一个空目标。

COMMENT

在构建时执行命令之前显示给定的消息。

在版本 3.26 中添加: COMMENT的参数可以使用generator expressions

DEPENDS

引用同一目录中使用add_custom_command()命令调用创建的文件和自定义命令的输出(CMakeLists.txt文件)。当构建目标时,它们将被更新。

在版本 3.16 中更改: 如果任何依赖项是同一目录中目标或其任何构建事件的副产品,则会添加目标级依赖项,以确保副产品在构建此目标之前可用。

使用add_dependencies()命令添加对其他目标的依赖项。

COMMAND_EXPAND_LISTS

在版本 3.8 中添加。

COMMAND参数中的列表将被展开,包括使用generator expressions创建的列表,允许COMMAND参数(例如${CC} "-I$<JOIN:$<TARGET_PROPERTY:foo,INCLUDE_DIRECTORIES>,;-I>" foo.cc)被正确展开。

JOB_POOL

在版本 3.15 中添加。

poolNinja生成器指定一个Ninja。与USES_TERMINAL不兼容,后者暗示console池。使用JOB_POOLS未定义的池会导致构建时 ninja 出错。

JOB_SERVER_AWARE

在版本 3.28 中添加。

指定该命令是 GNU Make 作业服务器感知的。

对于Unix MakefilesMSYS MakefilesMinGW Makefiles生成器,这将向指令行添加+前缀。有关更多信息,请参阅GNU Make 文档

其他生成器会静默忽略此选项。

SOURCES

指定要包含在自定义目标中的其他源文件。即使指定源文件没有构建规则,也会将其添加到 IDE 项目文件中,方便编辑。

VERBATIM

构建工具将对命令的所有参数进行适当的转义,以便调用的命令接收每个参数不变。请注意,即使add_custom_target看到参数之前,CMake 语言处理器也会使用一层转义。建议使用VERBATIM,因为它可以实现正确的行为。当未给出VERBATIM时,行为是特定于平台的,因为没有对特定于工具的特殊字符进行保护。

USES_TERMINAL

在版本 3.2 中添加。

如果可能,命令将直接访问终端。使用Ninja生成器时,这会将命令置于console pool中。

WORKING_DIRECTORY

使用给定的当前工作目录执行命令。如果它是相对路径,则将相对于对应于当前源目录的构建树目录进行解释。

版本 3.13 中新增: WORKING_DIRECTORY 的参数可以使用generator expressions

Ninja 多配置

版本 3.20 中新增: add_custom_target 支持Ninja Multi-Config生成器的跨配置功能。有关更多信息,请参阅生成器文档。

另请参阅