1 # include user-defined makefile settings
7 variant ?= debug# Different libfirm variants (debug, optimize, profile, coverage)
8 srcdir ?= $(top_srcdir)
9 builddir ?= $(top_builddir)/$(variant)
13 # Use libfirm subdir if it exists, otherwise use pkg-config
14 ifneq ("$(wildcard libfirm)", "")
16 FIRM_CPPFLAGS ?= -I$(FIRM_HOME)/include
18 LIBFIRM_FILE_BASE ?= build/$(variant)/libfirm.a
19 LIBFIRM_FILE ?= $(FIRM_HOME)/$(LIBFIRM_FILE_BASE)
21 FIRM_CPPFLAGS ?= `pkg-config --cflags libfirm`
22 FIRM_LIBS ?= `pkg-config --libs libfirm`
27 CPPFLAGS += $(FIRM_CPPFLAGS)
29 CFLAGS += -Wall -W -Wstrict-prototypes -Wmissing-prototypes -std=c99
31 CFLAGS_optimize = -O3 -fomit-frame-pointer -DNDEBUG
32 CFLAGS_profile = -pg -O3 -fno-inline
33 CFLAGS_coverage = --coverage -O0
34 CFLAGS += $(CFLAGS_$(variant))
36 LINKFLAGS_profile = -pg
37 LINKFLAGS_coverage = --coverage
38 LINKFLAGS += $(LINKFLAGS_$(variant)) $(FIRM_LIBS)
50 driver/firm_machine.c \
52 driver/firm_timing.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)
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)
85 GOAL = $(builddir)/cparser
88 # disable make builtin suffix rules
91 -include $(cparser_DEPS)
93 .PHONY: all bootstrap bootstrap2 bootstrape clean selfcheck splint libfirm_subdir
95 $(cparser_SOURCES): config.h
102 REVISION ?= $(shell git describe --abbrev=40 --always --dirty --match '')
104 # Update revision.h if necessary
106 REV="\#define cparser_REVISION \"$(REVISION)\""; \
107 echo "$$REV" | cmp -s - revision.h 2> /dev/null || echo "$$REV" > revision.h \
110 DIRS := $(sort $(dir $(cparser_OBJECTS)))
111 UNUSED := $(shell mkdir -p $(DIRS) $(DIRS:$(builddir)/%=$(builddir)/cpb/%) $(DIRS:$(builddir)/%=$(builddir)/cpb2/%) $(DIRS:$(builddir)/%=$(builddir)/cpbe/%))
113 $(GOAL): $(LIBFIRM_FILE) $(cparser_OBJECTS)
115 $(Q)$(CC) $(cparser_OBJECTS) $(LIBFIRM_FILE) -o $(GOAL) $(LINKFLAGS)
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
124 $(Q)$(MAKE) -C $(FIRM_HOME) $(LIBFIRM_FILE_BASE)
130 selfcheck: $(CPARSERS)
132 bootstrap: cparser.bootstrap
134 bootstrape: cparser.bootstrape
136 bootstrap2: cparser.bootstrap2
139 @echo '===> SPLINT $<'
140 $(Q)splint $(CPPFLAGS) $<
143 @echo '===> CPARSER $<'
144 $(Q)./cparser $(CPPFLAGS) -fsyntax-only $<
146 $(builddir)/cpb/%.o: %.c $(builddir)/cparser
147 @echo '===> CPARSER $<'
148 $(Q)./$(builddir)/cparser $(CPPFLAGS) -std=c99 -Wall -g3 -c $< -o $@
150 $(builddir)/cpbe/%.o: %.c
152 $(Q)eccp $(CPPFLAGS) -std=c99 -Wall -c $< -o $@
154 $(builddir)/cpb2/%.o: %.c cparser.bootstrap
155 @echo '===> CPARSER.BOOTSTRAP $<'
156 $(Q)./cparser.bootstrap $(CPPFLAGS) -Wall -g -c $< -o $@
158 cparser.bootstrap: $(CPARSEROS)
160 $(Q)./$(builddir)/cparser $(CPARSEROS) $(LINKFLAGS) -o $@
162 cparser.bootstrape: $(CPARSEROS_E)
164 $(Q)gcc $(CPARSEROS_E) $(LINKFLAGS) -o $@
166 cparser.bootstrap2: cparser.bootstrap $(CPARSEROS2)
168 $(Q)./cparser.bootstrap $(CPARSEROS2) $(LINKFLAGS) -o $@
172 $(Q)$(CC) $(CPPFLAGS) $(CFLAGS) -MMD -c -o $@ $<
176 $(Q)rm -rf $(cparser_OBJECTS) $(GOAL)