我有一个关于CMake的问题,这似乎在这里常见,但没有一个答案似乎解决了我的问题.
在details子目录中,有一个CMakeLists.txt包含:
add_custom_command(OUTPUT part.out
COMMAND foo --input=part.src --output=part.out
DEPENDS part.src)
add_custom_target(part_out
DEPENDS part.out)
Run Code Online (Sandbox Code Playgroud)
在主目录中有一个CMakeLists.txt其使用part.out用于生成另一个文件:
add_custom_command(OUTPUT full.out
COMMAND bar --input=./details/part.out --output=full.out)
add_custom_target(full_out
DEPENDS full.out)
Run Code Online (Sandbox Code Playgroud)
问题是我想在这里发生三件事:
part.out不存在则需要生成part.out是过时的(part.src比新的更新part.out)我希望它被重新生成full.out是过时的(part.out比新的full.out,或者full.out不存在的话)我想要(重新)生成它因此,如果我添加DEPENDS ./details/part.out到add_custom_command(OUTPUT full.out)我将实现第2点和第3点,但不是第1点,因为如果我删除part.out然后我调用make full_out我将得到一个错误,没有规则要做./details/part.out(因为它是来自另一个目录的规则).
如果我添加DEPENDS full_out到add_custom_command(OUTPUT full.out)或者add_custom_target(full_out)我会实现点1和2,而不是3,因为即使part.out是再生一个full.out不会再生,因为它不依赖于part.out文件本身.
那么如何连接两种方案呢?我正在考虑添加两者,DEPENDS但我怎么知道这是否总能奏效?我的意思是在这种情况下,构建顺序在这里很重要.
Joh*_* S. 24
默认情况下,不依赖于自定义目标.使用ADD_DEPENDENCIES向其他目标添加依赖项或从其他目标添加依赖项.
所以我建议用"连接"目标
ADD_DEPENDENCIES( full_out part_out )
Run Code Online (Sandbox Code Playgroud)
编辑: 工作示例
事实证明,您需要为其设置源文件属性 part.out
这是我的工作示例(在使用VS2008的Windows下尝试过):
的CMakeLists.txt:
cmake_minimum_required(VERSION 2.8 )
project( full )
add_subdirectory( details )
add_custom_command( OUTPUT full.out
COMMAND ${CMAKE_COMMAND} -E copy ./details/part.out full.out
DEPENDS details/part.out
)
add_custom_target( full_out
DEPENDS full.out details/part.out details/part.src
)
set_source_files_properties( details/part.out PROPERTIES GENERATED TRUE )
add_dependencies( full_out part_out )
Run Code Online (Sandbox Code Playgroud)
细节/的CMakeLists.txt:
cmake_minimum_required(VERSION 2.8 )
project(part)
add_custom_command(OUTPUT part.out
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/part.src part.out
DEPENDS part.src)
add_custom_target(part_out
DEPENDS part.out)
Run Code Online (Sandbox Code Playgroud)
这个例子适用于所有3个陈述的案例.
| 归档时间: |
|
| 查看次数: |
25425 次 |
| 最近记录: |