如何在构建时始终运行命令而不管任何依赖关系?

我想运行一个解析整个源代码树的cmake命令,所以我不能在cmake的add_custom_command / add_custom_target命令中列出所有可能的依赖关系。

是否可以告诉cmake只是为了在没有任何条件的情况下运行命令? 我尝试了网上找到的所有解决方案(包括SO),但他们都假设该命令依赖于少数已知文件是最新的。

我找到了一个解决方案,但它不能可靠地工作:

cmake_minimum_required(VERSION 2.6)

project(main)

add_custom_command(
   OUTPUT file1
   COMMAND echo touching file1
   COMMAND touch file1
   DEPENDS file2)
add_custom_target(dep ALL DEPENDS file1 file2)

# this command re-touches file2 after dep target is "built"
# and thus forces its rebuild
ADD_CUSTOM_COMMAND(TARGET dep
          POST_BUILD
          COMMAND echo touching file2
          COMMAND touch file2
)

这是输出:

queen3@queen3-home:~/testlib$ make
[100%] Generating file1
touching file1
touching file2
[100%] Built target dep
queen3@queen3-home:~/testlib$ make
[100%] Generating file1
touching file1
touching file2
[100%] Built target dep
queen3@queen3-home:~/testlib$ make
touching file2
[100%] Built target dep
queen3@queen3-home:~/testlib$ 

正如你所看到的,在第三次运行时,它不会生成file1,即使先前已经触摸过file2。 有时候会发生在第二轮比赛中,有时候每三分钟一次,有时候每四分钟一次。 这是一个错误吗? 有没有另一种方式来运行一个命令,而不依赖于cmake?

奇怪,但如果我添加两个命令重新触摸file2,即只复制粘贴后生成命令,它可靠地工作。 或者,也许它每1000次运行都会失败,我还不确定;-)


ideasman42答案的一个转折是创建一个带有空echo语句的虚拟输出。 优点是可以有多个自定义命令依赖于这个虚拟输出。

此外,cmake构建系统将知道您的自定义命令的输出文件是什么,以便可以正确解析对该输出的任何依赖关系。

# Custom target will always cause its dependencies to be evaluated and is
# run by default
add_custom_target(dummy_target ALL
    DEPENDS
        custom_output
    )

# custom_output will always be rebuilt because it depends on always_rebuild
add_custom_command(
    OUTPUT custom_output
    COMMAND command_that_produces_custom_output
    DEPENDS
        always_rebuild
    )

# Dummy output which is never actually produced. Anything that depends on
# this will always be rebuilt.
add_custom_command(
    OUTPUT always_rebuild
    COMMAND cmake -E echo
    )

cmake -E echo一样, cmake -E echo与no-op差不多。


虽然我对这个解决方案并不满意,但是因为我在这个页面上偶然发现,并没有看到它提到。

您可以添加引用缺失文件的自定义目标,

例如:

add_custom_target(
    my_custom_target_that_always_runs ALL
    DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/__header.h
    )

add_custom_command(
    OUTPUT
        ${CMAKE_CURRENT_BINARY_DIR}/__header.h  # fake! ensure we run!
        ${CMAKE_CURRENT_BINARY_DIR}/header.h    # real header, we write.
    # this command must generate: ${CMAKE_CURRENT_BINARY_DIR}/header.h
    COMMAND some_command
    )

这将继续运行自定义命令,因为__header.h

看到一个使用它的工作示例。


我搜索完全一样,我终于找到了一个“notSoWorkaround”解决方案。

ADD_CUSTOM_TARGET(do_always ALL COMMAND yourCommandRegardlessOfAnyDependency)

这增加了一个将在ALL之后运行的目标。 由于自定义目标始终被认为已过时,它将始终运行。

构建完成后,您可能需要DEPENDS yourA.out才能运行

我的来源:

  • cmake文档
  • 这个问题的邮件列表答案
  • 链接地址: http://www.djcxy.com/p/31875.html

    上一篇: How to always run command when building regardless of any dependency?

    下一篇: Using cmake with a custom file generator