如何在构建时始终运行命令而不管任何依赖关系?
我想运行一个解析整个源代码树的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
才能运行
我的来源:
上一篇: How to always run command when building regardless of any dependency?