0) Umístění Makefilu je ve složce mlaskal.
1) Budu vděčný za návrhy na rozumné C++ warningy, mám tam jen -Wpendantic -Wall -Wextra.
2) Lze použít make, make clean, make rebuild a make test (lze přidat vlastní testy do mlaskal/public-ro/mlc/du1/tests/).
3) V Makefilu nejsou závislosti na hlavičkových souborech (protože jsou buď readonly nebo nějak vygenerované), tzn. pokud příp. ruční úpravě hlavič. souborů je potřeba použít make rebuild.
4) Použití jiných přepínačů k diffu pro make test je možné pomocí makra DFLAGS (např. make test DFLAGS="-y -Z")
5) Jakékoliv komentáře vítány
Kód: Vybrat vše
DU_NUM = du1
PROGRAM = ./mlc
PATH_RO_COMMON_H = public-ro/common/h
PATH_RO_COMMON_SRC = public-ro/common/src
PATH_RO_COMMON_XML = public-ro/common/xml
PATH_RO_MLC_DU_SRC = public-ro/mlc/$(DU_NUM)/src
PATH_RO_MLC_DU_TESTS = public-ro/mlc/$(DU_NUM)/tests
PATH_RO_MLC_H = public-ro/mlc/h
PATH_RO_MLC_SRC = public-ro/mlc/src
PATH_RW_DU = public-rw/SWI098/$(DU_NUM)
CXX = g++
CXXSTD = c++14
CWARNS = -Wpedantic -Wall -Wextra
CXXWARNS =
CXXFLAGS = -c -std=$(CXXSTD) $(CWARNS) $(CXXWARNS)
LDFLAGS =
INCLUDE = -I $(PATH_RO_COMMON_H) \
-I $(PATH_RO_COMMON_XML) \
-I $(PATH_RO_MLC_H) \
-I $(PATH_RO_MLC_SRC) \
-I $(PATH_RW_DU)
XSLTP = xsltproc
YACC = bison
YFLAGS = --report=all -d
LEX = flex
LFLAGS = -Cf -b -p
RM = rm -f
DIFF = diff
DFLAGS = -s -Z
.PHONY: all
all: gen $(PROGRAM)
.PHONY: gen
gen: gen_xslt gen_yacc gen_lex
$(PROGRAM): \
$(PATH_RO_COMMON_SRC)/abstract_ic.o \
$(PATH_RO_COMMON_SRC)/flat_icblock.o \
$(PATH_RO_COMMON_SRC)/ic_instr.o \
$(PATH_RO_COMMON_SRC)/labeled_icblock.o \
$(PATH_RO_COMMON_SRC)/uid_gen.o \
$(PATH_RO_COMMON_XML)/gen_aifactory.o \
$(PATH_RO_COMMON_XML)/gen_icfactory.o \
$(PATH_RO_COMMON_XML)/gen_icinstrtab.o \
$(PATH_RO_MLC_DU_SRC)/$(DU_NUM).o \
$(PATH_RO_MLC_SRC)/duerr.o \
$(PATH_RO_MLC_SRC)/dummyg.o \
$(PATH_RO_MLC_SRC)/dusememptyerrtab.o \
$(PATH_RO_MLC_SRC)/dutables.o \
$(PATH_RW_DU)/$(DU_NUM)l.o
$(CXX) $(LDFLAGS) -o $@ $^
%.o: %.cpp
$(CXX) $(CXXFLAGS) -o $@ $< $(INCLUDE)
.PHONY: gen_xslt
gen_xslt: \
$(PATH_RO_COMMON_XML)/gen_aifactory.cpp \
$(PATH_RO_COMMON_XML)/gen_ainstr.hpp \
$(PATH_RO_COMMON_XML)/gen_icfactory.cpp \
$(PATH_RO_COMMON_XML)/gen_icinstr.hpp \
$(PATH_RO_COMMON_XML)/gen_icopcodes.hpp \
$(PATH_RO_COMMON_XML)/gen_icinstrtab.cpp
$(PATH_RO_COMMON_XML)/gen_aifactory.cpp: \
$(PATH_RO_COMMON_XML)/genaifctrc.xslt \
$(PATH_RO_COMMON_XML)/icminstr.xml
$(XSLTP) -o $@ $^
$(PATH_RO_COMMON_XML)/gen_ainstr.hpp: \
$(PATH_RO_COMMON_XML)/genainstrh.xslt \
$(PATH_RO_COMMON_XML)/icminstr.xml
$(XSLTP) -o $@ $^
$(PATH_RO_COMMON_XML)/gen_icfactory.cpp: \
$(PATH_RO_COMMON_XML)/genicfctrc.xslt \
$(PATH_RO_COMMON_XML)/icminstr.xml
$(XSLTP) -o $@ $^
$(PATH_RO_COMMON_XML)/gen_icinstr.hpp: \
$(PATH_RO_COMMON_XML)/genicinstrh.xslt \
$(PATH_RO_COMMON_XML)/icminstr.xml
$(XSLTP) -o $@ $^
$(PATH_RO_COMMON_XML)/gen_icopcodes.hpp : \
$(PATH_RO_COMMON_XML)/genicoph.xslt \
$(PATH_RO_COMMON_XML)/icminstr.xml
$(XSLTP) -o $@ $^
$(PATH_RO_COMMON_XML)/gen_icinstrtab.cpp: \
$(PATH_RO_COMMON_XML)/genictabc.xslt \
$(PATH_RO_COMMON_XML)/icminstr.xml
$(XSLTP) -o $@ $^
.PHONY: gen_yacc
gen_yacc: $(PATH_RO_MLC_SRC)/dummyg.cpp
$(PATH_RO_MLC_SRC)/dummyg.cpp: $(PATH_RO_MLC_SRC)/dummyg.y
$(YACC) $(YFLAGS) -o $@ $<
.PHONY: gen_lex
gen_lex: $(PATH_RW_DU)/$(DU_NUM)l.cpp
$(PATH_RW_DU)/$(DU_NUM)l.cpp: $(PATH_RW_DU)/$(DU_NUM)l.lex
$(LEX) $(LFLAGS) -o $@ $<
.PHONY: clean
clean:
find . -type f -name '*.o' -name 'gen_*.[ch]pp' -delete; \
$(RM) $(PROGRAM) \
$(PATH_RO_MLC_SRC)/dummyg.[^y]* $(PATH_RO_MLC_SRC)/stack.hh\
$(PATH_RW_DU)/$(DU_NUM)l.cpp lex.backup
.PHONY: rebuild
rebuild: clean
make
.PHONY: test
test: all
for SRC in $(PATH_RO_MLC_DU_TESTS)/*.mls; \
do \
printf "
%s
" "Using diff $(DFLAGS) on the result of `basename $$SRC .mls` . . . "; \
$(PROGRAM) "$$SRC" | $(DIFF) $(DFLAGS) "$${SRC%.mls}.out" - ; \
done