| 1 | CFA?=cfa
|
|---|
| 2 |
|
|---|
| 3 | DEMOS?=control treatment
|
|---|
| 4 | LANGS?=cfa c cc
|
|---|
| 5 |
|
|---|
| 6 | CFLAGS=-O3 #-DNDEBUG
|
|---|
| 7 |
|
|---|
| 8 | SOURCES=$(foreach demo,$(DEMOS),$(foreach lang,$(LANGS),$(demo).$(lang)))
|
|---|
| 9 | TGT_SLUGS=$(call BOUND_ALTS,$(SOURCES))
|
|---|
| 10 | EXES=$(addsuffix .runme,$(TGT_SLUGS))
|
|---|
| 11 | ASMS=$(addsuffix .s,$(TGT_SLUGS))
|
|---|
| 12 | TGTS=$(EXES) $(ASMS)
|
|---|
| 13 | define BOUND_ALTS
|
|---|
| 14 | $(1) $(addsuffix .unsound,$(1))
|
|---|
| 15 | endef
|
|---|
| 16 | define COMPILER_FOR
|
|---|
| 17 | $(strip
|
|---|
| 18 | $(if $(findstring .cfa,$(1)),$(CFA),
|
|---|
| 19 | $(if $(findstring .cc,$(1)),$(CXX),
|
|---|
| 20 | $(if $(findstring .c,$(1)),$(CC),
|
|---|
| 21 | unknown$(1)))))
|
|---|
| 22 | endef
|
|---|
| 23 |
|
|---|
| 24 |
|
|---|
| 25 | .SUFFIXES: # disable make built-in rules, notably `% : %.s`, which introduces circularity
|
|---|
| 26 | .SECONDEXPANSION: # evaluate prereq dynamically
|
|---|
| 27 |
|
|---|
| 28 | all: $(TGTS)
|
|---|
| 29 | exes: $(EXES)
|
|---|
| 30 | asms: $(ASMS)
|
|---|
| 31 |
|
|---|
| 32 | .PHONY: all exes asms echo_% clean
|
|---|
| 33 |
|
|---|
| 34 | $(TGTS): tgt_slug=$(basename $@)
|
|---|
| 35 | $(TGTS): unsound_flag=$(if $(findstring .unsound,$(tgt_slug)),-DUNSOUND_BOUND)
|
|---|
| 36 | $(TGTS): source=$(subst .unsound,,$(tgt_slug))
|
|---|
| 37 | $(TGTS): compiler=$(call COMPILER_FOR,$(suffix $(source)))
|
|---|
| 38 |
|
|---|
| 39 | $(EXES): out_type_flag=-DRUNIT
|
|---|
| 40 | $(ASMS): out_type_flag=-S
|
|---|
| 41 |
|
|---|
| 42 | $(TGTS): Makefile
|
|---|
| 43 | $(TGTS): $$(source)
|
|---|
| 44 | $(compiler) $< $(unsound_flag) $(out_type_flag) $(CFLAGS) -MMD -MF $@.d -o $@
|
|---|
| 45 |
|
|---|
| 46 | echo_%:
|
|---|
| 47 | @echo '$($(@:echo_%=%))'
|
|---|
| 48 |
|
|---|
| 49 | clean:
|
|---|
| 50 | rm -f *.s *.runme *.d
|
|---|
| 51 |
|
|---|
| 52 | -include *.d
|
|---|