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