【问题标题】:How to prevent Waf from renaming object files?如何防止 Waf 重命名目标文件?
【发布时间】:2012-08-09 19:06:00
【问题描述】:

我正在使用 Waf 构建一个 C 项目,并使用 gcov 进行一些测试代码覆盖。但是,Waf 调用 gcc 的方式会从源文件 foo.c 生成 foo.c.1.o,这会在搜索生成的文件时混淆 gcov

$ gcov foo.c
$ foo.gcno:cannot open graph file

幸运的是,gcov 具有-o 选项,可以使用它指定相应的目标文件。尽管如此,这并不方便并且执行lcov 仍然失败。因此,我的问题是:

  1. Waf 为什么要重命名目标文件?
  2. 如何禁用此行为或...
  3. gcov/lcov 如何解决此问题?

【问题讨论】:

    标签: c gcov waf


    【解决方案1】:

    您是否尝试过使用类似的方式修改 Waf 的配置

    bld.program(
      obj_ext  = '.o',
      source   = 'test.c',
      target   = 'test1')
    

    【讨论】:

    • 无论如何,来自 Waf 的 F.A.Q:Q: why does foo.cpp compile to foo.cpp.<n>.o where <n> is some number? A: else the same files might be compiled in different contexts and overwritten
    • 不幸的是,添加 obj_ext 并没有帮助。但是感谢您指出常见问题解答中令人不满意的解释(我想知道为什么他们没有在 Waf 书中包含这些重要信息)。
    【解决方案2】:

    您可以使用gcovr,而不是直接运行gcov

    gcovr 不依赖文件名魔术,而是解析gcov 的覆盖文件。
    然后它使用适当的参数调用gcov
    这非常适合 Waf 的目标文件重命名。

    您可以从 Waf 的 build 子目录运行 gcovr

    cd build
    gcovr --root=$(pwd) --keep
    lcov --capture --directory $(pwd) --base-directory $(pwd) --output-file coverage.info
    genhtml coverage.info --output-directory out
    

    --root 选项删除当前目录前缀
    --keep 选项保留gcov 的临时文件,供lcov/genhtml 使用。

    您还可以使用gcovr--xml 选项生成Cobertura 兼容的xml 输出。
    然后它可以被各种格式化程序使用(我将它与 Jenkins 的 Cobertura Plugin 一起使用)

    【讨论】:

    • 尽管有明确的答案,但要开始工作真的很棘手。显然 gcovr 的主版本中有一个错误,导致它读取 --root 参数的每个字符作为列表中的单独路径。因此,鉴于 $(pwd) 以 '/' 开头,它首先在整个文件系统中搜索 .gcno 文件并挂起。我更改了第 1828 行,它调用 get_datafiles 来传递“[options.root]”并让它工作。
    • @flodin gcovr 3.2 中修复了“[options.root]”错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 2017-11-10
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多