Basilisk source code (http://basilisk.fr/src/)

root / src / dotest

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#!/bin/sh

test=`echo $1 | cut -d. -f1`
ext=`echo $1 | cut -d. -f2`
case $ext in
    ctst) log=clog; out=cout ;;
    *)    log=log;  out=out  ;;
esac
valgrind=$2
BASILISK_WIKI=`echo $BASILISK | sed 's:/src$::'`
dir=`echo $PWD | sed "s:$BASILISK_WIKI/::"`

script()
{
    cat <<EOF
rm -f $test.c
if test -f fail; then
    cat fail
    exit 1
fi
cat warn
test -s warn || rm -f warn
echo \[$test.$ext\]
if $valgrind ./$test 2> $log > $out; then
    if test -f $test.ref; then
        echo diff $log $test.ref > fail
        diff $log $test.ref >> fail && rm -f fail
        rm -f $test.ref
    fi
else
    cp -f $log fail
fi
if test -f fail; then
    cat fail
    exit 1
fi
touch pass
EOF
}

expirecache()
{
    rm -f $BASILISK_WIKI/cache/$dir/$test.c.page
}

# run locally
locally()
{
    cd $test
    rm -f warn pass fail $log $out
    cd ..
    echo qcc $CFLAGS -o $test/$test $test.c $LIBS -lm;
    qcc $CFLAGS -o $test/$test $test.c $LIBS -lm > $test/warn 2>&1 \
	|| mv -f $test/warn $test/fail
    cd $test
    script | sh
    expirecache
    cd ..
}

# compile/run on a remote "sandbox"
remotely()
{
    set -e
    rhost=$1
    chksum=`$GENSUM $test.s | cut -d' ' -f1`
    cd $test
    mkdir $chksum
    cp -f $test.c $chksum
    if test -f $test.ref; then cp -f $test.ref $chksum; fi
    (cat <<EOF
#!/bin/sh
rm -f warn pass fail $log $out
\$BASILISK/qcc $CFLAGS -o $test $test.c $LIBS -lm > warn 2>&1 || mv -f warn fail
EOF
    script) > $chksum/$test.sh
cat <<EOF >> $chksum/$test.sh
rm -f $test.c $test.sh $test.ref
tar czf \$HOME/$chksum.tgz *
rm -r -f \$HOME/$chksum
EOF
    tar czf $chksum.tgz $chksum
    rm -r -f $chksum
    scp -q $chksum.tgz $rhost: && rm -f $chksum.tgz
    ssh $rhost sh -c "\"tar xzf $chksum.tgz && cd $chksum && sh $test.sh\""
    scp -q $rhost:$chksum.tgz $chksum.tgz
    ssh $rhost rm -r -f $chksum.tgz
    tar xzf $chksum.tgz
    rm -f $chksum.tgz $test.c $test.ref pid
    expirecache
    if test -f fail && test -n "$MAINTAINER"; then
	(
	    echo Latest change:
	    echo
	    darcs changes --last=1
	    echo
	    if test -f ../$test.c.page; then
		cat <<EOF
See http://basilisk.fr/$dir/$test.c
EOF
	    else
		cat fail
	    fi 
	) | mail -s "basilisk: $test.$ext failed" $MAINTAINER
    fi    
    cd ..
}

set -e

if test -f $test.$ext && $CHECKSUM $test.$ext; then
    touch $test.$ext
    echo "make: '$test' is up to date."
else
    rm -f $test.$ext $test/pass $test/fail $test/warn $test/plot.png
    expirecache
    mkdir -p $test && cp -f $test.c $test
    if test -f $test.ref; then cp -f $test.ref $test; fi
    if test -d $BASILISK_WIKI/static -a \
	-f $test.c.page -a \
	! -L $BASILISK_WIKI/static/$dir/$test; then
	ln -s $PWD/$test $BASILISK_WIKI/static/$dir/$test
    fi

    if test -n "$SANDBOX"; then
	echo \[$test.$ext on $SANDBOX\]
        ( remotely $SANDBOX ) &
	echo $! > $test/pid
    else
	locally
    fi

    if test -f $test/fail; then
	exit 1
    fi
    $GENSUM $test.s > $test.$ext;
fi