我注意到在使用 cmake 时存在一些潜在的不正确行为add_custom_command
和多个输出文件。我已经能够将问题隔离到一个最小的示例(见下文)。看来当我在我的中指定了两个输出文件时add_custom_command
,在某些情况下,无法正确跟踪第二个输出文件的上游依赖项。这cmake 文档 http://www.cmake.org/cmake/help/v2.8.12/cmake.html#command%3aadd_custom_command明确提到允许多个输出文件。这里有趣的是,交换输出文件的顺序会导致不同的行为,这表明第一个OUTPUT
文件被区别对待。
请参阅下面展示此行为的玩具示例。第一次调用 make 运行得很好。触摸后a.txt
, the Copying baz.cpp to baz2.cpp
规则不会在第一次调用时执行make
,但在第二次调用时运行make
。这意味着在单次调用后构建仍然会过时make
。请注意,此问题可以通过更改输出顺序来解决add_custom_command
to OUTPUT baz.cpp bar.cpp
Example CMakeLists.txt:
cmake_minimum_required(VERSION 2.8)
add_library(mybaz baz.cpp)
add_custom_command(
OUTPUT baz2.cpp
COMMAND cp baz.cpp baz2.cpp
DEPENDS baz.cpp
COMMENT "Copying baz.cpp to baz2.cpp")
add_custom_target(mytarget
DEPENDS baz2.cpp
COMMENT "Running mytarget")
add_dependencies(mybaz mytarget)
add_custom_command(
OUTPUT bar.cpp baz.cpp
COMMAND cat a.txt > bar.cpp
COMMAND cat a.txt > baz.cpp
DEPENDS a.txt
COMMENT "Generating bar.cpp and baz.cpp")
以下是我运行的命令:
> touch a.txt
> cmake .
...snip... (configuration runs fine)
> make
Scanning dependencies of target mytarget
[ 20%] Generating bar.cpp and baz.cpp
[ 40%] Copying baz.cpp to baz2.cpp
[ 60%] Running mytarget
[ 60%] Built target mytarget
Scanning dependencies of target mybaz
[ 80%] Building CXX object CMakeFiles/mybaz.dir/baz.cpp.o
Linking CXX static library libmybaz.a
[100%] Built target mybaz
(everything looks good)
> touch a.txt
> make
[ 20%] Generating bar.cpp and baz.cpp
[ 40%] Running mytarget
[ 60%] Built target mytarget
Scanning dependencies of target mybaz
[ 80%] Building CXX object CMakeFiles/mybaz.dir/baz.cpp.o
Linking CXX static library libmybaz.a
[100%] Built target mybaz
(I seem to be missing the 'Copying baz.cpp to baz2.cpp' line)
> make
[ 20%] Copying baz.cpp to baz2.cpp
[ 40%] Running mytarget
[ 60%] Built target mytarget
[100%] Built target mybaz
( The 'Copying baz.cpp to baz2.cpp' executes this time )
这已经在 Linux 机器上使用 CMake 版本 2.8.12.2 进行了测试。
在此先感谢您的帮助!
这实际上是 CMake 2.8.12.1 中的一个错误。根据 CMake 人员的说法,第一个输出由 Makefile 生成器进行特殊处理(尽管可能没有理由对其进行特殊处理)。 CMake 已修复,目标是 CMake 3.2。
请参阅 CMake 错误报告:http://www.cmake.org/Bug/view.php?id=15116 http://www.cmake.org/Bug/view.php?id=15116
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)