【问题标题】:waf does not correctly detect C++ #include dependencieswaf 无法正确检测 C++ #include 依赖项
【发布时间】:2016-07-08 17:00:52
【问题描述】:

我在 waf 脚本中使用 bld.program() 的 includes=... 参数指定了 C++ 头文件依赖项。

我知道 waf 构建配置会看到包含,因为我的程序编译正确。

但是,当我更改头文件时,waf 不会检测到更改。也就是说,当我在更改包含的标头的内容后运行 waf build 时,不会重新编译任何内容。

waf 不应该自动确定#include "..." 依赖关系吗?

我该如何解决这个问题?

我查看了 build/c4che 目录,看看是否可以理解存储在那里的配置文件。在 waf 生成的 .py 文件中提到“include”是可疑的。

我使用的是 1.9.0 版的 waf。

我也用 waf 1.8.19 尝试过这个并得到了相同的结果。

编辑:我用下面列出的更简单的 wscript 替换了我原来的复杂 wscript,但我仍然得到相同的行为。

这是我的脚本:

top = '.'
out = 'build'
CXXFLAGS = ['-fopenmp', '-Wall', '-Werror', '-std=c++11', '-Wl,--no-as-needed']

def options(ctx):
    ctx.load('compiler_cxx')

def configure(ctx):
    ctx.load('compiler_cxx')
    ctx.env.CXXFLAGS = CXXFLAGS

def build(ctx):
    ctx.program(source="test_config_parser.cpp", target="test_config_parser", includes=["../include"], lib=['pthread', 'gomp'])

【问题讨论】:

  • 显然不是 C++ 问题。对于直接的 GNU make 构建系统,-M<x> 选项用于生成可以被 Makefile 包含的头依赖文件。
  • 我的断言是 waf 的问题,而不是 C++ 的问题。我不想使用 -MM 在 Makefile 中生成依赖项,这就是我使用 waf 的原因。
  • 我还不确定为什么您的示例不起作用,我正在尝试查看文档是否可以阐明。 waf.io/book/#_include_processing
  • @jsp 你的包含有什么奇怪的地方吗,它们是嵌套的吗?
  • @leetNightshade 不,我不这么认为。 wscript 位于 ./tests 中。 ./tests/test.cpp 包括 ./include/inc.h。 ./include/inc.h 仅包含标准头文件。

标签: waf


【解决方案1】:

您的问题是您使用了项目目录之外的包含。默认情况下,waf 不使用外部包含作为依赖项(如系统包含)来加快速度。我知道的解决方案:

1/ 组织你的项目,让你的包含目录在 waf 顶级目录下:

top_dir/
    wscript
    include/
        myinclude.h
    sources/
         mysource.cpp 

2/ 更改顶级目录。我认为top = .. 应该可以工作(未经测试)。

3/ 通过在build() 的开头添加这行来告诉 waf 绝对化:

waflib.Tools.c_preproc.go_absolute=True
waflib.Tools.c_preproc.standard_includes=[]

4/ 通过加载 gccdeps waf 模块来使用 gcc 依赖项。

解决方案 1/ 可能是最好的。

顺便说一句,我更喜欢将我的构建目录放在源代码树之外。如果您想在源代码树之外构建,请在 wscript 中使用 out = ../build

my2c

【讨论】:

  • waf book 的第 10.2.1 章清楚地显示了一个使用的标头示例,该标头与源不在同一目录中。我认为这是 includes 参数对 bld.program() 的目的。它说,“系统包含路径应​​在配置期间定义并添加到 INCLUDES 变量中”。
  • @jsp:是的。您可以在当前源目录之外使用包含。我所说的是,默认情况下,waf 不会将其顶级目录之外的文件视为已检查的依赖项。它通常旨在忽略系统包含依赖项。在您引用的 waf book 示例中,“..”目录是顶级目录,而不是在它之外。为了清楚起见,我编辑了我的答案。
  • 我现在明白了。我错误地认为 waf 会通过在 bld.program() 的包含参数中指定而将我的包含与系统包含区分开来。正如您在 1) 中建议的那样,我已将我的 wscript 移至顶层,并且 deps 现在按预期工作。感谢您的澄清。我接受了你的回答。
猜你喜欢
  • 2013-01-24
  • 2017-07-21
  • 1970-01-01
  • 2019-08-23
  • 2020-07-10
  • 1970-01-01
  • 2019-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多