with some simple code, seems that ccache ends up searching -I paths *before* $PWD when looking for files included as "file.h". seems the datestamps cause misbehavior in some way ? simple test code below. to reproduce, i checked out latest ccache code (5cdd7980895683613026967ac190c4a5bea196f3), then made a subdir in there called "foo" and added the code below to a shell script called "doit.sh". upon running `./doit.sh`, it caught the misbehavior -- the 2nd compile picked up y.h from the subdir "dir/" instead of the one in $PWD, so "STR" was defined to "B" instead of "C". if i remove the "touch" from the script, then things work as expected ... tested ccache-2.4 works, but ccache-3.0 and ccache-3.1.7 fail. a git bisect shows commit 702db98740f0a76998a03f6d7c043e7d5f94c8ae as the first bad one. #!/bin/bash rm -rf .ccache export CCACHE_DIR=$PWD/.ccache PATH=/usr/bin:$PATH c=$PWD/../ccache rm -rf t && mkdir t && cd t cat <<\EOF > y.c #include "y.h" main(){puts(STR);} EOF mkdir dir echo '#define STR "B"' > dir/y.h touch -d '2008-12-03 15:37' dir/y.h $c gcc -Idir -c y.c -o y.o $c gcc y.o -o y [[ $(./y) == "B" ]] echo '#define STR "C"' > y.h $c gcc -Idir -c y.c -o y.o $c gcc y.o -o y if [[ $(./y) != "C" ]] ; then echo "FAIL" exit 1 else echo "PASS" exit 0 fi
This has the same root cause as bug 8424: a design bug in the direct mode. It's not directly related to timestamps but rather to the way the direct mode works. The problem is that in the direct mode, ccache records header files that was used by the compiler, but it doesn't record header files that were not used but could have been used if they existed. So, when ccache checks if a result could be taken from the cache, it currently can't check if the existence of a new header file should invalidate the result. I can think of some ways of making the problem less likely, but I haven't found any good solution.
*** This bug has been marked as a duplicate of bug 8424 ***