From 04941b3cb8712cee9c3b0806cfe7aa76287c40e8 Mon Sep 17 00:00:00 2001 From: Xavier Leroy Date: Sun, 24 Jul 2016 16:09:47 +0200 Subject: Updates to the local test suite - Adjust parameters to bring the running time of each test closer to 1 second - compression/arcode.c: array access one past - "inline" -> "static inline" - Remove cchecklink support --- test/Makefile | 3 --- test/c/Makefile | 12 +-------- test/c/Results/fannkuch | 62 +++++++++++++++++++++++------------------------ test/c/Results/fib | 2 +- test/c/fannkuch.c | 2 +- test/c/fft.c | 36 ++++++++++++++------------- test/c/fftsp.c | 36 ++++++++++++++------------- test/c/fftw.c | 6 +++-- test/c/fib.c | 2 +- test/c/knucleotide.c | 22 +++++++++++------ test/c/lists.c | 2 +- test/c/nsieve.c | 16 ++++++++---- test/c/nsievebits.c | 5 +++- test/c/qsort.c | 24 +++++++++--------- test/c/sha1.c | 2 +- test/c/sha3.c | 2 +- test/c/siphash24.c | 1 + test/c/spectral.c | 2 +- test/c/vmach.c | 4 +-- test/compression/Makefile | 22 ++++------------- test/compression/arcode.c | 2 +- test/raytracer/Makefile | 37 ++-------------------------- test/regression/Makefile | 10 -------- test/spass/Makefile | 8 ------ 24 files changed, 133 insertions(+), 187 deletions(-) diff --git a/test/Makefile b/test/Makefile index 5aa115d8..b469eec2 100644 --- a/test/Makefile +++ b/test/Makefile @@ -11,6 +11,3 @@ bench: clean: for i in $(DIRS); do $(MAKE) -C $$i clean; done - -ccheck: - for i in $(DIRS); do $(MAKE) -C $$i ccheck; done diff --git a/test/c/Makefile b/test/c/Makefile index 59a0d834..c0794ff3 100644 --- a/test/c/Makefile +++ b/test/c/Makefile @@ -1,11 +1,7 @@ include ../../Makefile.config CCOMP=../../ccomp -CCOMPFLAGS=-stdlib ../../runtime -dc -dclight -dasm -ifeq ($(CCHECKLINK),true) -CCHECK=../../cchecklink -CCOMPFLAGS+= -sdump -endif +CCOMPFLAGS=$(CCOMPOPTS) -stdlib ../../runtime -dc -dclight -dasm CFLAGS=-O1 -Wall @@ -42,12 +38,6 @@ test: fi; \ done -ccheck: - @for i in $(PROGS); do \ - echo "---- $$i"; \ - $(CCHECK) -exe $$i.compcert $$i.sdump; \ - done - test_gcc: @for i in $(PROGS); do \ if ./$$i.gcc | cmp -s - Results/$$i; \ diff --git a/test/c/Results/fannkuch b/test/c/Results/fannkuch index be1815d4..15d56d61 100644 --- a/test/c/Results/fannkuch +++ b/test/c/Results/fannkuch @@ -1,31 +1,31 @@ -12345678910 -21345678910 -23145678910 -32145678910 -31245678910 -13245678910 -23415678910 -32415678910 -34215678910 -43215678910 -42315678910 -24315678910 -34125678910 -43125678910 -41325678910 -14325678910 -13425678910 -31425678910 -41235678910 -14235678910 -12435678910 -21435678910 -24135678910 -42135678910 -23451678910 -32451678910 -34251678910 -43251678910 -42351678910 -24351678910 -Pfannkuchen(10) = 38 +1234567891011 +2134567891011 +2314567891011 +3214567891011 +3124567891011 +1324567891011 +2341567891011 +3241567891011 +3421567891011 +4321567891011 +4231567891011 +2431567891011 +3412567891011 +4312567891011 +4132567891011 +1432567891011 +1342567891011 +3142567891011 +4123567891011 +1423567891011 +1243567891011 +2143567891011 +2413567891011 +4213567891011 +2345167891011 +3245167891011 +3425167891011 +4325167891011 +4235167891011 +2435167891011 +Pfannkuchen(11) = 51 diff --git a/test/c/Results/fib b/test/c/Results/fib index 3ed84615..53a71233 100644 --- a/test/c/Results/fib +++ b/test/c/Results/fib @@ -1 +1 @@ -fib(36) = 24157817 +fib(40) = 165580141 diff --git a/test/c/fannkuch.c b/test/c/fannkuch.c index 9cc7a693..7feaf6d7 100644 --- a/test/c/fannkuch.c +++ b/test/c/fannkuch.c @@ -98,7 +98,7 @@ fannkuch( int n ) int main( int argc, char* argv[] ) { - int n = (argc>1) ? atoi(argv[1]) : 10; + int n = (argc>1) ? atoi(argv[1]) : 11; printf("Pfannkuchen(%d) = %ld\n", n, fannkuch(n)); return 0; diff --git a/test/c/fft.c b/test/c/fft.c index 884a8568..a4755044 100644 --- a/test/c/fft.c +++ b/test/c/fft.c @@ -143,13 +143,13 @@ int dfft(double x[], double y[], int np) /* Test harness */ -double * xr, * xi; +#define NRUNS 20 int main(int argc, char ** argv) { - int n, np, npm, n2, i, j; + int n, np, npm, n2, i, j, nruns; double enp, t, y, z, zr, zi, zm, a; - double * pxr, * pxi; + double * xr, * xi, * pxr, * pxi; if (argc >= 2) n = atoi(argv[1]); else n = 18; np = 1 << n; @@ -160,21 +160,23 @@ int main(int argc, char ** argv) xi = calloc(np, sizeof(double)); pxr = xr; pxi = xi; - *pxr = (enp - 1.0) * 0.5; - *pxi = 0.0; - n2 = np / 2; - *(pxr+n2) = -0.5; - *(pxi+n2) = 0.0; - for (i = 1; i <= npm; i++) { - j = np - i; - *(pxr+i) = -0.5; - *(pxr+j) = -0.5; - z = t * (double)i; - y = -0.5*(cos(z)/sin(z)); - *(pxi+i) = y; - *(pxi+j) = -y; + for (nruns = 0; nruns < NRUNS; nruns++) { + *pxr = (enp - 1.0) * 0.5; + *pxi = 0.0; + n2 = np / 2; + *(pxr+n2) = -0.5; + *(pxi+n2) = 0.0; + for (i = 1; i <= npm; i++) { + j = np - i; + *(pxr+i) = -0.5; + *(pxr+j) = -0.5; + z = t * (double)i; + y = -0.5*(cos(z)/sin(z)); + *(pxi+i) = y; + *(pxi+j) = -y; + } + dfft(xr,xi,np); } - dfft(xr,xi,np); zr = 0.0; zi = 0.0; npm = np-1; diff --git a/test/c/fftsp.c b/test/c/fftsp.c index 3c7c23c3..f83bd41f 100644 --- a/test/c/fftsp.c +++ b/test/c/fftsp.c @@ -145,13 +145,13 @@ int dfft(float x[], float y[], int np) /* Test harness */ -float * xr, * xi; +#define NRUNS 3000 int main(int argc, char ** argv) { - int n, np, npm, n2, i, j; + int n, np, npm, n2, i, j, nruns; float enp, t, y, z, zr, zi, zm, a; - float * pxr, * pxi; + float * xr, * xi, * pxr, * pxi; if (argc >= 2) n = atoi(argv[1]); else n = 12; np = 1 << n; @@ -162,21 +162,23 @@ int main(int argc, char ** argv) xi = calloc(np, sizeof(float)); pxr = xr; pxi = xi; - *pxr = (enp - 1.0) * 0.5f; - *pxi = 0.0; - n2 = np / 2; - *(pxr+n2) = -0.5; - *(pxi+n2) = 0.0; - for (i = 1; i <= npm; i++) { - j = np - i; - *(pxr+i) = -0.5; - *(pxr+j) = -0.5; - z = t * (float)i; - y = -0.5f*(cosf(z)/sinf(z)); - *(pxi+i) = y; - *(pxi+j) = -y; + for (nruns = 0; nruns < NRUNS; nruns++) { + *pxr = (enp - 1.0) * 0.5f; + *pxi = 0.0; + n2 = np / 2; + *(pxr+n2) = -0.5; + *(pxi+n2) = 0.0; + for (i = 1; i <= npm; i++) { + j = np - i; + *(pxr+i) = -0.5; + *(pxr+j) = -0.5; + z = t * (float)i; + y = -0.5f*(cosf(z)/sinf(z)); + *(pxi+i) = y; + *(pxi+j) = -y; + } + dfft(xr,xi,np); } - dfft(xr,xi,np); zr = 0.0; zi = 0.0; npm = np-1; diff --git a/test/c/fftw.c b/test/c/fftw.c index 0b414956..40648257 100644 --- a/test/c/fftw.c +++ b/test/c/fftw.c @@ -74,14 +74,16 @@ const E KP1_847759065 = ((E) +1.847759065022573512256366378793576573644833252); /* Test harness */ +#define NRUNS (1024 * 1024) + int main() { - INT s[8] = { 0,1,2,3,4,5,6,7 }; + static INT s[8] = { 0,1,2,3,4,5,6,7 }; static R i[1024]; static R o[1024]; int k; for (k = 0; k < 1024; ++k) i[k] = k; - for (k = 0; k < 1024 * 1024 * 2; ++k) + for (k = 0; k < NRUNS; ++k) e01_8(i, o, s, s, 64, 8, 8); for (k = 0; k < 16; ++k) printf("o[%d] = %.6e\n", k, o[k]); diff --git a/test/c/fib.c b/test/c/fib.c index a9052029..23460a1d 100644 --- a/test/c/fib.c +++ b/test/c/fib.c @@ -12,7 +12,7 @@ int fib(int n) int main(int argc, char ** argv) { int n, r; - if (argc >= 2) n = atoi(argv[1]); else n = 36; + if (argc >= 2) n = atoi(argv[1]); else n = 40; r = fib(n); printf("fib(%d) = %d\n", n, r); return 0; diff --git a/test/c/knucleotide.c b/test/c/knucleotide.c index 6bd0e9e7..ef909e0e 100644 --- a/test/c/knucleotide.c +++ b/test/c/knucleotide.c @@ -41,15 +41,15 @@ struct ht_ht { #endif /* HT_DEBUG */ }; -/*inline*/ int ht_val(struct ht_node *node) { +static inline int ht_val(struct ht_node *node) { return(node->val); } -/*inline*/ char *ht_key(struct ht_node *node) { +static inline char *ht_key(struct ht_node *node) { return(node->key); } -/*inline*/ int ht_hashcode(struct ht_ht *ht, char *key) { +static inline int ht_hashcode(struct ht_ht *ht, char *key) { unsigned long val = 0; for (; *key; ++key) val = 5 * val + *key; return(val % ht->size); @@ -129,7 +129,7 @@ void ht_destroy(struct ht_ht *ht) { #endif /* HT_DEBUG */ } -/*inline*/ struct ht_node *ht_find(struct ht_ht *ht, char *key) { +struct ht_node *ht_find(struct ht_ht *ht, char *key) { int hash_code = ht_hashcode(ht, key); struct ht_node *node = ht->tbl[hash_code]; while (node) { @@ -139,7 +139,7 @@ void ht_destroy(struct ht_ht *ht) { return((struct ht_node *)NULL); } -/*inline*/ struct ht_node *ht_find_new(struct ht_ht *ht, char *key) { +struct ht_node *ht_find_new(struct ht_ht *ht, char *key) { int hash_code = ht_hashcode(ht, key); struct ht_node *prev = 0, *node = ht->tbl[hash_code]; while (node) { @@ -161,7 +161,7 @@ void ht_destroy(struct ht_ht *ht) { /* * Hash Table iterator data/functions */ -/*inline*/ struct ht_node *ht_next(struct ht_ht *ht) { +struct ht_node *ht_next(struct ht_ht *ht) { unsigned long index; struct ht_node *node = ht->iter_next; if (node) { @@ -179,13 +179,13 @@ void ht_destroy(struct ht_ht *ht) { return((struct ht_node *)NULL); } -/*inline*/ struct ht_node *ht_first(struct ht_ht *ht) { +struct ht_node *ht_first(struct ht_ht *ht) { ht->iter_index = 0; ht->iter_next = (struct ht_node *)NULL; return(ht_next(ht)); } -/*inline*/ int ht_count(struct ht_ht *ht) { +static inline int ht_count(struct ht_ht *ht) { return(ht->items); } @@ -281,6 +281,8 @@ write_count (char *searchFor, char *buffer, long buflen) ht_destroy (ht); } +#define NRUNS 500 + int main () { @@ -347,6 +349,10 @@ main () write_count ("GGTATT", buffer, seqlen); write_count ("GGTATTTTAATT", buffer, seqlen); write_count ("GGTATTTTAATTTATAGT", buffer, seqlen); + for (i = 0; i < NRUNS; i++) { + struct ht_ht * ht = generate_frequencies (6, buffer, seqlen); + ht_destroy(ht); + } free (buffer); fclose (f); return 0; diff --git a/test/c/lists.c b/test/c/lists.c index 350d1f0a..fc974539 100644 --- a/test/c/lists.c +++ b/test/c/lists.c @@ -59,7 +59,7 @@ int main(int argc, char ** argv) struct list * l; if (argc >= 2) n = atoi(argv[1]); else n = 1000; - if (argc >= 3) niter = atoi(argv[1]); else niter = 100000; + if (argc >= 3) niter = atoi(argv[1]); else niter = 200000; l = buildlist(n); if (checklist(n, reverselist(l))) { printf("OK\n"); diff --git a/test/c/nsieve.c b/test/c/nsieve.c index d0d59b2b..79e95024 100644 --- a/test/c/nsieve.c +++ b/test/c/nsieve.c @@ -10,7 +10,7 @@ typedef unsigned char boolean; -static void nsieve(int m) { +static unsigned int nsieve(int m) { unsigned int count = 0, i, j; boolean * flags = (boolean *) malloc(m * sizeof(boolean)); memset(flags, 1, m); @@ -23,14 +23,20 @@ static void nsieve(int m) { } free(flags); - printf("Primes up to %8u %8u\n", m, count); + return count; } +#define NITER 10 + int main(int argc, char * argv[]) { int m = argc < 2 ? 9 : atoi(argv[1]); - int i; - for (i = 0; i < 3; i++) - nsieve(10000 << (m-i)); + int i, j; + for (i = 0; i < 3; i++) { + int n = 10000 << (m-i); + unsigned count; + for (j = 0; j < NITER; j++) { count = nsieve(n); } + printf("Primes up to %8d %8u\n", n, count); + } return 0; } diff --git a/test/c/nsievebits.c b/test/c/nsievebits.c index 9ce6aaa0..ed9cde52 100644 --- a/test/c/nsievebits.c +++ b/test/c/nsievebits.c @@ -30,13 +30,16 @@ nsieve(unsigned int m) return (count); } +#define NITER 10 + static void test(unsigned int n) { unsigned int count, m; + int i; m = (1 << n) * 10000; - count = nsieve(m); + for (i = 0; i < NITER; i++) { count = nsieve(m); } printf("Primes up to %8u %8u\n", m, count); } diff --git a/test/c/qsort.c b/test/c/qsort.c index 802ef9ce..50b60be6 100644 --- a/test/c/qsort.c +++ b/test/c/qsort.c @@ -27,24 +27,24 @@ int cmpint(const void * i, const void * j) return 1; } +#define NITER 100 + int main(int argc, char ** argv) { - int n, i; + int n, i, j; int * a, * b; - int bench = 0; - if (argc >= 2) n = atoi(argv[1]); else n = 1000000; - if (argc >= 3) bench = 1; + if (argc >= 2) n = atoi(argv[1]); else n = 100000; a = malloc(n * sizeof(int)); b = malloc(n * sizeof(int)); - for (i = 0; i < n; i++) b[i] = a[i] = rand() & 0xFFFF; - quicksort(0, n - 1, a); - if (!bench) { - qsort(b, n, sizeof(int), cmpint); - for (i = 0; i < n; i++) { - if (a[i] != b[i]) { printf("Bug!\n"); return 2; } - } - printf("OK\n"); + for (j = 0; j < NITER; j++) { + for (i = 0; i < n; i++) b[i] = a[i] = rand() & 0xFFFF; + quicksort(0, n - 1, a); + } + qsort(b, n, sizeof(int), cmpint); + for (i = 0; i < n; i++) { + if (a[i] != b[i]) { printf("Bug!\n"); return 2; } } + printf("OK\n"); return 0; } diff --git a/test/c/sha1.c b/test/c/sha1.c index 84d0072c..dff32a8e 100644 --- a/test/c/sha1.c +++ b/test/c/sha1.c @@ -231,6 +231,6 @@ int main(int argc, char ** argv) } do_test(test_input_1, test_output_1); do_test(test_input_2, test_output_2); - do_bench(1000000); + do_bench(2000000); return 0; } diff --git a/test/c/sha3.c b/test/c/sha3.c index 29b8769e..93b8ba4a 100644 --- a/test/c/sha3.c +++ b/test/c/sha3.c @@ -191,7 +191,7 @@ test_triplet_t testvec[4] = { }; #define DATALEN 100000 -#define NITER 1000 +#define NITER 250 int main() { diff --git a/test/c/siphash24.c b/test/c/siphash24.c index 0ed1841f..3af4aa04 100644 --- a/test/c/siphash24.c +++ b/test/c/siphash24.c @@ -242,6 +242,7 @@ int speed_test(void) for(i = 0; i < 16; ++i ) k[i] = i; for(i = 0; i < 10000000; i++) { + testdata[99] = (u8) i; crypto_auth(out, testdata, 100, k); } return out[0]; diff --git a/test/c/spectral.c b/test/c/spectral.c index 29499fd8..aa1bf397 100644 --- a/test/c/spectral.c +++ b/test/c/spectral.c @@ -10,7 +10,7 @@ #include #include -inline double eval_A(int i, int j) { return 1.0/((i+j)*(i+j+1)/2+i+1); } +static inline double eval_A(int i, int j) { return 1.0/((i+j)*(i+j+1)/2+i+1); } void eval_A_times_u(int N, const double u[], double Au[]) { diff --git a/test/c/vmach.c b/test/c/vmach.c index 49c120dd..84ab1f94 100644 --- a/test/c/vmach.c +++ b/test/c/vmach.c @@ -207,8 +207,8 @@ int main(int argc, char ** argv) printf("fib(30) = %ld\n", wordcode_interp(wordcode_fib)); printf("tak(18, 12, 6) = %ld\n", wordcode_interp(wordcode_tak)); - for (i = 0; i < 20; i++) (void) wordcode_interp(wordcode_fib); - for (i = 0; i < 1000; i++) (void) wordcode_interp(wordcode_tak); + for (i = 0; i < 10; i++) (void) wordcode_interp(wordcode_fib); + for (i = 0; i < 500; i++) (void) wordcode_interp(wordcode_tak); return 0; } diff --git a/test/compression/Makefile b/test/compression/Makefile index d951c08f..784f7e73 100644 --- a/test/compression/Makefile +++ b/test/compression/Makefile @@ -4,10 +4,6 @@ CC=../../ccomp CFLAGS=-U__GNUC__ -stdlib ../../runtime -dclight -dasm LIBS= TIME=xtime -o /dev/null -mintime 1.0 -ifeq ($(CCHECKLINK),true) -CCHECK=../../cchecklink -CFLAGS+= -sdump -endif EXE=arcode lzw lzss @@ -35,7 +31,7 @@ TESTCOMPR=/tmp/testcompr.out TESTEXPND=/tmp/testexpnd.out test: - rm -f $(TESTCOMPR) $(TESTEXPND) + @rm -f $(TESTCOMPR) $(TESTEXPND) @echo "Test data: $(TESTFILE)" @for i in $(EXE); do \ echo "$$i: compression..."; \ @@ -47,23 +43,15 @@ test: else echo "$$i: FAILED"; exit 2; \ fi; \ done - rm -f $(TESTCOMPR) $(TESTEXPND) + @rm -f $(TESTCOMPR) $(TESTEXPND) bench: - rm -f $(TESTCOMPR) + @rm -f $(TESTCOMPR) @for i in $(EXE); do \ - echo -n "$$i "; \ + echo -n "$$i: "; \ $(TIME) sh -c "./$$i -c -i $(TESTFILE) -o $(TESTCOMPR) && ./$$i -d -i $(TESTCOMPR) -o /dev/null"; \ done - rm -f $(TESTCOMPR) - -ccheck: - @echo "---- arcode" - @$(CCHECK) -exe arcode $(ARCODE_OBJS:.o=.sdump) - @echo "---- lzw" - @$(CCHECK) -exe lzw $(LZW_OBJS:.o=.sdump) - @echo "---- lzss" - @$(CCHECK) -exe lzss $(LZSS_OBJS:.o=.sdump) + @rm -f $(TESTCOMPR) include .depend diff --git a/test/compression/arcode.c b/test/compression/arcode.c index f915cc25..9a9847f8 100644 --- a/test/compression/arcode.c +++ b/test/compression/arcode.c @@ -702,7 +702,7 @@ int ReadHeader(bit_file_t *bfpIn) cumulativeProb = 0; - for (c = 0; c <= UPPER(EOF_CHAR); c++) + for (c = 0; c < UPPER(EOF_CHAR); c++) { ranges[UPPER(c)] = 0; } diff --git a/test/raytracer/Makefile b/test/raytracer/Makefile index 1d4882bc..dc007fd7 100644 --- a/test/raytracer/Makefile +++ b/test/raytracer/Makefile @@ -3,11 +3,7 @@ include ../../Makefile.config CC=../../ccomp CFLAGS=-stdlib ../../runtime -dparse -dclight -dasm -fstruct-return LIBS=$(LIBMATH) -TIME=xtime -mintime 2.0 -ifeq ($(CCHECKLINK),true) -CCHECK=../../cchecklink -CFLAGS+= -sdump -endif +TIME=xtime OBJS=memory.o gmllexer.o gmlparser.o eval.o \ arrays.o vector.o matrix.o object.o intersect.o surface.o light.o \ @@ -26,30 +22,6 @@ include .depend depend: gcc -MM *.c > .depend -gcc0: - $(MAKE) clean - $(MAKE) CC=gcc CFLAGS="-O0 -Wall" - mv render render.gcc0 - $(MAKE) clean - -gcc1: - $(MAKE) clean - $(MAKE) CC=gcc CFLAGS="-O1 -Wall" - mv render render.gcc1 - $(MAKE) clean - -gcc2: - $(MAKE) clean - $(MAKE) CC=gcc CFLAGS="-O2 -Wall" - mv render render.gcc2 - $(MAKE) clean - -gcc3: - $(MAKE) clean - $(MAKE) CC=gcc CFLAGS="-O3 -Wall" - mv render render.gcc3 - $(MAKE) clean - test: ./render < kal.gml @if cmp kal.ppm Results/kal.ppm; \ @@ -58,9 +30,4 @@ test: fi bench: - @echo -n "raytracer: "; $(TIME) ./render < kal.gml - -ccheck: - @echo "---- render" - @$(CCHECK) -exe render *.sdump - + @echo -n "raytracer: "; $(TIME) sh -c './render < kal.gml' diff --git a/test/regression/Makefile b/test/regression/Makefile index 335a136b..88f50466 100644 --- a/test/regression/Makefile +++ b/test/regression/Makefile @@ -2,10 +2,6 @@ include ../../Makefile.config CCOMP=../../ccomp CCOMPFLAGS=-stdlib ../../runtime -dparse -dc -dclight -dasm -fall -ifeq ($(CCHECKLINK),true) -CCHECK=../../cchecklink -CCOMPFLAGS+= -sdump -endif LIBS=$(LIBMATH) @@ -104,9 +100,3 @@ test: bench: -ccheck: - @for i in $(TESTS) $(TESTS_COMP); do \ - echo "---- $$i"; \ - $(CCHECK) -exe $$i.compcert $$i.sdump; \ - done - diff --git a/test/spass/Makefile b/test/spass/Makefile index 6a4cd598..f6acc551 100644 --- a/test/spass/Makefile +++ b/test/spass/Makefile @@ -2,10 +2,6 @@ include ../../Makefile.config CC=../../ccomp CFLAGS=-stdlib ../../runtime -dparse -dclight -dasm -fstruct-return -ifeq ($(CCHECKLINK),true) -CCHECK=../../cchecklink -CFLAGS+= -sdump -endif SRCS=analyze.c clause.c clock.c closure.c cnf.c component.c \ condensing.c context.c defs.c dfgparser.c dfgscanner.c doc-proof.c \ @@ -34,10 +30,6 @@ TIME=xtime -o /dev/null # Xavier's hack bench: @echo -n "spass: "; $(TIME) ./spass problem.dfg -ccheck: - @echo "---- spass" - @$(CCHECK) -exe spass *.sdump - depend: gcc -MM $(SRCS) > .depend -- cgit