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