improved test suite

updated docs for CCACHE_HARDLINK
This commit is contained in:
Andrew Tridgell 2003-02-17 01:46:43 +01:00
parent 25fbe62acc
commit f243df628c
4 changed files with 96 additions and 46 deletions

View File

@ -37,5 +37,8 @@ install:
clean:
/bin/rm -f $(OBJS) *~ ccache
test: test.sh
./test.sh
distclean: clean
/bin/rm -f Makefile config.h config.sub config.log build-stamp config.status

View File

@ -189,13 +189,12 @@ The environment variable CCACHE_NLEVELS allows
you to choose the number of levels of hash in the cache directory\&. The
default is 2\&. The minimum is 1 and the maximum is 8\&.
.IP
.IP "\fBCCACHE_NOLINK\fP"
.IP "\fBCCACHE_HARDLINK\fP"
If you set the environment variable
CCACHE_NOLINK then ccache will not use hard links from the cache
directory when creating the compiler output and will do a file copy
instead\&. The main reason for setting this option is to avoid the
update of the modification time on object files that are the result of
the same compilation in a different directory\&.
CCACHE_HARDLINK then ccache will attempt to use hard links from the
cache directory when creating the compiler output rather than using a
file copy\&. Using hard links is faster, but can confuse programs like
\&'make\&' that rely on modification times\&.
.IP
.IP "\fBCCACHE_RECACHE\fP"
This forces ccache to not use any cached
@ -298,8 +297,6 @@ following conditions need to be met:
.IP o
Use the same \fBCCACHE_DIR\fP environment variable setting
.IP o
Set the \fBCCACHE_NOLINK\fP environment variable
.IP o
Make sure that all users have write permission in the entire
cache directory (and that you trust all users of the shared cache)\&.
.IP o

View File

@ -163,12 +163,11 @@ dit(bf(CCACHE_NLEVELS)) The environment variable CCACHE_NLEVELS allows
you to choose the number of levels of hash in the cache directory. The
default is 2. The minimum is 1 and the maximum is 8.
dit(bf(CCACHE_NOLINK)) If you set the environment variable
CCACHE_NOLINK then ccache will not use hard links from the cache
directory when creating the compiler output and will do a file copy
instead. The main reason for setting this option is to avoid the
update of the modification time on object files that are the result of
the same compilation in a different directory.
dit(bf(CCACHE_HARDLINK)) If you set the environment variable
CCACHE_HARDLINK then ccache will attempt to use hard links from the
cache directory when creating the compiler output rather than using a
file copy. Using hard links is faster, but can confuse programs like
'make' that rely on modification times.
dit(bf(CCACHE_RECACHE)) This forces ccache to not use any cached
results, even if it finds them. New results are still cached, but
@ -265,7 +264,6 @@ following conditions need to be met:
itemize(
it() Use the same bf(CCACHE_DIR) environment variable setting
it() Set the bf(CCACHE_NOLINK) environment variable
it() Make sure that all users have write permission in the entire
cache directory (and that you trust all users of the shared cache).
it() Tell your users to set a umask that allows group writes

114
test.sh
View File

@ -1,10 +1,12 @@
#!/bin/sh
# a simple test suite for ccache
# tridge@samba.org
COMPILER=cc
CCACHE=../ccache
TESTDIR=test.$$
test_failed() {
reason="$1"
echo $1
@ -17,14 +19,14 @@ test_failed() {
randcode() {
outfile="$1"
nlines=`expr $RANDOM % 100`
nlines=$2
i=0;
(
while [ $i -lt $nlines ]; do
echo "int foo$i(int x) { return x; }"
echo "int foo$nlines$i(int x) { return x; }"
i=`expr $i + 1`
done
) > "$outfile"
) >> "$outfile"
}
@ -39,95 +41,119 @@ checkstat() {
expected_value="$2"
value=`getstat "$stat"`
if [ "$expected_value" != "$value" ]; then
test_failed "Expected $stat to be $expected_value - got $value"
test_failed "SUITE: $testsuite TEST: $testname - Expected $stat to be $expected_value got $value"
fi
}
basetests() {
$CCACHE -z > /dev/null
echo "starting testsuite $testsuite"
rm -rf .ccache
checkstat 'cache hit' 0
checkstat 'cache miss' 0
randcode test1.c
randcode test2.c
j=0
rm -f *.c
while [ $j -lt 32 ]; do
randcode test$j.c $j
j=`expr $j + 1`
done
testname="BASIC"
$CCACHE_COMPILE -c test1.c
checkstat 'cache hit' 0
checkstat 'cache miss' 1
testname="BASIC2"
$CCACHE_COMPILE -c test1.c
checkstat 'cache hit' 1
checkstat 'cache miss' 1
testname="debug"
$CCACHE_COMPILE -c test1.c -g
checkstat 'cache hit' 1
checkstat 'cache miss' 2
testname="debug2"
$CCACHE_COMPILE -c test1.c -g
checkstat 'cache hit' 2
checkstat 'cache miss' 2
testname="output"
$CCACHE_COMPILE -c test1.c -o foo.o
checkstat 'cache hit' 3
checkstat 'cache miss' 2
testname="link"
$CCACHE_COMPILE test1.c -o test 2> /dev/null
checkstat 'called for link' 1
testname="multiple"
$CCACHE_COMPILE -c test1.c test2.c
checkstat 'multiple source files' 1
testname="find"
$CCACHE blahblah -c test1.c 2> /dev/null
checkstat "couldn't find the compiler" 1
testname="bad"
$CCACHE_COMPILE -c test1.c -I 2> /dev/null
checkstat 'bad compiler arguments' 1
testname="c/c++"
ln -f test1.c test1.ccc
$CCACHE_COMPILE -c test1.ccc 2> /dev/null
checkstat 'not a C/C++ file' 1
testname="unsupported"
$CCACHE_COMPILE -M foo -c test1.c > /dev/null 2>&1
checkstat 'unsupported compiler option' 1
testname="stdout"
$CCACHE echo foo -c test1.c > /dev/null
checkstat 'compiler produced stdout' 1
testname="non-regular"
$CCACHE_COMPILE -o /dev/zero -c test1.c
checkstat 'output to a non-regular file' 1
testname="no-input"
$CCACHE_COMPILE -c -O2 2> /dev/null
checkstat 'no input file' 1
testname="CCACHE_DISABLE"
CCACHE_DISABLE=1 $CCACHE_COMPILE -c test1.c 2> /dev/null
checkstat 'cache hit' 3
$CCACHE_COMPILE -c test1.c 2> /dev/null
checkstat 'cache hit' 4
checkstat 'cache hit' 3
$CCACHE_COMPILE -c test1.c
checkstat 'cache hit' 4
testname="CCACHE_CPP2"
CCACHE_CPP2=1 $CCACHE_COMPILE -c test1.c -O -Wall
checkstat 'cache hit' 4
checkstat 'cache hit' 4
checkstat 'cache miss' 3
CCACHE_CPP2=1 $CCACHE_COMPILE -c test1.c -O -Wall
checkstat 'cache hit' 5
checkstat 'cache hit' 5
checkstat 'cache miss' 3
testname="CCACHE_NOSTATS"
CCACHE_NOSTATS=1 $CCACHE_COMPILE -c test1.c -O -Wall
checkstat 'cache hit' 5
checkstat 'cache miss' 3
testname="CCACHE_RECACHE"
CCACHE_RECACHE=1 $CCACHE_COMPILE -c test1.c -O -Wall
checkstat 'cache hit' 5
checkstat 'cache hit' 5
checkstat 'cache miss' 4
# strictly speaking should be 6 - RECACHE causes a double counting!
checkstat 'files in cache' 8
checkstat 'files in cache' 8
$CCACHE -c > /dev/null
checkstat 'files in cache' 6
testname="CCACHE_HASHDIR"
CCACHE_HASHDIR=1 $CCACHE_COMPILE -c test1.c -O -Wall
checkstat 'cache hit' 5
checkstat 'cache miss' 5
@ -138,29 +164,39 @@ basetests() {
checkstat 'files in cache' 8
testname="comments"
echo '/* a silly comment */' >> test1.c
$CCACHE_COMPILE -c test1.c
checkstat 'cache hit' 6
checkstat 'cache miss' 6
echo 'possible unify bug?'
# echo '/* another comment */' >> test1.c
# CCACHE_UNIFY=1 $CCACHE_COMPILE -c test1.c 2> /dev/null
# checkstat 'cache hit' 7
# checkstat 'cache miss' 6
testname="CCACHE_UNIFY"
CCACHE_UNIFY=1 $CCACHE_COMPILE -c test1.c
checkstat 'cache hit' 6
checkstat 'cache miss' 7
echo '/* another comment */' >> test1.c
CCACHE_UNIFY=1 $CCACHE_COMPILE -c test1.c
checkstat 'cache hit' 7
checkstat 'cache miss' 7
testname="cache-size"
for f in *.c; do
$CCACHE_COMPILE -c $f
done
checkstat 'cache hit' 7
checkstat 'cache miss' 39
checkstat 'files in cache' 76
$CCACHE -F 48 -c > /dev/null
if [ `getstat 'files in cache'` -gt 48 ]; then
test_failed '-F test failed'
fi
echo 'possible -F bug?'
# $CCACHE -F 2 -c
# $CCACHE -c
# checkstat 'files in cache' 2
checkstat 'files in cache' 10
testname="zero-stats"
$CCACHE -z > /dev/null
checkstat 'cache hit' 0
checkstat 'cache miss' 0
testname="clear"
$CCACHE -C > /dev/null
checkstat 'files in cache' 0
@ -172,18 +208,34 @@ basetests() {
# main program
rm -rf $TESTDIR
mkdir $TESTDIR
cd $TESTDIR
cd $TESTDIR || exit 1
mkdir .ccache
export CCACHE_DIR=.ccache
testsuite="base"
CCACHE_COMPILE="$CCACHE $COMPILER"
basetests
testsuite="link"
ln -s ../ccache $COMPILER
CCACHE_COMPILE="./$COMPILER"
basetests
testsuite="hardlink"
CCACHE_COMPILE="$CCACHE $COMPILER"
CCACHE_HARDLINK=1 basetests
testsuite="cpp2"
CCACHE_COMPILE="$CCACHE $COMPILER"
CCACHE_CPP2=1 basetests
testsuite="nlevels4"
CCACHE_COMPILE="$CCACHE $COMPILER"
CCACHE_NLEVELS=4 basetests
testsuite="nlevels1"
CCACHE_COMPILE="$CCACHE $COMPILER"
CCACHE_NLEVELS=1 basetests
cd ..
rm -rf $TESTDIR