waf 未正确检测 C++ #include 依赖项

waf does not correctly detect C++ #include dependencies

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

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

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

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'])

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

1/ 组织您的项目,将您的 include 目录放在 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