[Bug preprocessor/14238] New: Dependency tracking and PCH
carlo at gcc dot gnu dot org
gcc-bugzilla@gcc.gnu.org
Sat Feb 21 17:24:00 GMT 2004
As automake generates, the usual way to create
automatic dependencies is by adding something like
-MD -MP -MT a.o -MF a.deps
to the normal compilation line, giving the benefit
of gcc's one-pass compile + make depend.
If we use PCH, one might need a compilation like:
g++ -include pch.h -c a.cc
and thus end up with doing:
g++ -include pch.h -c a.cc -MD -MP -MT a.o -MF a.deps
Often, the PCH (pch.h in this case) contains a LOT of header files,
and we don't want to recompile every compilation unit when we
touch a single header, even when all source files are including
this pch.h. So, correctly, the dependency tracking is ignoring both
pch.h and whatever it includes.
The real dependency information is therefore gathered from
the #include's inside a.cc. And here is the problem, when a.cc
does include "a.h", then this is recorded - but when a.h uses the
usual inclusion gard macros, and it is including "a2.h", then we
don't see that back in the output to a.deps! After all, the pre-
processor thinks that gard macro of a.h is defined (which is the
case because a.h was included before from pch.h) and there does
not process the #include's in a.h for the same of dependency
tracking.
I've included a simple test case that demonstrates this.
Please untar and execute the commands:
make depend-pch
cat a.deps
The output will be:
a.o: a.cc a.h
a.h:
Compare this with:
>make depend-nopch
g++-cvs-3.4 -c a.cc -MD -MP -MT a.o -MF a.deps
g++-cvs-3.4 -c b.cc -MD -MP -MT b.o -MF b.deps
>cat a.deps
a.o: a.cc a.h a2.h
a.h:
a2.h:
--
Summary: Dependency tracking and PCH
Product: gcc
Version: 3.5.0
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: preprocessor
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: carlo at gcc dot gnu dot org
CC: gcc-bugs at gcc dot gnu dot org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=14238
More information about the Gcc-bugs
mailing list