3 # This is currently experimental and not fully supported, but we plan to replace
4 # the jambuild with this at some point in the future.
6 # Most variable names are similar to the names used by autoconf...
9 # Some build configuration defaults
15 srcdir ?= $(top_srcdir)
16 builddir ?= $(top_builddir)/$(variant)
18 # This hides the noisy commandline outputs. You can see them with "make Q="
28 CFLAGS_debug = -O0 -g3 -DDEBUG_libfirm
29 CFLAGS_profile = -O3 -pg -DNDEBUG -fno-inline
30 LINKFLAGS_profile = -pg
31 CFLAGS_optimize = -O3 -DNDEBUG
34 CFLAGS += $(CFLAGS_$(variant))
35 CFLAGS += -Wall -W -Wextra -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings
36 LINKFLAGS += $(LINKFLAGS_$(variant))
42 # A very naive way to create a config.h if it is missing
46 $(Q)echo "#define libfirm_VERSION_MAJOR 1" >> $@
47 $(Q)echo "#define libfirm_VERSION_MICRO 0" >> $@
48 $(Q)echo "#define libfirm_VERSION_MINOR 20" >> $@
49 $(Q)echo "#define HAVE_LONG_DOUBLE 1" >> $@
50 $(Q)echo "#define FIRM_STATISTICS" >> $@
72 libfirm_SOURCES = $(foreach dir,$(libfirm_DIRS),$(wildcard $(dir)/*.c))
73 libfirm_a = $(builddir)/libfirm.a
74 libfirm_dll = $(builddir)/libfirm$(DLLEXT)
75 libfirm_CPPFLAGS = -Iinclude/libfirm -Iinclude/libfirm/adt -I. $(foreach dir,$(libfirm_DIRS),-I$(dir))
81 backends = amd64 arm ia32 sparc TEMPLATE
83 EMITTER_GENERATOR = $(srcdir)ir/be/scripts/generate_emitter.pl
84 REGALLOC_IF_GENERATOR = $(srcdir)ir/be/scripts/generate_regalloc_if.pl
85 OPCODES_GENERATOR = $(srcdir)ir/be/scripts/generate_new_opcodes.pl
86 MACHINE_GENERATOR = $(srcdir)ir/be/scripts/generate_machine.pl
88 define backend_template
89 $(1)_SOURCES = $$(wildcard ir/be/$(1)/*.c)
90 $(1)_SOURCES := $$(filter-out ir/be/$(1)/gen_%.c, $$($(1)_SOURCES))
93 $(1)_SPEC = ir/be/$(1)/$(1)_spec.pl
95 $$(srcdir)ir/be/$(1)/gen_$(1)_emitter.h $$(srcdir)ir/be/$(1)/gen_$(1)_emitter.c: $$($(1)_SPEC) $$(EMITTER_GENERATOR)
97 $(Q)$$(EMITTER_GENERATOR) $$($(1)_SPEC) $$(srcdir)ir/be/$(1)
98 $(1)_SOURCES += ir/be/$(1)/gen_$(1)_emitter.c
99 $(1)_GEN_HEADERS += ir/be/$(1)/gen_$(1)_emitter.h
101 $$(srcdir)ir/be/$(1)/gen_$(1)_regalloc_if.h $$(srcdir)ir/be/$(1)/gen_$(1)_regalloc_if.c: $$($(1)_SPEC) $$(REGALLOC_IF_GENERATOR)
103 $(Q)$$(REGALLOC_IF_GENERATOR) $$($(1)_SPEC) $$(srcdir)ir/be/$(1)
104 $(1)_SOURCES += ir/be/$(1)/gen_$(1)_regalloc_if.c
105 $(1)_GEN_HEADERS += ir/be/$(1)/gen_$(1)_regalloc_if.h
107 $$(srcdir)ir/be/$(1)/gen_$(1)_machine.h $$(srcdir)ir/be/$(1)/gen_$(1)_machine.c: $$($(1)_SPEC) $$(MACHINE_GENERATOR)
109 $(Q)$$(MACHINE_GENERATOR) $$($(1)_SPEC) $$(srcdir)ir/be/$(1)
110 $(1)_SOURCES += ir/be/$(1)/gen_$(1)_machine.c
111 $(1)_GEN_HEADERS += ir/be/$(1)/gen_$(1)_machine.h
113 $$(srcdir)ir/be/$(1)/gen_$(1)_new_nodes.h $$(srcdir)ir/be/$(1)/gen_$(1)_new_nodes.c.inl: $$($(1)_SPEC) $$(OPCODES_GENERATOR)
115 $(Q)$$(OPCODES_GENERATOR) $$($(1)_SPEC) $$(srcdir)ir/be/$(1)
116 $(1)_GEN_HEADERS += ir/be/$(1)/gen_$(1)_new_nodes.h
118 ir/be/$(1)/$(1)_new_nodes.c: ir/be/$(1)/gen_$(1)_new_nodes.c.inl
120 # We need to inform make of the headers it doesn't know yet...
121 $(1)_OBJECTS = $$($(1)_SOURCES:%.c=$$(builddir)/%.o)
122 $$($(1)_OBJECTS): $$($(1)_GEN_HEADERS)
124 libfirm_SOURCES += $$($(1)_SOURCES)
125 libfirm_DIRS += ir/be/$(1)
128 $(foreach backend,$(backends),$(eval $(call backend_template,$(backend))))
131 IR_SPEC_GENERATED_FILES := \
132 include/libfirm/nodeops.h \
133 include/libfirm/opcodes.h \
134 ir/ir/gen_ir_cons.c.inl \
135 ir/ir/gen_irop.c.inl \
136 ir/ir/gen_irnode.c.inl \
138 IR_SPEC_GENERATOR := scripts/gen_ir.py
139 IR_SPEC := scripts/ir_spec.py
141 $(IR_SPEC_GENERATED_FILES): $(IR_SPEC_GENERATOR) $(IR_SPEC) scripts/spec_util.py
143 $(Q)$(IR_SPEC_GENERATOR) $(IR_SPEC) ir/ir
145 IR_IO_GENERATOR := scripts/gen_ir_io.py
146 IR_IO_GENERATED_FILES := \
147 ir/ir/gen_irio_import.inl \
148 ir/ir/gen_irio_export.inl \
149 ir/ir/gen_irio_lex.inl
151 $(IR_IO_GENERATED_FILES): $(IR_IO_GENERATOR) $(IR_SPEC) scripts/spec_util.py
153 $(Q)$(IR_IO_GENERATOR) $(IR_SPEC) ir/ir
155 ir/ir/irio.c: $(IR_IO_GENERATED_FILES)
157 libfirm_OBJECTS = $(libfirm_SOURCES:%.c=$(builddir)/%.o)
158 libfirm_DEPS = $(libfirm_OBJECTS:%.o=%.d)
159 -include $(libfirm_DEPS)
161 $(libfirm_a): $(libfirm_OBJECTS)
167 $(libfirm_dll): $(libfirm_OBJECTS)
169 $(Q)$(LINK) -shared -o $@ $^
172 UNUSED := $(shell mkdir -p $(libfirm_DIRS:%=$(builddir)/%))
173 $(builddir)/%.o: %.c $(IR_SPEC_GENERATED_FILES) config.h
175 $(Q)$(CC) $(CFLAGS) $(CPPFLAGS) $(libfirm_CPPFLAGS) -MMD -c -o $@ $<
180 $(Q)rm -f $(libfirm_OBJECTS)
181 $(Q)rm -f $(libfirm_TARGET)