在详细信息子目录中,有一个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)
在主目录中有一个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)
问题是我想在这里发生三件事:
>如果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,但我怎么知道这是否总是有效?我的意思是在这种情况下,构建顺序在这里很重要.
add_custom_target
:
By default nothing depends on the custom target. Use ADD_DEPENDENCIES
to add dependencies to or from other targets.
所以我建议用目标“连接”目标
ADD_DEPENDENCIES( full_out 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 )
细节/的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)
这个例子适用于所有3个陈述的案例.