【问题标题】:In CMake, how to run dependencies or targets in order?在 CMake 中,如何按顺序运行依赖项或目标?
【发布时间】:2020-03-07 07:53:33
【问题描述】:

我正在将我当前的 Makefile 项目迁移到 CMake,当一个规则可以按给定顺序执行多个规则时,我无法从 Makefile 实现类似的效果。假设我有四个规则:

  1. 全部
  2. 准备
  3. 程序

有时我想分别运行它们中的每一个,但我还想有另一个规则称为:release,它只是按特定顺序执行所有四个规则。这在 Makefile 中是微不足道的:

release: all prepare program lock

我曾在 CMake 中使用过 add_custom_target,我想出了以下内容:

add_custom_target(prepare
        COMMAND ...)

add_custom_target(program
        COMMAND ...)

add_custom_target(lock
        COMMAND ...)

add_custom_target(release DEPENDS ${TARGET} prepare program lock)

我希望 CMake 按顺序遍历依赖项,因此它应该构建我的目标,然后运行这三个附加目标。但是,它完全随机地运行它们。我知道创建add_dependencies 命令链的可能性,但这很难看,而且我也不想在独立目标之间创建不需要的依赖关系。

如何按顺序运行依赖项或至少通过一个命令执行我的自定义目标?

【问题讨论】:

  • 如果它们不相互依赖,为什么要它们按顺序运行?
  • 它们不依赖于项目或文件,但是,例如,如果我运行lock,那么我就不能再运行program 规则了。然而有时我想手动运行lock,以进行测试。我曾经调用make lock,这很好。
  • 可以使用例如构建自定义目标。 cmake --build . --target prepare.
  • 我不明白。在 makefile 中 release: all prepare program lock 也会并行运行它们。
  • @KamilCuk 这是一个例外,因为您手动告诉可以同时运行多少个作业。

标签: build cmake


【解决方案1】:

在 CMake 中,自定义目标可以有多个命令。与可以并行化的依赖不同,多个命令是按顺序运行的

来自文档(重点是我的):

COMMAND

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

所以要添加您的release 目标,您可以指定所有要运行的命令:

add_custom_target(release
    DEPENDS ${TARGET}
    COMMAND ...
    COMMAND ...
    COMMAND ...
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 2016-07-01
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多