我有一个关于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)
在主目录中有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
不存在),我希望(重新)生成{ LI>
醇>
因此,如果我将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
,也会{ {1}}将不会重新生成,因为它不依赖于full.out
文件本身。
那么如何连接两种方案呢?
我正考虑添加两个part.out
,但我怎么知道这是否一直有效?我的意思是在这种情况下,构建的顺序在这里很重要。
答案 0 :(得分:24)
CMake docs for add_custom_target
:
默认情况下,没有任何内容取决于自定义目标。使用ADD_DEPENDENCIES 向其他目标添加依赖关系。
所以我建议用
“连接”目标ADD_DEPENDENCIES( full_out part_out )
编辑: 工作示例
事实证明,您需要为part.out
这是我的工作示例(在Windows下使用VS2008尝试过):
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个案例。