Implicit Dependencies: The $CPPPATH Construction Variable

SCons User Guide 0.98.0
Prev | Chapter 6. Dependencies | Next

# 6.3. Implicit Dependencies: The `$CPPPATH` Construction Variable

Now suppose that our "Hello, World!" program actually has an `#include` line to include the `hello.h` file in the compilation:

           #include <hello.h>
           int
           main()
           {
               printf("Hello, %s!\n", string);
           }

And, for completeness, the `hello.h` file looks like this:

           #define string    "world"

In this case, we want SCons to recognize that, if the contents of the `hello.h` file change, the hello program must be recompiled. To do this, we need to modify the `SConstruct` file like so:

           Program('hello.c', CPPPATH = '.')

The `$CPPPATH` value tells SCons to look in the current directory (`'.'`) for any files included by C source files (`.c` or `.h` files). With this assignment in the `SConstruct` file:

           % scons -Q hello
           cc -o hello.o -c -I. hello.c
           cc -o hello hello.o
           % scons -Q hello
           scons: `hello' is up to date.
           % edit hello.h
               [CHANGE THE CONTENTS OF hello.h]
           % scons -Q hello
           cc -o hello.o -c -I. hello.c
           cc -o hello hello.o

First, notice that SCons added the `-I.` argument from the `$CPPPATH` variable so that the compilation would find the `hello.h` file in the local directory.

Second, realize that SCons knows that the hello program must be rebuilt because it scans the contents of the `hello.c` file for the `#include` lines that indicate another file is being included in the compilation. SCons records these as implicit dependencies of the target file, Consequently, when the `hello.h` file changes, SCons realizes that the `hello.c` file includes it, and rebuilds the resulting hello program that depends on both the `hello.c` and `hello.h` files.

Like the `$LIBPATH` variable, the `$CPPPATH` variable may be a list of directories, or a string separated by the system-specific path separation character (':' on POSIX/Linux, ';' on Windows). Either way, SCons creates the right command-line options so that the following example:

           Program('hello.c', CPPPATH = ['include', '/home/project/inc'])

Will look like this on POSIX or Linux:

           % scons -Q hello
           cc -o hello.o -c -Iinclude -I/home/project/inc hello.c
           cc -o hello hello.o

And like this on Windows:

           C:\>scons -Q hello.exe
           cl /nologo /Iinclude /I\home\project\inc /c hello.c /Fohello.obj
           link /nologo /OUT:hello.exe hello.obj

Prev | Home | Next
Older Functions for Deciding When an Input File Has Changed | Up | Caching Implicit Dependencies