cmake add_custom_command发出多个输出文件

 Roger_丨8_8 发布于 2023-01-07 16:46

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

请参阅以下展示此行为的玩具示例.第一次调用make运行得很好.触摸后a.txt,Copying baz.cpp to baz2.cpp规则不会在第一次调用时执行make,而是在第二次调用时运行make.这意味着一次调用后构建仍然是陈旧的make.注意在改变输出的顺序,这个问题被固定add_custom_commandOUTPUT 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进行了测试.

在此先感谢您的帮助!

1 个回答
  • 这实际上是CMake 2.8.12.1中的一个错误.根据CMake人员的说法,第一个输出正在由Makefile生成器专门处理(但是,可能没有理由对它进行特殊处理).已经修复了CMake,并针对CMake 3.2.

    请参阅CMake错误报告:http://www.cmake.org/Bug/view.php?id = 15116

    2023-01-07 16:50 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有