# -*- Makefile -*- # Usage: make test.N.report # # COUNT can be over-ridden to change the number of tests generated per # file, and TESTARGS is used to change the type generation. Make sure # to 'make clean' after changing either of these parameters. TESTARGS := --no-unsigned --no-vector --no-complex --no-bool COUNT := 1 TIMEOUT := 5 CFLAGS := -std=gnu99 X_COMPILER := gcc X_LL_CFLAGS := -emit-llvm -S Y_COMPILER := clang Y_LL_CFLAGS := -emit-llvm -S CC := gcc ### ABITESTGEN := ../ABITestGen.py ifndef VERBOSE Verb := @ endif .PHONY: test.%.report test.%.report: temps/test.%.xx.diff temps/test.%.xy.diff temps/test.%.yx.diff temps/test.%.yy.diff @ok=1;\ for t in $^; do \ if [ -s $$t ]; then \ echo "TEST $*: $$t failed"; \ ok=0;\ fi; \ done; \ if [ $$ok -eq 1 ]; then \ true; \ else \ false; \ fi .PHONY: test.%.defs-report test.%.defs-report: temps/test.%.defs.diff @for t in $^; do \ if [ -s $$t ]; then \ echo "TEST $*: $$t failed"; \ cat $$t; \ fi; \ done .PHONY: test.%.build test.%.build: temps/test.%.ref temps/test.%.xx temps/test.%.xy temps/test.%.yx temps/test.%.yy temps/test.%.x.defs temps/test.%.y.defs @true ### # Diffs and output .PRECIOUS: temps/.dir .PRECIOUS: temps/test.%.xx.diff temps/test.%.xx.diff: temps/test.%.ref.out temps/test.%.xx.out $(Verb) diff $^ > $@ || true .PRECIOUS: temps/test.%.xy.diff temps/test.%.xy.diff: temps/test.%.ref.out temps/test.%.xy.out $(Verb) diff $^ > $@ || true .PRECIOUS: temps/test.%.yx.diff temps/test.%.yx.diff: temps/test.%.ref.out temps/test.%.yx.out $(Verb) diff $^ > $@ || true .PRECIOUS: temps/test.%.yy.diff temps/test.%.yy.diff: temps/test.%.ref.out temps/test.%.yy.out $(Verb) diff $^ > $@ || true .PRECIOUS: temps/test.%.defs.diff temps/test.%.defs.diff: temps/test.%.x.defs temps/test.%.y.defs $(Verb) zipdifflines \ --replace "%struct.T[0-9]+" "%struct.s" \ --replace "%union.T[0-9]+" "%struct.s" \ --replace "byval align [0-9]+" "byval" \ $^ > $@ .PRECIOUS: temps/test.%.out temps/test.%.out: temps/test.% -$(Verb) ./$< > $@ # Executables .PRECIOUS: temps/test.%.ref temps/test.%.ref: temps/test.%.driver.ref.o temps/test.%.a.ref.o temps/test.%.b.ref.o $(Verb) $(CC) $(CFLAGS) $(CC_CFLAGS) -O3 -o $@ $^ .PRECIOUS: temps/test.%.xx temps/test.%.xx: temps/test.%.driver.ref.o temps/test.%.a.x.o temps/test.%.b.x.o $(Verb) $(CC) $(CFLAGS) $(CC_CFLAGS) -O3 -o $@ $^ .PRECIOUS: temps/test.%.xy temps/test.%.xy: temps/test.%.driver.ref.o temps/test.%.a.x.o temps/test.%.b.y.o $(Verb) $(CC) $(CFLAGS) $(CC_CFLAGS) -O3 -o $@ $^ .PRECIOUS: temps/test.%.yx temps/test.%.yx: temps/test.%.driver.ref.o temps/test.%.a.y.o temps/test.%.b.x.o $(Verb) $(CC) $(CFLAGS) $(CC_CFLAGS) -O3 -o $@ $^ .PRECIOUS: temps/test.%.yy temps/test.%.yy: temps/test.%.driver.ref.o temps/test.%.a.y.o temps/test.%.b.y.o $(Verb) $(CC) $(CFLAGS) $(CC_CFLAGS) -O3 -o $@ $^ # Object files .PRECIOUS: temps/test.%.ref.o temps/test.%.ref.o: inputs/test.%.c temps/.dir $(Verb) $(CC) -c $(CFLAGS) $(CC_CFLAGS) -o $@ $< .PRECIOUS: temps/test.%.x.o temps/test.%.x.o: inputs/test.%.c temps/.dir $(Verb) $(X_COMPILER) -c $(CFLAGS) $(X_CFLAGS) -o $@ $< .PRECIOUS: temps/test.%.y.o temps/test.%.y.o: inputs/test.%.c temps/.dir $(Verb) $(Y_COMPILER) -c $(CFLAGS) $(Y_CFLAGS) -o $@ $< .PRECIOUS: temps/test.%.x.defs temps/test.%.x.defs: temps/test.%.a.x.ll temps/.dir -$(Verb) -grep '^define ' $< > $@ .PRECIOUS: temps/test.%.y.defs temps/test.%.y.defs: temps/test.%.a.y.ll temps/.dir -$(Verb) -grep '^define ' $< > $@ .PRECIOUS: temps/test.%.a.x.ll temps/test.%.a.x.ll: inputs/test.%.a.c temps/.dir $(Verb) $(X_COMPILER) $(CFLAGS) $(X_LL_CFLAGS) $(X_CFLAGS) -o $@ $< .PRECIOUS: temps/test.%.b.x.ll temps/test.%.b.x.ll: inputs/test.%.b.c temps/.dir $(Verb) $(X_COMPILER) $(CFLAGS) $(X_LL_CFLAGS) $(X_CFLAGS) -o $@ $< .PRECIOUS: temps/test.%.a.y.ll temps/test.%.a.y.ll: inputs/test.%.a.c temps/.dir $(Verb) $(Y_COMPILER) $(CFLAGS) $(Y_LL_CFLAGS) $(Y_CFLAGS) -o $@ $< .PRECIOUS: temps/test.%.b.y.ll temps/test.%.b.y.ll: inputs/test.%.b.c temps/.dir $(Verb) $(Y_COMPILER) $(CFLAGS) $(Y_LL_CFLAGS) $(Y_CFLAGS) -o $@ $< # Input generation .PHONY: test.%.top test.%.top: inputs/test.%.a.c inputs/test.%.b.c inputs/test.%.driver.c @true .PRECIOUS: inputs/test.%.a.c inputs/test.%.b.c inputs/test.%.driver.c inputs/test.%.a.c: test.%.generate @true inputs/test.%.b.c: test.%.generate @true inputs/test.%.driver.c: test.%.generate @true .PHONY: test.%.generate .PRECIOUS: inputs/.dir test.%.generate: $(ABITESTGEN) inputs/.dir $(Verb) $(ABITESTGEN) $(TESTARGS) -o inputs/test.$*.a.c -T inputs/test.$*.b.c -D inputs/test.$*.driver.c --min=$(shell expr $* '*' $(COUNT)) --count=$(COUNT) # Cleaning clean-temps: $(Verb) rm -rf temps clean: $(Verb) rm -rf temps inputs # Etc. %/.dir: $(Verb) mkdir -p $* > /dev/null $(Verb) $(DATE) > $@