Imported Upstream version 3.4
[platform/upstream/ccache.git] / test / suites / basedir.bash
1 SUITE_basedir_SETUP() {
2     unset CCACHE_NODIRECT
3
4     mkdir -p dir1/src dir1/include
5     cat <<EOF >dir1/src/test.c
6 #include <stdarg.h>
7 #include <test.h>
8 EOF
9     cat <<EOF >dir1/include/test.h
10 int test;
11 EOF
12     cp -r dir1 dir2
13     backdate dir1/include/test.h dir2/include/test.h
14 }
15
16 SUITE_basedir() {
17     # -------------------------------------------------------------------------
18     TEST "Enabled CCACHE_BASEDIR"
19
20     cd dir1
21     CCACHE_BASEDIR="`pwd`" $CCACHE_COMPILE -I`pwd`/include -c src/test.c
22     expect_stat 'cache hit (direct)' 0
23     expect_stat 'cache hit (preprocessed)' 0
24     expect_stat 'cache miss' 1
25
26     cd ../dir2
27     CCACHE_BASEDIR="`pwd`" $CCACHE_COMPILE -I`pwd`/include -c src/test.c
28     expect_stat 'cache hit (direct)' 1
29     expect_stat 'cache hit (preprocessed)' 0
30     expect_stat 'cache miss' 1
31
32     # -------------------------------------------------------------------------
33     TEST "Disabled (default) CCACHE_BASEDIR"
34
35     cd dir1
36     CCACHE_BASEDIR="`pwd`" $CCACHE_COMPILE -I`pwd`/include -c src/test.c
37     expect_stat 'cache hit (direct)' 0
38     expect_stat 'cache hit (preprocessed)' 0
39     expect_stat 'cache miss' 1
40
41     # CCACHE_BASEDIR="" is the default:
42     $CCACHE_COMPILE -I`pwd`/include -c src/test.c
43     expect_stat 'cache hit (direct)' 0
44     expect_stat 'cache hit (preprocessed)' 0
45     expect_stat 'cache miss' 2
46
47     # -------------------------------------------------------------------------
48     TEST "Path normalization"
49
50     cd dir1
51     CCACHE_BASEDIR="`pwd`" $CCACHE_COMPILE -I`pwd`/include -c src/test.c
52     expect_stat 'cache hit (direct)' 0
53     expect_stat 'cache hit (preprocessed)' 0
54     expect_stat 'cache miss' 1
55
56     mkdir subdir
57     ln -s `pwd`/include subdir/symlink
58
59     # Rewriting triggered by CCACHE_BASEDIR should handle paths with multiple
60     # slashes, redundant "/." parts and "foo/.." parts correctly. Note that the
61     # ".." part of the path is resolved after the symlink has been resolved.
62     CCACHE_BASEDIR=`pwd` $CCACHE_COMPILE -I`pwd`//./subdir/symlink/../include -c `pwd`/src/test.c
63     expect_stat 'cache hit (direct)' 1
64     expect_stat 'cache hit (preprocessed)' 0
65     expect_stat 'cache miss' 1
66
67     # -------------------------------------------------------------------------
68     TEST "Rewriting in stderr"
69
70     cat <<EOF >stderr.h
71 int stderr(void)
72 {
73   // Trigger warning by having no return statement.
74 }
75 EOF
76     backdate stderr.h
77     cat <<EOF >stderr.c
78 #include <stderr.h>
79 EOF
80
81     CCACHE_BASEDIR=`pwd` $CCACHE_COMPILE -Wall -W -I`pwd` -c `pwd`/stderr.c -o `pwd`/stderr.o 2>stderr.txt
82     expect_stat 'cache hit (direct)' 0
83     expect_stat 'cache hit (preprocessed)' 0
84     expect_stat 'cache miss' 1
85     if grep `pwd` stderr.txt >/dev/null 2>&1; then
86         test_failed "Base dir (`pwd`) found in stderr:\n`cat stderr.txt`"
87     fi
88
89     CCACHE_BASEDIR=`pwd` $CCACHE_COMPILE -Wall -W -I`pwd` -c `pwd`/stderr.c -o `pwd`/stderr.o 2>stderr.txt
90     expect_stat 'cache hit (direct)' 1
91     expect_stat 'cache hit (preprocessed)' 0
92     expect_stat 'cache miss' 1
93     if grep `pwd` stderr.txt >/dev/null 2>&1; then
94         test_failed "Base dir (`pwd`) found in stderr:\n`cat stderr.txt`"
95     fi
96
97     # -------------------------------------------------------------------------
98     TEST "-MF/-MQ/-MT with absolute paths"
99
100     for option in MF "MF " MQ "MQ " MT "MT "; do
101         clear_cache
102         cd dir1
103         CCACHE_BASEDIR="`pwd`" $CCACHE_COMPILE -I`pwd`/include -MD -${option}`pwd`/test.d -c src/test.c
104         expect_stat 'cache hit (direct)' 0
105         expect_stat 'cache hit (preprocessed)' 0
106         expect_stat 'cache miss' 1
107         cd ..
108
109         cd dir2
110         CCACHE_BASEDIR="`pwd`" $CCACHE_COMPILE -I`pwd`/include -MD -${option}`pwd`/test.d -c src/test.c
111         expect_stat 'cache hit (direct)' 1
112         expect_stat 'cache hit (preprocessed)' 0
113         expect_stat 'cache miss' 1
114         cd ..
115     done
116
117     # -------------------------------------------------------------------------
118     # When BASEDIR is set to /, check that -MF, -MQ and -MT arguments with
119     # absolute paths are rewritten to relative and that the dependency file
120     # only contains relative paths.
121     TEST "-MF/-MQ/-MT with absolute paths and BASEDIR set to /"
122
123     for option in MF "MF " MQ "MQ " MT "MT "; do
124         clear_cache
125         cd dir1
126         CCACHE_BASEDIR="/" $CCACHE_COMPILE -I`pwd`/include -MD -${option}`pwd`/test.d -c src/test.c
127         expect_stat 'cache hit (direct)' 0
128         expect_stat 'cache hit (preprocessed)' 0
129         expect_stat 'cache miss' 1
130         # Check that there is no absolute path in the dependency file:
131         while read line; do
132             for file in $line; do
133                 case $file in /*)
134                     test_failed "Absolute file path '$file' found in dependency file '`pwd`/test.d'"
135                 esac
136             done
137         done <test.d
138         cd ..
139
140         cd dir2
141         CCACHE_BASEDIR="/" $CCACHE_COMPILE -I`pwd`/include -MD -${option}`pwd`/test.d -c src/test.c
142         expect_stat 'cache hit (direct)' 1
143         expect_stat 'cache hit (preprocessed)' 0
144         expect_stat 'cache miss' 1
145         cd ..
146     done
147 }