-
Notifications
You must be signed in to change notification settings - Fork 1
/
Makefile
78 lines (57 loc) · 1.73 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# Commands
JAVA=java
JAVAC=javac
JFLEX=./jflex/bin/jflex
JAVACUP=$(JAVA) java_cup.Main
RM=rm
MV=mv
# Compiler component names
LEXER=Lexer
PARSER=Parser
SYMBOL=Symbol
# Test names
LEXERTEST=LexerTest
PARSERTEST=ParserTest
LIB=/lib/i386-linux-gnu/libc.so.6
ifeq ($(wildcard $(LIB)),)
LIB=-L/usr/lib -lc
endif
# Shortcuts
COMPILE=$(JAVAC) $<
ASSEMBLE=as -32 -o $@ $<
LINK=ld -m elf_i386 -o $@ $< $(LIB) -dynamic-linker /lib/ld-linux.so.2
CMCOMPILE=java cminor.Compiler $<
# Source files
GENERATED_JAVA_SRC=cminor/lexer/$(LEXER).java cminor/parser/$(PARSER).java cminor/parser/$(SYMBOL).java
JAVA_SRC=$(GENERATED_JAVA_SRC) $(shell find cminor -name '*.java')
JAVA_CLASS=$(JAVA_SRC:.java=.class)
JAVA_CUP_CLASS=java_cup/Main.class
all: $(JAVA_CLASS)
%.class: %.java
$(COMPILE)
cminor/lexer/$(LEXER).class: cminor/lexer/$(LEXER).java cminor/parser/$(SYMBOL).java
$(COMPILE)
cminor/parser/$(PARSER).class: cminor/parser/$(PARSER).java cminor/parser/$(PARSER).java cminor/lexer/$(LEXER).java
$(COMPILE)
cminor/lexer/$(LEXER).java: cminor/lexer/$(LEXER).flex
$(JFLEX) -q $<
cminor/parser/$(PARSER).java cminor/parser/$(SYMBOL).java: cminor/parser/$(PARSER).cup $(JAVA_CUP_CLASS)
$(JAVACUP) -nosummary -nowarn -package cminor.parser -symbols $(SYMBOL) -parser $(PARSER) < $<
$(MV) $(SYMBOL).java $(PARSER).java cminor/parser
%.s: %.cm $(JAVA_CLASS)
$(CMCOMPILE)
%.o: %.s
$(ASSEMBLE)
test/ast/test%: test/ast/test%.o
$(LINK)
test/ms/test.s: test/ms/test.cminor $(JAVA_CLASS)
$(CMCOMPILE)
test/ms/test: test/ms/test.o
$(LINK)
clean: classclean
$(RM) -f $(GENERATED_JAVA_SRC) cminor/lexer/$(LEXER).java~
cleanall: clean libclean
classclean:
find cminor -name '*.class' -exec rm '{}' ';'
libclean:
find java_cup -name '*.class' -exec rm '{}' ';'