我想运行一个解析整个源代码树的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
)
Run Code Online (Sandbox Code Playgroud)
这是输出:
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$
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,在第三次运行时它没有生成file1,即使之前触摸过file2.有时它会在每次第二次运行时发生,有时每隔三次运行一次 这是一个错误吗?有没有其他方法可以在cmake中运行没有任何依赖的命令?
奇怪但是如果我添加两个命令来重新触摸file2,即只是复制粘贴后构建命令,它可以正常工作.或者也许它会在每1000次运行失败,我还不确定;-)
ide*_*n42 13
虽然我对这个解决方案一点也不满意,但是我发现自从我偶然发现这个页面并没有看到它提到.
您可以添加引用丢失文件的自定义目标,
例如:
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
)
Run Code Online (Sandbox Code Playgroud)
这将继续运行自定义命令,因为__header.h找不到.
查看使用它的工作示例.
Int*_*ity 11
关于ideasman42的回答是创建一个带有空回声的虚拟输出.优点是您可以根据此虚拟输出具有多个自定义命令.
此外,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
)
Run Code Online (Sandbox Code Playgroud)
它cmake -E echo与cmake一样接近无操作.
我搜索完全相同,我终于找到了一个"notSoWorkaround"解决方案.
ADD_CUSTOM_TARGET(do_always ALL COMMAND yourCommandRegardlessOfAnyDependency)
Run Code Online (Sandbox Code Playgroud)
这会添加一个将在ALL之后运行的目标.由于自定义目标始终被视为过时,因此它将始终运行.
您可能需要DEPENDS yourA.out在构建后运行
我的来源:
这是我的解决方案。我添加了一个假库:
add_subdirectory(fake)
add_dependencies(${PROJECT_NAME} fake)
Run Code Online (Sandbox Code Playgroud)
我在那里这样做:
cmake_minimum_required (VERSION 2.6)
project(fake CXX)
add_library(${PROJECT_NAME} SHARED fake.cpp)
add_custom_command(TARGET fake
POST_BUILD
COMMAND ./mycommand.sh
COMMAND rm ${ROOT_BIN_DIR}/libfake.so
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我只是在构建后删除了 .so 文件,这会导致每次都重新构建 fake lib,并执行 POST_BUILD,并且所有这些都在主 PROJECT_NAME 之前,因为它依赖于 fake。
| 归档时间: |
|
| 查看次数: |
17619 次 |
| 最近记录: |