srcdir ?= $(top_srcdir)
builddir ?= $(top_builddir)/$(variant)
+docdir ?= $(top_builddir)/doc
# This hides the noisy commandline outputs. You can see them with "make Q="
Q ?= @
CC ?= cc
+DOXYGEN ?= doxygen
LINK ?= $(CC)
-AR ?= ar ru
-RANLIB ?= ranlib
+AR ?= ar
DLLEXT ?= .so
# Variants
-CFLAGS_debug = -O0 -g3 -DDEBUG_libfirm
-CFLAGS_profile = -O3 -pg -DNDEBUG -fno-inline
+CFLAGS_all = -std=c99 -fPIC -DHAVE_FIRM_REVISION_H
+CFLAGS_debug = $(CFLAGS_all) -O0 -g3 -DDEBUG_libfirm
+CFLAGS_profile = $(CFLAGS_all) -O3 -pg -DNDEBUG -fno-inline
LINKFLAGS_profile = -pg
-CFLAGS_optimize = -O3 -DNDEBUG
+CFLAGS_optimize = $(CFLAGS_all) -O3 -DNDEBUG
# General flags
CFLAGS += $(CFLAGS_$(variant))
CFLAGS += -Wall -W -Wextra -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings
-LINKFLAGS += $(LINKFLAGS_$(variant))
+LINKFLAGS += $(LINKFLAGS_$(variant)) -lm
VPATH = $(srcdir)
+REVISION ?= $(shell git describe --abbrev=40 --always --dirty --match '')
+
+# Update revision.h if necessary
+UNUSED := $(shell \
+ REV="\#define libfirm_VERSION_REVISION \"$(REVISION)\""; \
+ echo "$$REV" | cmp -s - firm_revision.h 2> /dev/null || echo "$$REV" > firm_revision.h \
+)
+
.PHONY: all
all: firm
backends = amd64 arm ia32 sparc TEMPLATE
EMITTER_GENERATOR = $(srcdir)ir/be/scripts/generate_emitter.pl
+EMITTER_GENERATOR2 = $(srcdir)ir/be/scripts/generate_emitter_new.pl
REGALLOC_IF_GENERATOR = $(srcdir)ir/be/scripts/generate_regalloc_if.pl
OPCODES_GENERATOR = $(srcdir)ir/be/scripts/generate_new_opcodes.pl
-MACHINE_GENERATOR = $(srcdir)ir/be/scripts/generate_machine.pl
define backend_template
$(1)_SOURCES = $$(wildcard ir/be/$(1)/*.c)
$(1)_SPEC = ir/be/$(1)/$(1)_spec.pl
-$$(srcdir)ir/be/$(1)/gen_$(1)_emitter.h $$(srcdir)ir/be/$(1)/gen_$(1)_emitter.c: $$($(1)_SPEC) $$(EMITTER_GENERATOR)
+$$(srcdir)ir/be/$(1)/gen_$(1)_emitter.h $$(srcdir)ir/be/$(1)/gen_$(1)_emitter.c: $$($(1)_SPEC) $$(EMITTER_GENERATOR) $(EMITTER_GENERATOR2)
@echo GEN $$@
$(Q)$$(EMITTER_GENERATOR) $$($(1)_SPEC) $$(srcdir)ir/be/$(1)
$(1)_SOURCES += ir/be/$(1)/gen_$(1)_emitter.c
$(1)_SOURCES += ir/be/$(1)/gen_$(1)_regalloc_if.c
$(1)_GEN_HEADERS += ir/be/$(1)/gen_$(1)_regalloc_if.h
-$$(srcdir)ir/be/$(1)/gen_$(1)_machine.h $$(srcdir)ir/be/$(1)/gen_$(1)_machine.c: $$($(1)_SPEC) $$(MACHINE_GENERATOR)
- @echo GEN $$@
- $(Q)$$(MACHINE_GENERATOR) $$($(1)_SPEC) $$(srcdir)ir/be/$(1)
-$(1)_SOURCES += ir/be/$(1)/gen_$(1)_machine.c
-$(1)_GEN_HEADERS += ir/be/$(1)/gen_$(1)_machine.h
-
$$(srcdir)ir/be/$(1)/gen_$(1)_new_nodes.h $$(srcdir)ir/be/$(1)/gen_$(1)_new_nodes.c.inl: $$($(1)_SPEC) $$(OPCODES_GENERATOR)
@echo GEN $$@
$(Q)$$(OPCODES_GENERATOR) $$($(1)_SPEC) $$(srcdir)ir/be/$(1)
$(Q)$(IR_SPEC_GENERATOR) $(IR_SPEC) ir/ir
IR_IO_GENERATOR := scripts/gen_ir_io.py
-IR_IO_GENERATED_FILES := \
- ir/ir/gen_irio_import.inl \
- ir/ir/gen_irio_export.inl \
- ir/ir/gen_irio_lex.inl
+IR_IO_GENERATED_FILES := ir/ir/gen_irio.inl
$(IR_IO_GENERATED_FILES): $(IR_IO_GENERATOR) $(IR_SPEC) scripts/spec_util.py
@echo GEN $@
$(libfirm_a): $(libfirm_OBJECTS)
@echo AR $@
- $(Q)$(AR) ru $@ $^
- @echo RANLIB $@
- $(Q)$(RANLIB) $@
+ $(Q)$(AR) -cru $@ $^
$(libfirm_dll): $(libfirm_OBJECTS)
@echo LINK $@
- $(Q)$(LINK) -shared -o $@ $^
+ $(Q)$(LINK) -shared $(LINKFLAGS) -o $@ $^
# Generic rules
UNUSED := $(shell mkdir -p $(libfirm_DIRS:%=$(builddir)/%))
@echo CC $@
$(Q)$(CC) $(CFLAGS) $(CPPFLAGS) $(libfirm_CPPFLAGS) -MMD -c -o $@ $<
+$(docdir)/libfirm.tag: $(IR_SPEC_GENERATED_FILES) Doxyfile $(wildcard include/libfirm/*.h) $(wildcard include/libfirm/adt/*.h)
+ @echo Doxygen $@
+ $(Q)$(DOXYGEN)
+
+DOCU_GENERATOR := scripts/gen_docu.py
+$(docdir)/html/nodes.html: $(docdir)/libfirm.tag $(DOCU_GENERATOR) $(IR_SPEC) scripts/spec_util.py scripts/style.css
+ @echo gen_docu.py $@
+ $(Q)$(DOCU_GENERATOR) $(docdir)/libfirm.tag "" $@
+ $(Q)cp scripts/style.css $(docdir)/html
+
+.PHONY: doc
+doc: $(docdir)/libfirm.tag $(docdir)/html/nodes.html
+
.PHONY: clean
clean:
@echo CLEAN
$(Q)rm -f $(libfirm_OBJECTS)
$(Q)rm -f $(libfirm_TARGET)
+ $(Q)rm -f $(shell find ir/ -name "gen_*.[ch]")