Makefile DU1 2016

Úvodní kurz překladačů se soustřeďuje zejména na teoretické i praktické základy konstrukce přední části překladače. Součástí předmětu je i cvičení zaměřující se na základy práce s nástroji pro konstrukci překladačů. Po absolvování tohoto kurzu bude posluchač schopen sestrojit vlastní překladač do mezikódu nebo jiného jazyka.
VampireBat
Matfyz(ák|ačka) level I
Příspěvky: 6
Registrován: 28. 10. 2016 18:01
Typ studia: Kombinace Informatika - Matematika

Makefile DU1 2016

Příspěvek od VampireBat »

Ahoj, dal jsem dohromady Makefile pro DÚ1. Několik poznámek.

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

VampireBat
Matfyz(ák|ačka) level I
Příspěvky: 6
Registrován: 28. 10. 2016 18:01
Typ studia: Kombinace Informatika - Matematika

Re: Makefile DU1 2016

Příspěvek od VampireBat »

Sorry, u pravidla clean je špatně ten find.
Správně tam má být:

Kód: Vybrat vše

	find . -type f \( -name '*.o' -o -name 'gen_*.[ch]pp' \) -delete; \
Ale vzhledem k tomu, že ty soubory, které ten původní find nesmaže během make clean && make (resp. make rebuild) jsou z hlediska toho úkolu readonly, to nijak zásadně nevadí.
dcepelik

Re: Makefile DU1 2016

Příspěvek od dcepelik »

Ahoj,

taky jsem dal dohromady automatický build (pro CMake). Je to na https://github.com/dcepelik/nswi098-cmake.

Hezký večer
David
Aspect

Re: Makefile DU1 2016

Příspěvek od Aspect »

teda, asi by bolo lepsie poslat nejaky oddkaz na archiv do ktoreho by si hodil ten makefile lebo takto to rozbilo odsadenie a musel som si ho prerabat
dalsia vec je ze tam mas asi nejake zle cesty ak mi nieco neuslo :D

Kód: Vybrat vše

make: *** No rule to make target `xsltproc', needed by `public-ro/common/xml/gen_aifactory.cpp'.  Stop.
subor public-ro/common/xml/gen_aifactory.cpp v zipku s prvou domacou ulohou nemam teda :D
mozno ale niekde robim chybu ja :D
Aspect

Re: Makefile DU1 2016

Příspěvek od Aspect »

uff, predpokladam ze to vlastne maju byt asi tie vygenerovane zdrojaky ktore sa mi z nejakeho dovodu nevygeneruju :D
Aspect

Re: Makefile DU1 2016

Příspěvek od Aspect »

no tak zistujem ze je to asi vsetko tym rozbitym formatovanim, mohol by si to prosimta hodit do nejakeho zipka? :)
VampireBat
Matfyz(ák|ačka) level I
Příspěvky: 6
Registrován: 28. 10. 2016 18:01
Typ studia: Kombinace Informatika - Matematika

Re: Makefile DU1 2016

Příspěvek od VampireBat »

To rozbité formátování mě mrzí, asi se někde během převodu nahradily tabulátory mezerami? Ten systém s tabulátory v Makefilech mi přijde dost nešťastný; čas od času se mi stane, že mi nějaký textový editor předělá tabulátory na mezery.
Chtěl jsem to sem dát napřímo, protože z každého linku se dřív či později vždy stane deadlink, který nikdo nezaktualizuje. Opožděně, snad pro další generace, tady je ten link: https://www.evernote.com/shard/s580/sh/ ... febc549617
Odpovědět

Zpět na „SWI098 Principy překladačů“