Search code examples
waf

waf does not correctly detect C++ #include dependencies


I have C++ header file dependencies that I specify in my waf script with the includes=... parameter to bld.program().

I know the waf build configuration sees the includes because my program compiles correctly.

However, when I change a header file, waf does not detect the change. That is, when I run waf build after changing the contents of an included header, nothing gets recompiled.

Isn't waf supposed to determine #include "..." dependencies automatically?

How can I troubleshoot this?

I have looked in the build/c4che directory to see if I could make sense of the configuration files stored there. Mention of "include" in the waf generated .py files is suspiciously absent.

I am using waf version 1.9.0.

I have also tried this with waf 1.8.19 and got the same result.

EDIT: I replaced my original complicated wscript with the much simpler one listed below, and I still get the same behavior.

Here is my 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'])

Solution

  • Your problem is that you use includes out of the project's directory. By default waf does not use external includes as dependencies (like system includes) to speed up things. Solutions I know of :

    1/ Organize your project to have your include directory under the waf top directory :

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

    2/ Change top directory. I think top = .. should work (not tested).

    3/ Tell waf to go absolute by adding this lines at the beginning of build():

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

    4/ Use gcc dependencies by loading the gccdeps waf module.

    Solution 1/ is probably the best.

    By the way I prefer to have my build directory out of the source tree. Use out = ../build in your wscript, if you want to build out of the source tree.

    my2c