c++ - 多个输出文件的 cmake add_custom_command 问题

标签 c++ cmake

在使用 add_custom_command 和多个输出文件时,我注意到 cmake 中存在一些潜在的不正确行为。我已经能够将问题隔离为一个最小的例子(见下文)。似乎当我在 add_custom_command 中指定了两个输出文件时,在某些情况下,第二个输出文件的上游依赖项没有被正确跟踪。 cmake documentation明确提到允许多个输出文件。这里有趣的是,交换输出文件的顺序会导致不同的行为,这表明第一个 OUTPUT 文件的处理方式不同。

请参阅下面展示此行为的玩具示例。第一次调用 make 运行良好。触摸 a.txt 后,Copying baz.cpp to baz2.cpp 规则不会在第一次调用 make 时执行,而是运行在第二次调用 make 时。这意味着在一次调用 make 之后,构建仍然会过时。请注意,通过将 add_custom_command 中的输出顺序更改为 OUTPUT baz.cpp bar.cpp

可以解决此问题

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

关于c++ - 多个输出文件的 cmake add_custom_command 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24416133/

相关文章:

c++ - 在 pkg-config 搜索路径中找不到包 webkitgtk-3.0

python - Cmake - 使用 OpenCV 生成共享库

qt - 安静的 clang

c++ - 为什么我在 build 目录中新建的共享库与 install 目录中的拷贝相比具有不同的依赖集?

cmake - CMake 中的 bool 变量取反?

javascript - XPCOM C++多线程和javascript回调

c++ - C++ 函数参数中的求值顺序

c++ - OpenGL渲染黑色方 block

visual-studio - 如何使用cmake检测64位MSVC?

c++ - 模板元编程与经典名称重载相结合