1*7330f729Sjoerg# -*- Makefile -*- 2*7330f729Sjoerg 3*7330f729Sjoerg# Usage: make test.N.report 4*7330f729Sjoerg# 5*7330f729Sjoerg# COUNT can be over-ridden to change the number of tests generated per 6*7330f729Sjoerg# file, and TESTARGS is used to change the type generation. Make sure 7*7330f729Sjoerg# to 'make clean' after changing either of these parameters. 8*7330f729Sjoerg 9*7330f729SjoergTESTARGS := --no-unsigned --no-vector --no-complex --no-bool 10*7330f729Sjoerg 11*7330f729SjoergCOUNT := 1 12*7330f729SjoergTIMEOUT := 5 13*7330f729Sjoerg 14*7330f729SjoergCFLAGS := -std=gnu99 15*7330f729Sjoerg 16*7330f729SjoergX_COMPILER := gcc 17*7330f729SjoergX_LL_CFLAGS := -emit-llvm -S 18*7330f729SjoergY_COMPILER := clang 19*7330f729SjoergY_LL_CFLAGS := -emit-llvm -S 20*7330f729SjoergCC := gcc 21*7330f729Sjoerg 22*7330f729Sjoerg### 23*7330f729Sjoerg 24*7330f729SjoergABITESTGEN := ../ABITestGen.py 25*7330f729Sjoerg 26*7330f729Sjoergifndef VERBOSE 27*7330f729Sjoerg Verb := @ 28*7330f729Sjoergendif 29*7330f729Sjoerg 30*7330f729Sjoerg.PHONY: test.%.report 31*7330f729Sjoergtest.%.report: temps/test.%.xx.diff temps/test.%.xy.diff temps/test.%.yx.diff temps/test.%.yy.diff 32*7330f729Sjoerg @ok=1;\ 33*7330f729Sjoerg for t in $^; do \ 34*7330f729Sjoerg if [ -s $$t ]; then \ 35*7330f729Sjoerg echo "TEST $*: $$t failed"; \ 36*7330f729Sjoerg ok=0;\ 37*7330f729Sjoerg fi; \ 38*7330f729Sjoerg done; \ 39*7330f729Sjoerg if [ $$ok -eq 1 ]; then \ 40*7330f729Sjoerg true; \ 41*7330f729Sjoerg else \ 42*7330f729Sjoerg false; \ 43*7330f729Sjoerg fi 44*7330f729Sjoerg 45*7330f729Sjoerg 46*7330f729Sjoerg.PHONY: test.%.defs-report 47*7330f729Sjoergtest.%.defs-report: temps/test.%.defs.diff 48*7330f729Sjoerg @for t in $^; do \ 49*7330f729Sjoerg if [ -s $$t ]; then \ 50*7330f729Sjoerg echo "TEST $*: $$t failed"; \ 51*7330f729Sjoerg cat $$t; \ 52*7330f729Sjoerg fi; \ 53*7330f729Sjoerg done 54*7330f729Sjoerg 55*7330f729Sjoerg.PHONY: test.%.build 56*7330f729Sjoergtest.%.build: temps/test.%.ref temps/test.%.xx temps/test.%.xy temps/test.%.yx temps/test.%.yy temps/test.%.x.defs temps/test.%.y.defs 57*7330f729Sjoerg @true 58*7330f729Sjoerg 59*7330f729Sjoerg### 60*7330f729Sjoerg 61*7330f729Sjoerg# Diffs and output 62*7330f729Sjoerg 63*7330f729Sjoerg.PRECIOUS: temps/.dir 64*7330f729Sjoerg 65*7330f729Sjoerg.PRECIOUS: temps/test.%.xx.diff 66*7330f729Sjoergtemps/test.%.xx.diff: temps/test.%.ref.out temps/test.%.xx.out 67*7330f729Sjoerg $(Verb) diff $^ > $@ || true 68*7330f729Sjoerg.PRECIOUS: temps/test.%.xy.diff 69*7330f729Sjoergtemps/test.%.xy.diff: temps/test.%.ref.out temps/test.%.xy.out 70*7330f729Sjoerg $(Verb) diff $^ > $@ || true 71*7330f729Sjoerg.PRECIOUS: temps/test.%.yx.diff 72*7330f729Sjoergtemps/test.%.yx.diff: temps/test.%.ref.out temps/test.%.yx.out 73*7330f729Sjoerg $(Verb) diff $^ > $@ || true 74*7330f729Sjoerg.PRECIOUS: temps/test.%.yy.diff 75*7330f729Sjoergtemps/test.%.yy.diff: temps/test.%.ref.out temps/test.%.yy.out 76*7330f729Sjoerg $(Verb) diff $^ > $@ || true 77*7330f729Sjoerg.PRECIOUS: temps/test.%.defs.diff 78*7330f729Sjoergtemps/test.%.defs.diff: temps/test.%.x.defs temps/test.%.y.defs 79*7330f729Sjoerg $(Verb) zipdifflines \ 80*7330f729Sjoerg --replace "%struct.T[0-9]+" "%struct.s" \ 81*7330f729Sjoerg --replace "%union.T[0-9]+" "%struct.s" \ 82*7330f729Sjoerg --replace "byval align [0-9]+" "byval" \ 83*7330f729Sjoerg $^ > $@ 84*7330f729Sjoerg 85*7330f729Sjoerg.PRECIOUS: temps/test.%.out 86*7330f729Sjoergtemps/test.%.out: temps/test.% 87*7330f729Sjoerg -$(Verb) ./$< > $@ 88*7330f729Sjoerg 89*7330f729Sjoerg# Executables 90*7330f729Sjoerg 91*7330f729Sjoerg.PRECIOUS: temps/test.%.ref 92*7330f729Sjoergtemps/test.%.ref: temps/test.%.driver.ref.o temps/test.%.a.ref.o temps/test.%.b.ref.o 93*7330f729Sjoerg $(Verb) $(CC) $(CFLAGS) $(CC_CFLAGS) -O3 -o $@ $^ 94*7330f729Sjoerg.PRECIOUS: temps/test.%.xx 95*7330f729Sjoergtemps/test.%.xx: temps/test.%.driver.ref.o temps/test.%.a.x.o temps/test.%.b.x.o 96*7330f729Sjoerg $(Verb) $(CC) $(CFLAGS) $(CC_CFLAGS) -O3 -o $@ $^ 97*7330f729Sjoerg.PRECIOUS: temps/test.%.xy 98*7330f729Sjoergtemps/test.%.xy: temps/test.%.driver.ref.o temps/test.%.a.x.o temps/test.%.b.y.o 99*7330f729Sjoerg $(Verb) $(CC) $(CFLAGS) $(CC_CFLAGS) -O3 -o $@ $^ 100*7330f729Sjoerg.PRECIOUS: temps/test.%.yx 101*7330f729Sjoergtemps/test.%.yx: temps/test.%.driver.ref.o temps/test.%.a.y.o temps/test.%.b.x.o 102*7330f729Sjoerg $(Verb) $(CC) $(CFLAGS) $(CC_CFLAGS) -O3 -o $@ $^ 103*7330f729Sjoerg.PRECIOUS: temps/test.%.yy 104*7330f729Sjoergtemps/test.%.yy: temps/test.%.driver.ref.o temps/test.%.a.y.o temps/test.%.b.y.o 105*7330f729Sjoerg $(Verb) $(CC) $(CFLAGS) $(CC_CFLAGS) -O3 -o $@ $^ 106*7330f729Sjoerg 107*7330f729Sjoerg# Object files 108*7330f729Sjoerg 109*7330f729Sjoerg.PRECIOUS: temps/test.%.ref.o 110*7330f729Sjoergtemps/test.%.ref.o: inputs/test.%.c temps/.dir 111*7330f729Sjoerg $(Verb) $(CC) -c $(CFLAGS) $(CC_CFLAGS) -o $@ $< 112*7330f729Sjoerg.PRECIOUS: temps/test.%.x.o 113*7330f729Sjoergtemps/test.%.x.o: inputs/test.%.c temps/.dir 114*7330f729Sjoerg $(Verb) $(X_COMPILER) -c $(CFLAGS) $(X_CFLAGS) -o $@ $< 115*7330f729Sjoerg.PRECIOUS: temps/test.%.y.o 116*7330f729Sjoergtemps/test.%.y.o: inputs/test.%.c temps/.dir 117*7330f729Sjoerg $(Verb) $(Y_COMPILER) -c $(CFLAGS) $(Y_CFLAGS) -o $@ $< 118*7330f729Sjoerg 119*7330f729Sjoerg.PRECIOUS: temps/test.%.x.defs 120*7330f729Sjoergtemps/test.%.x.defs: temps/test.%.a.x.ll temps/.dir 121*7330f729Sjoerg -$(Verb) -grep '^define ' $< > $@ 122*7330f729Sjoerg.PRECIOUS: temps/test.%.y.defs 123*7330f729Sjoergtemps/test.%.y.defs: temps/test.%.a.y.ll temps/.dir 124*7330f729Sjoerg -$(Verb) -grep '^define ' $< > $@ 125*7330f729Sjoerg 126*7330f729Sjoerg.PRECIOUS: temps/test.%.a.x.ll 127*7330f729Sjoergtemps/test.%.a.x.ll: inputs/test.%.a.c temps/.dir 128*7330f729Sjoerg $(Verb) $(X_COMPILER) $(CFLAGS) $(X_LL_CFLAGS) $(X_CFLAGS) -o $@ $< 129*7330f729Sjoerg.PRECIOUS: temps/test.%.b.x.ll 130*7330f729Sjoergtemps/test.%.b.x.ll: inputs/test.%.b.c temps/.dir 131*7330f729Sjoerg $(Verb) $(X_COMPILER) $(CFLAGS) $(X_LL_CFLAGS) $(X_CFLAGS) -o $@ $< 132*7330f729Sjoerg.PRECIOUS: temps/test.%.a.y.ll 133*7330f729Sjoergtemps/test.%.a.y.ll: inputs/test.%.a.c temps/.dir 134*7330f729Sjoerg $(Verb) $(Y_COMPILER) $(CFLAGS) $(Y_LL_CFLAGS) $(Y_CFLAGS) -o $@ $< 135*7330f729Sjoerg.PRECIOUS: temps/test.%.b.y.ll 136*7330f729Sjoergtemps/test.%.b.y.ll: inputs/test.%.b.c temps/.dir 137*7330f729Sjoerg $(Verb) $(Y_COMPILER) $(CFLAGS) $(Y_LL_CFLAGS) $(Y_CFLAGS) -o $@ $< 138*7330f729Sjoerg 139*7330f729Sjoerg# Input generation 140*7330f729Sjoerg 141*7330f729Sjoerg.PHONY: test.%.top 142*7330f729Sjoergtest.%.top: inputs/test.%.a.c inputs/test.%.b.c inputs/test.%.driver.c 143*7330f729Sjoerg @true 144*7330f729Sjoerg 145*7330f729Sjoerg.PRECIOUS: inputs/test.%.a.c inputs/test.%.b.c inputs/test.%.driver.c 146*7330f729Sjoerginputs/test.%.a.c: test.%.generate 147*7330f729Sjoerg @true 148*7330f729Sjoerginputs/test.%.b.c: test.%.generate 149*7330f729Sjoerg @true 150*7330f729Sjoerginputs/test.%.driver.c: test.%.generate 151*7330f729Sjoerg @true 152*7330f729Sjoerg 153*7330f729Sjoerg.PHONY: test.%.generate 154*7330f729Sjoerg.PRECIOUS: inputs/.dir 155*7330f729Sjoergtest.%.generate: $(ABITESTGEN) inputs/.dir 156*7330f729Sjoerg $(Verb) $(ABITESTGEN) $(TESTARGS) -o inputs/test.$*.a.c -T inputs/test.$*.b.c -D inputs/test.$*.driver.c --min=$(shell expr $* '*' $(COUNT)) --count=$(COUNT) 157*7330f729Sjoerg 158*7330f729Sjoerg# Cleaning 159*7330f729Sjoerg 160*7330f729Sjoergclean-temps: 161*7330f729Sjoerg $(Verb) rm -rf temps 162*7330f729Sjoerg 163*7330f729Sjoergclean: 164*7330f729Sjoerg $(Verb) rm -rf temps inputs 165*7330f729Sjoerg 166*7330f729Sjoerg# Etc. 167*7330f729Sjoerg 168*7330f729Sjoerg%/.dir: 169*7330f729Sjoerg $(Verb) mkdir -p $* > /dev/null 170*7330f729Sjoerg $(Verb) $(DATE) > $@ 171