我在使用add_custom_command
多个输出文件时注意到cmake中可能存在的错误行为.我已经能够将问题隔离到一个最小的例子(见下文).似乎当我在my中指定了两个输出文件时add_custom_command
,在某些情况下,第二个输出文件的上游依赖项没有被正确跟踪.该cmake的文件明确指出了多个输出文件是允许的.这里有趣的是,交换输出文件的顺序会导致不同的行为,这表明第一个OUTPUT
文件的处理方式不同.
请参阅以下展示此行为的玩具示例.第一次调用make运行得很好.触摸后a.txt
,Copying baz.cpp to baz2.cpp
规则不会在第一次调用时执行make
,而是在第二次调用时运行make
.这意味着一次调用后构建仍然是陈旧的make
.注意在改变输出的顺序,这个问题被固定add_custom_command
到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