在 CMake 中默认构建自定义目标

Posted

技术标签:

【中文标题】在 CMake 中默认构建自定义目标【英文标题】:Build custom target by default in CMake 【发布时间】:2017-05-10 07:09:22 【问题描述】:

我想用 cmake 运行一个自定义命令。这听起来像是一个非常简单的任务/问题,但很难找到一个例子。

这是我正在尝试做的事情:

$ cmake .
$ make
> Hello World! (Output)

在 Gnu 中制作非常简单:

bar: 
        echo Hello World!

但我正在尝试在 cmake 中执行此操作。根据我一直在阅读的内容,我应该可以使用下面的 CMakeLists.txt 文件来做到这一点:

cmake_minimum_required(VERSION 3.6)
project(foo)
add_custom_target(bar)
add_custom_command(
  TARGET   bar
  COMMAND  "echo Hello World!"
)

如果我只是打电话给make,目前没有工作要做。我需要明确调用make bar。如何将bar 添加到all 配方?

我尝试添加add_dependency(foo bar),但foo 是不存在的目标。如果有一些我不知道的超级目标,那将是完美的。然后我可以将它用作我的自定义命令的目标,而不用打扰bar

【问题讨论】:

【参考方案1】:

使用ALL 选项构建目标默认

add_custom_target(bar ALL)

【讨论】:

哇,这比我想做的要简单得多。【参考方案2】:

当自定义命令实际产生一些东西时,而不是只打印“Hello World”,那么以下可能是合适的。

add_custom_target(Work ALL DEPENDS that.txt)

add_custom_command(
    OUTPUT   that.txt
    COMMAND  generator --from this.txt --produce that.txt
    DEPENDS  this.txt
)

【讨论】:

这很好用。如果另一个目标依赖于该自定义目标(即add_dependencies($PROJECT_NAME Work)),您也不需要ALL【参考方案3】:

扩展 Tsyvarev 的完美答案,进一步简化 cmakelists.txt 文件,我们可以这样做:

cmake_minimum_required(VERSION 3.6)
project(foo)
add_custom_target(bar ALL
  COMMAND  "echo Hello World!"
)

这会将 custom_command 集成到 custom_target 中。

【讨论】:

以上是关于在 CMake 中默认构建自定义目标的主要内容,如果未能解决你的问题,请参考以下文章

CMake基础教程(30)CMake构建系统概览

CMake 的默认构建目标的名称是啥?

用于自定义调试构建的 CMake qt 输入库后缀

CMake:如何添加仅针对一种配置执行的自定义命令?

在自定义目标运行后重建依赖目标

尽管没有更改任何来源,但 CMake 会重建自定义目标 [重复]