--- /dev/null
+SUITE_depend_different_headers_SETUP() {
+ unset CCACHE_NODIRECT
+
+ BASEDIR=`pwd`
+ BASEDIR1="${BASEDIR}/test/dir1/"
+ BASEDIR2="${BASEDIR}/test/dir2/"
+ BASEDIR3="${BASEDIR}/test/dir3/"
+ BASEDIR4="${BASEDIR}/test/dir4/"
+
+ mkdir -p ${BASEDIR1} ${BASEDIR2} ${BASEDIR3} ${BASEDIR4}
+
+ cat <<EOF >${BASEDIR1}/test.c
+#include "header.h"
+#include <stdio.h>
+
+void test(){
+#ifdef CHANGE_THAT_AFFECTS_OBJECT_FILE
+printf("with change");
+#else
+printf("no change");
+#endif
+}
+EOF
+ cp -f "${BASEDIR1}/test.c" ${BASEDIR2}
+ cp -f "${BASEDIR1}/test.c" ${BASEDIR3}
+ cp -f "${BASEDIR1}/test.c" ${BASEDIR4}
+
+ cat <<EOF >"${BASEDIR1}/header.h"
+void test();
+EOF
+
+ cat <<EOF >"${BASEDIR2}/header.h"
+#define CHANGE_THAT_AFFECTS_OBJECT_FILE
+void test();
+EOF
+
+ cat <<EOF >"${BASEDIR3}/header.h"
+#define CHANGE_THAT_DOES_NOT_AFFECT_OBJECT_FILE
+void test();
+EOF
+
+ cat <<EOF >"${BASEDIR4}/header.h"
+#include "header2.h"
+void test();
+EOF
+ cat <<EOF >"${BASEDIR4}/header2.h"
+static void some_function(){};
+EOF
+
+ backdate "${BASEDIR1}/header.h" "${BASEDIR1}/test.c"
+ backdate "${BASEDIR2}/header.h" "${BASEDIR2}/test.c"
+ backdate "${BASEDIR3}/header.h" "${BASEDIR3}/test.c"
+ backdate "${BASEDIR4}/header.h" "${BASEDIR4}/test.c" "${BASEDIR4}/header2.h"
+
+ DEPFLAGS="-MD -MF test.d"
+}
+
+generate_reference_compiler_output() {
+ rm -f *.o *.d
+ ${REAL_COMPILER} ${DEPFLAGS} -c -o test.o test.c
+ mv test.o reference_test.o
+ mv test.d reference_test.d
+}
+
+SUITE_depend_different_headers() {
+ # This test case covers a case in depend mode with unchanged source file between compilations,
+ # but with changed headers. Header contents do not affect the common hash (by which .manifest
+ # is stored in cache), only the object's hash.
+ #
+ # dir1 is baseline
+ # dir2 has a change in header which affects object file
+ # dir3 has a change in header which does not affect object file
+ # dir4 has an additional include header which should change the dependency file
+ # -------------------------------------------------------------------------
+ TEST "Depend mode - test unique sets of headers for the same source code"
+
+ # Compile dir1
+ cd ${BASEDIR1}
+
+ generate_reference_compiler_output
+ CCACHE_DEPEND=1 CCACHE_BASEDIR=${BASEDIR1} $CCACHE_COMPILE $DEPFLAGS -c test.c
+ expect_equal_object_files reference_test.o test.o
+ expect_equal_files reference_test.d test.d
+ expect_stat 'cache hit (direct)' 0
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+ expect_stat 'files in cache' 3 # .o + .manifest + .d
+
+ # Recompile dir1 - 1st time
+ generate_reference_compiler_output
+ CCACHE_DEPEND=1 CCACHE_BASEDIR=${BASEDIR1} $CCACHE_COMPILE $DEPFLAGS -c test.c
+ expect_equal_object_files reference_test.o test.o
+ expect_equal_files reference_test.d test.d
+ expect_stat 'cache hit (direct)' 1
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 1
+ expect_stat 'files in cache' 3
+
+ # Compile dir2
+ # dir2 header changes the object file compared to dir1
+ cd ${BASEDIR2}
+ generate_reference_compiler_output
+ CCACHE_DEPEND=1 CCACHE_BASEDIR=${BASEDIR2} $CCACHE_COMPILE $DEPFLAGS -c test.c
+ expect_equal_object_files reference_test.o test.o
+ expect_equal_files reference_test.d test.d
+ expect_stat 'cache hit (direct)' 1
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 2
+ expect_stat 'files in cache' 5 # 2x .o, 2x .d, 1x manifest
+
+ # Compile dir3
+ # dir3 header change does not change object file compared to dir1, but ccache still adds
+ # additional .o/.d file in the cache due to different contents of the header file
+ cd ${BASEDIR3}
+ generate_reference_compiler_output
+ CCACHE_DEPEND=1 CCACHE_BASEDIR=${BASEDIR3} $CCACHE_COMPILE $DEPFLAGS -c test.c
+ expect_equal_object_files reference_test.o test.o
+ expect_equal_files reference_test.d test.d
+ expect_stat 'cache hit (direct)' 1
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 3
+ expect_stat 'files in cache' 7 # 3x .o, 3x .d, 1x manifest
+
+ # Compile dir4
+ # dir4 header adds a new dependency
+ cd ${BASEDIR4}
+ generate_reference_compiler_output
+ CCACHE_DEPEND=1 CCACHE_BASEDIR=${BASEDIR4} $CCACHE_COMPILE $DEPFLAGS -c test.c
+ expect_equal_object_files reference_test.o test.o
+ expect_equal_files reference_test.d test.d
+ expect_different_files reference_test.d ${BASEDIR1}/test.d
+ expect_stat 'cache hit (direct)' 1
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 4
+ expect_stat 'files in cache' 9 # 4x .o, 4x .d, 1x manifest
+
+ # Recompile dir1 - 2nd time
+ cd ${BASEDIR1}
+ generate_reference_compiler_output
+ CCACHE_DEPEND=1 CCACHE_BASEDIR=${BASEDIR1} $CCACHE_COMPILE $DEPFLAGS -c test.c
+ expect_equal_object_files reference_test.o test.o
+ expect_equal_files reference_test.d test.d
+ expect_stat 'cache hit (direct)' 2
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 4
+ expect_stat 'files in cache' 9
+
+ # Recompile dir2
+ cd ${BASEDIR2}
+ generate_reference_compiler_output
+ CCACHE_DEPEND=1 CCACHE_BASEDIR=${BASEDIR2} $CCACHE_COMPILE $DEPFLAGS -c test.c
+ expect_equal_object_files test.o test.o
+ expect_equal_files reference_test.d test.d
+ expect_stat 'cache hit (direct)' 3
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 4
+ expect_stat 'files in cache' 9
+
+ # Recompile dir3
+ cd ${BASEDIR3}
+ generate_reference_compiler_output
+ CCACHE_DEPEND=1 CCACHE_BASEDIR=${BASEDIR3} $CCACHE_COMPILE $DEPFLAGS -c test.c
+ expect_equal_object_files reference_test.o test.o
+ expect_equal_files reference_test.d test.d
+ expect_stat 'cache hit (direct)' 4
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 4
+ expect_stat 'files in cache' 9
+
+ # Recompile dir4
+ cd ${BASEDIR4}
+ generate_reference_compiler_output
+ CCACHE_DEPEND=1 CCACHE_BASEDIR=${BASEDIR4} $CCACHE_COMPILE $DEPFLAGS -c test.c
+ expect_equal_object_files reference_test.o test.o
+ expect_equal_files reference_test.d test.d
+ expect_different_files reference_test.d ${BASEDIR1}/test.d
+ expect_stat 'cache hit (direct)' 5
+ expect_stat 'cache hit (preprocessed)' 0
+ expect_stat 'cache miss' 4
+ expect_stat 'files in cache' 9
+}