1f42a379eSMatthias Braun# include user-defined makefile settings
2f42a379eSMatthias Braun-include config.mak
3f42a379eSMatthias Braun
4b61390ddSMatthias Brauntop_srcdir   ?= .
59e6b34b5SMatthias Brauntop_builddir ?= build
696e4d866SMatthias BraunVPATH        ?= $(top_srcdir)/src
79e6b34b5SMatthias Braun
89e6b34b5SMatthias Braunvariant  ?= debug# Different libfirm variants (debug, optimize, profile, coverage)
99e6b34b5SMatthias Braunsrcdir   ?= $(top_srcdir)
109e6b34b5SMatthias Braunbuilddir ?= $(top_builddir)/$(variant)
119e6b34b5SMatthias Braun
12f2358beaSMatthias Brauninclude config.default.mak
13f2358beaSMatthias Braun
14dc828b7eSMatthias BraunAR ?= ar
15f670c08dSMatthias BraunDLLEXT ?= .so
16f670c08dSMatthias BraunLINK ?= $(CC)
17dc828b7eSMatthias Braun
18f2358beaSMatthias BraunCPPFLAGS += -I$(top_srcdir)/src -I$(builddir)
19f2358beaSMatthias Braunifneq ("$(SYSTEM_INCLUDE_DIR)","")
20f2358beaSMatthias Braun	CPPFLAGS += -DSYSTEM_INCLUDE_DIR=\"$(SYSTEM_INCLUDE_DIR)\"
21f2358beaSMatthias Braunendif
22f2358beaSMatthias Braunifneq ("$(LOCAL_INCLUDE_DIR)","")
23f2358beaSMatthias Braun	CPPFLAGS += -DLOCAL_INCLUDE_DIR=\"$(LOCAL_INCLUDE_DIR)\"
24f2358beaSMatthias Braunendif
25f2358beaSMatthias Braunifneq ("$(COMPILER_INCLUDE_DIR)","")
26f2358beaSMatthias Braun	CPPFLAGS += -DCOMPILER_INCLUDE_DIR=\"$(COMPILER_INCLUDE_DIR)\"
27f2358beaSMatthias Braunendif
28f2358beaSMatthias Braunifneq ("$(HOST_TRIPLE)","")
29f2358beaSMatthias Braun	CPPFLAGS += -DHOST_TRIPLE=\"$(HOST_TRIPLE)\"
30f2358beaSMatthias Braunendif
31f2358beaSMatthias Braunifneq ("$(MULTILIB_M32_TRIPLE)","")
32f2358beaSMatthias Braun	CPPFLAGS += -DAPPEND_MULTILIB_DIRS -DMULTILIB_M32_TRIPLE=\"$(MULTILIB_M32_TRIPLE)\" -DMULTILIB_M64_TRIPLE=\"$(MULTILIB_M64_TRIPLE)\"
33f2358beaSMatthias Braunendif
34f2358beaSMatthias Braun
355b94952eSChristoph MallonCPPFLAGS := $(CPPFLAGS) $(FIRM_CPPFLAGS)
36dbce1eafSMatthias Braun
370ac00361SMatthias BraunCFLAGS += -Wall -W -Wstrict-prototypes -Wmissing-prototypes
380ac00361SMatthias Braun# With -std=c99 we get __STRICT_ANSI__ which disables all posix declarations
390ac00361SMatthias Braun# in cygwin, regardless of a set POSIX_C_SOURCE feature test macro.
40681bd376SChristoph Mallonifneq ($(filter %cygwin %mingw32, $(shell $(CC) $(CFLAGS) -dumpmachine)),)
41681bd376SChristoph MallonCFLAGS += -std=gnu99
42681bd376SChristoph Mallonelse
430ac00361SMatthias BraunCFLAGS += -std=c99 -pedantic
440ac00361SMatthias Braunendif
459e6b34b5SMatthias BraunCFLAGS_debug    = -O0 -g
46c45841bbSMatthias BraunCFLAGS_optimize = -O3 -fomit-frame-pointer -DNDEBUG -DNO_DEFAULT_VERIFY
479e6b34b5SMatthias BraunCFLAGS_profile  = -pg -O3 -fno-inline
489e6b34b5SMatthias BraunCFLAGS_coverage = --coverage -O0
49ef033077SAndreas ZwinkauCFLAGS += $(CFLAGS_$(variant))
50d5e8df58SMatthias Braun
519e6b34b5SMatthias BraunLINKFLAGS_profile  = -pg
529e6b34b5SMatthias BraunLINKFLAGS_coverage = --coverage
535b94952eSChristoph MallonLINKFLAGS := $(LINKFLAGS) $(LINKFLAGS_$(variant)) $(FIRM_LIBS)
54d5e8df58SMatthias Braun
55f783a0a0SChristoph Mallonlibcparser_SOURCES := $(wildcard $(top_srcdir)/src/*/*.c)
56dc828b7eSMatthias Braunlibcparser_OBJECTS = $(libcparser_SOURCES:%.c=$(builddir)/%.o)
57dc828b7eSMatthias Braunlibcparser_DEPS    = $(libcparser_OBJECTS:%.o=%.d)
58dc828b7eSMatthias Braunlibcparser_A       = $(builddir)/libcparser.a
59f670c08dSMatthias Braunlibcparser_DLL     = $(builddir)/libcparser$(DLLEXT)
60dc828b7eSMatthias Braun
61d9d84decSMatthias Brauncparser_SOURCES = main.c $(libcparser_SOURCES)
629e6b34b5SMatthias Brauncparser_OBJECTS = $(cparser_SOURCES:%.c=$(builddir)/%.o)
639e6b34b5SMatthias Brauncparser_DEPS    = $(cparser_OBJECTS:%.o=%.d)
64dc828b7eSMatthias Brauncparser_EXE     = $(builddir)/cparser
65d5e8df58SMatthias Braun
66dc828b7eSMatthias BraunCPARSERS = $(addsuffix .check, $(cparser_SOURCES) $(libcparser_SOURCES))
67ce51ade6SMatthias BraunCPARSEROS = $(cparser_SOURCES:%.c=$(builddir)/cpb/%.o)
68ce51ade6SMatthias BraunCPARSEROS2 = $(cparser_SOURCES:%.c=$(builddir)/cpb2/%.o)
69dbce1eafSMatthias Braun
70a16b648eSMatthias Braun# This hides the noisy commandline outputs. Show them with "make V=1"
71a16b648eSMatthias Braunifneq ($(V),1)
72a16b648eSMatthias BraunQ ?= @
73a16b648eSMatthias Braunendif
74d5e8df58SMatthias Braun
75dc828b7eSMatthias Braunall: $(cparser_EXE)
76d5e8df58SMatthias Braun
779e6b34b5SMatthias Braun# disable make builtin suffix rules
789e6b34b5SMatthias Braun.SUFFIXES:
799e6b34b5SMatthias Braun
809e6b34b5SMatthias Braun-include $(cparser_DEPS)
81a2a3f2e7SMatthias Braun
82dc828b7eSMatthias Braun.PHONY: all bootstrap bootstrap2 clean check libfirm_subdir
83d5e8df58SMatthias Braun
84dc828b7eSMatthias BraunDIRS   := $(sort $(dir $(cparser_OBJECTS) $(libcparser_OBJECTS)))
85dc828b7eSMatthias BraunUNUSED := $(shell mkdir -p $(DIRS) $(DIRS:$(builddir)/%=$(builddir)/cpb/%) $(DIRS:$(builddir)/%=$(builddir)/cpb2/%))
8605e884d1SMatthias Braun
874c2a4f5eSMatthias BraunREVISIONH = $(builddir)/revision.h
889da01500SMatthias BraunREVISION ?= $(shell git --git-dir $(top_srcdir)/.git describe --abbrev=40 --always --dirty --match '')
893db97878SChristoph Mallon
90dd6157c9SMatthias Braun# Flags to be used when cparser checks its own sourcecode for warnings
91dd6157c9SMatthias BraunSELFCHECK_FLAGS ?= -Wall -Wno-shadow -Werror
92dd6157c9SMatthias Braun
933db97878SChristoph Mallon# Update revision.h if necessary
948ec1a761SAndreas FriedHASH := \#
953db97878SChristoph MallonUNUSED := $(shell \
968ec1a761SAndreas Fried	REV="$(HASH)define cparser_REVISION \"$(REVISION)\""; \
974c2a4f5eSMatthias Braun	echo "$$REV" | cmp -s - $(REVISIONH) 2> /dev/null || echo "$$REV" > $(REVISIONH) \
983db97878SChristoph Mallon)
991f3cc963SMatthias Braun# determine if we can use "cparser-beta" as quickcheck
100d6f43a85SChristoph MallonQUICKCHECK_DEFAULT := $(shell which cparser-beta 2> /dev/null || echo true) -fsyntax-only
101d9d7d238SLuca BarbatoQUICKCHECK ?= $(QUICKCHECK_DEFAULT)
102f68de168SMatthias Braun
103d9d84decSMatthias Braun$(cparser_EXE): $(LIBFIRM_FILE) $(cparser_OBJECTS)
104dc828b7eSMatthias Braun	@echo 'LD $@'
105f670c08dSMatthias Braun	$(Q)$(LINK) $(cparser_OBJECTS) $(LIBFIRM_FILE) -o $@ $(LINKFLAGS)
106dc828b7eSMatthias Braun
107dc828b7eSMatthias Braun$(libcparser_A): $(libcparser_OBJECTS)
108dc828b7eSMatthias Braun	@echo 'AR $@'
1093edbb09eSSebastian Buchwald	$(Q)$(AR) -crs $@ $^
110f42a379eSMatthias Braun
111f670c08dSMatthias Braun$(libcparser_DLL): $(libcparser_OBJECTS) $(LIBFIRM_FILE_DLL)
112f670c08dSMatthias Braun	@echo 'LINK $@'
113f670c08dSMatthias Braun	$(Q)$(LINK) -shared $^ $(LINKFLAGS) -o "$@"
114f670c08dSMatthias Braun
115f42a379eSMatthias Braunifneq ("$(LIBFIRM_FILE)", "")
116db6e4c03SManuel Mohrifneq ("$(MAKECMDGOALS)", "clean")
117f42a379eSMatthias Braun$(LIBFIRM_FILE): libfirm_subdir
118f42a379eSMatthias Braun# Re-evaluate Makefile after libfirm_subdir has been executed
119451c15e3SAndreas ZwinkauMakefile: libfirm_subdir
120f42a379eSMatthias Braun# Build libfirm in subdirectory
121451c15e3SAndreas Zwinkaulibfirm_subdir:
12215a116e9SMatthias Braun	$(Q)$(MAKE) -w -C $(FIRM_HOME) $(LIBFIRM_FILE_BASE)
123f670c08dSMatthias Braun
124f670c08dSMatthias Braun$(LIBFIRM_FILE_DLL): libfirm_subdir_dll
125f670c08dSMatthias Braunlibfirm_subdir_dll:
12615a116e9SMatthias Braun	$(Q)$(MAKE) -w -C $(FIRM_HOME) $(LIBFIRM_FILE_DLL_BASE)
1275ec1f0ebSAndreas Zwinkauendif
128db6e4c03SManuel Mohrendif
129dbce1eafSMatthias Braun
130dc828b7eSMatthias Brauncheck: $(CPARSERS)
131dd6157c9SMatthias Braun	@echo 'CHECK OPTIONS'
132dd6157c9SMatthias Braun	$(Q)cd $(top_srcdir) ; support/check_options.py
133c72318ccSMatthias Braun
13403b79316SChristoph Mallonbootstrap: cparser.bootstrap
13558865fafSMatthias Braun
13603b79316SChristoph Mallonbootstrap2: cparser.bootstrap2
1374e073a11SMatthias Braun
138dc828b7eSMatthias Braun%.c.check: %.c $(cparser_EXE)
139dc828b7eSMatthias Braun	@echo 'CHECK $<'
140dd6157c9SMatthias Braun	$(Q)$(cparser_EXE) $(CPPFLAGS) $(SELFCHECK_FLAGS) -fsyntax-only $<
141c72318ccSMatthias Braun
142dc828b7eSMatthias Braun$(builddir)/cpb/%.o: %.c $(cparser_EXE)
143dc828b7eSMatthias Braun	@echo 'CPARSER $<'
144dc828b7eSMatthias Braun	$(Q)$(cparser_EXE) -m32 $(CPPFLAGS) -std=c99 -Wall -g3 -c $< -o $@
14558865fafSMatthias Braun
1469e6b34b5SMatthias Braun$(builddir)/cpb2/%.o: %.c cparser.bootstrap
147dc828b7eSMatthias Braun	@echo 'CPARSER.BOOTSTRAP $<'
148dc828b7eSMatthias Braun	$(Q)./cparser.bootstrap -m32 $(CPPFLAGS) -Wall -g -c $< -o $@
1494e073a11SMatthias Braun
1504e073a11SMatthias Brauncparser.bootstrap: $(CPARSEROS)
151dc828b7eSMatthias Braun	@echo 'LD $@'
152dc828b7eSMatthias Braun	$(Q)$(cparser_EXE) -m32 $(CPARSEROS) $(LIBFIRM_FILE) $(LINKFLAGS) -o $@
153abb8fbf8SMatthias Braun
1546e7d6449SChristoph Malloncparser.bootstrap2: cparser.bootstrap $(CPARSEROS2)
155dc828b7eSMatthias Braun	@echo 'LD $@'
156dc828b7eSMatthias Braun	$(Q)./cparser.bootstrap -m32 $(CPARSEROS2) $(LIBFIRM_FILE) $(LINKFLAGS) -o $@
1574e073a11SMatthias Braun
1589e6b34b5SMatthias Braun$(builddir)/%.o: %.c
159dc828b7eSMatthias Braun	@echo 'CC $@'
160dd6157c9SMatthias Braun	$(Q)$(QUICKCHECK) $(CPPFLAGS) $(SELFCHECK_FLAGS) $<
161e5e8d612SMatthias Braun	$(Q)$(CC) $(CPPFLAGS) $(CFLAGS) -MP -MMD -c -o $@ $<
162d5e8df58SMatthias Braun
163d5e8df58SMatthias Braunclean:
164dc828b7eSMatthias Braun	@echo 'CLEAN'
1659c7a0a57SChristoph Mallon	$(Q)rm -rf $(builddir)
1663fd69e64SMatthias Braun
1673fd69e64SMatthias Braun.PHONY: install
1683fd69e64SMatthias BraunPREFIX ?= /usr/local
1693fd69e64SMatthias BraunINSTALL ?= install
1703fd69e64SMatthias BraunBINDIR = $(DESTDIR)$(PREFIX)/bin
171c493a350SMatthias BraunMANDIR = $(DESTDIR)$(PREFIX)/share/man
1723fd69e64SMatthias Brauninstall: $(cparser_EXE)
1733fd69e64SMatthias Braun	$(INSTALL) -d $(DESTDIR)$(COMPILER_INCLUDE_DIR)
1743fd69e64SMatthias Braun	$(INSTALL) -m0644 include/*.h $(DESTDIR)$(COMPILER_INCLUDE_DIR)
1753fd69e64SMatthias Braun	$(INSTALL) -d $(BINDIR)
1763fd69e64SMatthias Braun	$(INSTALL) -m0755 $< $(BINDIR)
177c493a350SMatthias Braun	$(INSTALL) -d $(MANDIR)/man1
178c493a350SMatthias Braun	$(INSTALL) -m0644 cparser.1 $(MANDIR)/man1
179