1REVISION = "0.9.14"
2# include user-defined makefile settings
3-include config.mak
4
5top_srcdir   ?=
6top_builddir ?= build
7
8variant  ?= optimize# Different libfirm variants (debug, optimize, profile, coverage)
9srcdir   ?= $(top_srcdir)
10builddir ?= $(top_builddir)/$(variant)
11
12#VPATH = $(srcdir)
13
14# Use libfirm subdir if it exists, otherwise use pkg-config
15ifneq ("$(wildcard libfirm)", "")
16FIRM_HOME     ?= libfirm
17FIRM_CPPFLAGS ?= -I$(FIRM_HOME)/include
18FIRM_LIBS     ?= -lm
19LIBFIRM_FILE_BASE ?= build/$(variant)/libfirm.a
20LIBFIRM_FILE  ?= $(FIRM_HOME)/$(LIBFIRM_FILE_BASE)
21else
22FIRM_CPPFLAGS ?= `pkg-config --cflags libfirm`
23FIRM_LIBS     ?= `pkg-config --libs libfirm`
24LIBFIRM_FILE =
25endif
26
27CPPFLAGS  = -I.
28CPPFLAGS += $(FIRM_CPPFLAGS)
29
30CFLAGS += -Wall -W -Wstrict-prototypes -Wmissing-prototypes -std=c99
31CFLAGS_debug    = -O0 -g
32CFLAGS_optimize = -O3 -fomit-frame-pointer -DNDEBUG
33CFLAGS_profile  = -pg -O3 -fno-inline
34CFLAGS_coverage = --coverage -O0
35CFLAGS += $(CFLAGS_$(variant))
36
37LINKFLAGS_profile  = -pg
38LINKFLAGS_coverage = --coverage
39LINKFLAGS += $(LINKFLAGS_$(variant)) $(FIRM_LIBS)
40
41cparser_SOURCES = \
42	adt/strset.c \
43	adt/strutil.c \
44	adt/pset_new.c \
45	attribute.c \
46	parser.c \
47	ast.c \
48	ast2firm.c \
49	builtins.c \
50	diagnostic.c \
51	driver/firm_machine.c \
52	driver/firm_opt.c \
53	driver/firm_timing.c \
54	entity.c \
55	entitymap.c \
56	format_check.c \
57	input.c \
58	jump_target.c \
59	main.c \
60	mangle.c \
61	preprocessor.c \
62	printer.c \
63	string_rep.c \
64	symbol_table.c \
65	token.c \
66	type.c \
67	type_hash.c \
68	types.c \
69	help.c \
70	warning.c \
71	walk.c \
72	wrappergen/write_fluffy.c \
73	wrappergen/write_jna.c \
74	wrappergen/write_compoundsizes.c
75cparser_OBJECTS = $(cparser_SOURCES:%.c=$(builddir)/%.o)
76cparser_DEPS    = $(cparser_OBJECTS:%.o=%.d)
77
78SPLINTS = $(addsuffix .splint, $(cparser_SOURCES))
79CPARSERS = $(addsuffix .cparser, $(cparser_SOURCES))
80CPARSEROS = $(cparser_SOURCES:%.c=$(builddir)/cpb/%.o)
81CPARSEROS_E = $(cparser_SOURCES:%.c=$(builddir)/cpbe/%.o)
82CPARSEROS2 = $(cparser_SOURCES:%.c=$(builddir)/cpb2/%.o)
83
84Q = @
85
86GOAL = $(builddir)/cparser
87all: $(GOAL)
88
89# disable make builtin suffix rules
90.SUFFIXES:
91
92-include $(cparser_DEPS)
93
94.PHONY: all bootstrap bootstrap2 bootstrape clean selfcheck splint libfirm_subdir
95
96$(cparser_SOURCES): config.h
97config.h:
98	cp config.h.in $@
99
100%.h:
101	@true
102
103REVISION ?= $(shell git describe --abbrev=40 --always --dirty --match '')
104
105# Update revision.h if necessary
106UNUSED := $(shell \
107	REV="#define cparser_REVISION \"$(REVISION)\""; \
108	echo "$$REV" | cmp -s - revision.h 2> /dev/null || echo "$$REV" > revision.h \
109)
110
111DIRS   := $(sort $(dir $(cparser_OBJECTS)))
112UNUSED := $(shell mkdir -p $(DIRS) $(DIRS:$(builddir)/%=$(builddir)/cpb/%) $(DIRS:$(builddir)/%=$(builddir)/cpb2/%) $(DIRS:$(builddir)/%=$(builddir)/cpbe/%))
113
114$(GOAL): $(LIBFIRM_FILE) $(cparser_OBJECTS)
115	@echo "===> LD $@"
116	$(Q)$(CC) $(cparser_OBJECTS) $(LIBFIRM_FILE) -o $(GOAL) $(LINKFLAGS)
117
118ifneq ("$(LIBFIRM_FILE)", "")
119ifneq ("$(MAKECMDGOALS)", "clean")
120$(LIBFIRM_FILE): libfirm_subdir
121# Re-evaluate Makefile after libfirm_subdir has been executed
122Makefile: libfirm_subdir
123# Build libfirm in subdirectory
124libfirm_subdir:
125	$(Q)$(MAKE) -C $(FIRM_HOME) $(LIBFIRM_FILE_BASE)
126endif
127endif
128
129splint: $(SPLINTS)
130
131selfcheck: $(CPARSERS)
132
133bootstrap: cparser.bootstrap
134
135bootstrape: cparser.bootstrape
136
137bootstrap2: cparser.bootstrap2
138
139%.c.splint: %.c
140	@echo '===> SPLINT $<'
141	$(Q)splint $(CPPFLAGS) $<
142
143%.c.cparser: %.c
144	@echo '===> CPARSER $<'
145	$(Q)./cparser $(CPPFLAGS) -fsyntax-only $<
146
147$(builddir)/cpb/%.o: %.c $(builddir)/cparser
148	@echo '===> CPARSER $<'
149	$(Q)./$(builddir)/cparser $(CPPFLAGS) -std=c99 -Wall -g3 -c $< -o $@
150
151$(builddir)/cpbe/%.o: %.c
152	@echo '===> ECCP $@'
153	$(Q)eccp $(CPPFLAGS) -std=c99 -Wall -c $< -o $@
154
155$(builddir)/cpb2/%.o: %.c cparser.bootstrap
156	@echo '===> CPARSER.BOOTSTRAP $<'
157	$(Q)./cparser.bootstrap $(CPPFLAGS) -Wall -g -c $< -o $@
158
159cparser.bootstrap: $(CPARSEROS)
160	@echo "===> LD $@"
161	$(Q)./$(builddir)/cparser $(CPARSEROS) $(LIBFIRM_FILE) $(LINKFLAGS) -o $@
162
163cparser.bootstrape: $(CPARSEROS_E)
164	@echo "===> LD $@"
165	$(Q)gcc $(CPARSEROS_E) $(LINKFLAGS) -o $@
166
167cparser.bootstrap2: cparser.bootstrap $(CPARSEROS2)
168	@echo "===> LD $@"
169	$(Q)./cparser.bootstrap $(CPARSEROS2) $(LIBFIRM_FILE) $(LINKFLAGS) -o $@
170
171$(builddir)/%.o: %.c
172	@echo '===> CC $@'
173	$(Q)$(CC) $(CPPFLAGS) $(CFLAGS) -MMD -c -o $@ $<
174
175clean:
176	@echo '===> CLEAN'
177	$(Q)rm -rf $(cparser_OBJECTS) $(GOAL)
178