我有一个关于 CMake 的问题,这似乎是这里常见的问题,但没有一个答案似乎能解决我的问题。
In the 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)
问题是我希望这里发生三件事:
- if
part.out
不存在,需要生成
- if
part.out
已过期 (part.src
比part.out
)我想让它重新生成
- if
full.out
已过期 (part.out
比full.out
, or full.out
不存在)我希望它是(重新生成
所以如果我添加DEPENDS ./details/part.out
to add_custom_command(OUTPUT full.out)
我将实现第 2 点和第 3 点,但不会实现第 1 点,因为如果我删除part.out
然后我打电话make full_out
我会收到一个错误,提示没有规则可制定./details/part.out
(因为它是来自另一个目录的规则)。
如果我添加DEPENDS full_out
to add_custom_command(OUTPUT full.out)
or to add_custom_target(full_out)
我会实现第 1 点和第 2 点,但不会实现第 3 点,因为即使part.out
被再生了,一个full.out
不会被重新生成,因为它不依赖于part.out
文件本身。
那么如何连接这两个场景呢?
我正在考虑添加两者DEPENDS
但我怎么知道这是否永远有效?我的意思是在这种情况下,构建的顺序在这里很重要。
CMake 文档用于add_custom_target http://www.cmake.org/cmake/help/v2.8.8/cmake.html#command:add_custom_target:
默认情况下,没有任何内容取决于自定义目标。使用ADD_DEPENDENCIES
添加与其他目标的依赖关系。
所以我建议将目标“连接”
ADD_DEPENDENCIES( full_out part_out )
EDIT:
工作示例
事实证明,您需要设置源文件属性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 个案例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)