1# makefile to compile MCPP version 2.7.2 for FreeBSD / GCC / UCB make
2#       2008/11 kmatsui
3#
4# First, you must edit GCCDIR, BINDIR, INCDIR, gcc_maj_ver and gcc_min_ver.
5# To make compiler-independent-build of MCPP do:
6#       make
7#       make install
8# To make GCC-specific-build of MCPP do:
9#       make COMPILER=GNUC
10#       make COMPILER=GNUC install
11# To re-compile MCPP using GCC-specific-build of MCPP do:
12#       make COMPILER=GNUC PREPROCESSED=1
13#       make COMPILER=GNUC PREPROCESSED=1 install
14# To link malloc() package of kmatsui do:
15#       make [COMPILER=GNUC] [PREPROCESSED=1] MALLOC=KMMALLOC
16#       make [COMPILER=GNUC] [PREPROCESSED=1] MALLOC=KMMALLOC install
17# To make libmcpp (subroutine build of mcpp):
18#       make MCPP_LIB=1 mcpplib
19#       make MCPP_LIB=1 mcpplib_install
20# To make testmain using libmcpp:
21#       make [OUT2MEM=1] testmain
22#       make [OUT2MEM=1] testmain_install
23# It usually needs root privilege to do 'make *install'.
24
25# COMPILER:
26#   Specify whether make a compiler-independent-build or GCC-specific-build
27# compiler-independent-build:   empty
28# compiler-specific-build:      GNUC
29
30# NAME: name of mcpp executable
31NAME ?= mcpp
32CC = gcc
33CXX = g++
34CFLAGS = -c -O2 -Wall   # -ggdb -v
35# for gcc 4.1 or later (Don't use this option to compile libmcpp)
36#CFLAGS += -fstack-protector
37CPPFLAGS =
38#CPPFLAGS = -Wp,-v,-Q,-W3
39    # for MCPP to output a bit verbose diagnosis to "mcpp.err"
40
41LINKFLAGS = -o $(NAME)
42# for gcc 4.1 or later (Don't use this option to compile libmcpp)
43#LINKFLAGS += -fstack-protector
44
45.if     empty(COMPILER)
46# compiler-independent-build
47CPPOPTS =
48# BINDIR:   directory to install mcpp: /usr/bin or /usr/local/bin
49BINDIR = /usr/local/bin
50# INCDIR:   directory to install mcpp_lib.h, mcpp_out.h for libmcpp
51INCDIR = /usr/local/include
52
53.else
54# compiler-specific-build:  Adjust for your system
55
56.if     ! empty(COMPILER) && $(COMPILER) == GNUC
57# The directory 'gcc' (cc) command is located (/usr/bin or /usr/local/bin)
58GCCDIR ?= /usr/bin
59# Set GCC version
60gcc_maj_ver = 3
61gcc_min_ver = 4
62# INCDIR:   the compiler's version specific include directory, if it exists,
63#       /usr/local/include or /usr/include, if it does not exist
64INCDIR = /usr/local/include
65#INCDIR ?= /usr/local/gcc-4.1.1/lib/gcc-lib/i386-unknown-freebsd6.3/4.1.1/include
66CPPOPTS = -DCOMPILER=$(COMPILER) -DINC_DIR=\"$(INCDIR)\"
67
68# BINDIR:   the directory where cpp0 or cc1 resides
69BINDIR ?= /usr/libexec
70#BINDIR ?= /usr/local/gcc-4.1.1/lib/gcc-lib/i386-unknown-freebsd6.3/4.1.1
71cpu = i386
72#cpu = x86_64
73#cpu = ppc
74#cpu = ppc64
75.if $(gcc_maj_ver) == 2
76cpp_call = $(BINDIR)/cpp0
77.else
78cpp_call = $(BINDIR)/cc1
79.endif
80.endif
81.endif
82
83MALLOC =
84.if     !empty(MALLOC)
85.if     $(MALLOC) == KMMALLOC
86    LINKFLAGS += -L/usr/local/lib -lkmmalloc_debug
87    MEM_MACRO = -D_MEM_DEBUG -DXMALLOC -I/usr/local/include
88.endif
89    MEM_MACRO += -D$(MALLOC)
90.else
91    MEM_MACRO =
92.endif
93
94OBJS = main.o directive.o eval.o expand.o support.o system.o mbchar.o
95
96all :   $(NAME)
97$(NAME) : $(OBJS)
98	$(CC) $(OBJS) $(LINKFLAGS)
99
100PREPROCESSED ?= 0
101
102.if $(PREPROCESSED) == 1
103CMACRO = -DPREPROCESSED
104# Make a "pre-preprocessed" header file to recompile MCPP with MCPP.
105mcpp.H	: system.H noconfig.H internal.H
106.if ! empty(COMPILER) && $(COMPILER) == GNUC
107	$(CC) -E -Wp,-b $(CPPFLAGS) $(CPPOPTS) $(MEM_MACRO) -o mcpp.H preproc.c
108.else
109	@echo "Do 'sudo make COMPILER=GNUC install' prior to recompile."
110	@echo "Then, do 'make COMPILER=GNUC PREPROCESSED=1'."
111	@exit
112.endif
113$(OBJS) : mcpp.H
114.else
115CMACRO = $(MEM_MACRO) $(CPPOPTS)
116$(OBJS) : noconfig.H
117main.o directive.o eval.o expand.o support.o system.o mbchar.o:   \
118        system.H internal.H
119.endif
120
121.c.o    :
122	$(CC) $(CFLAGS) $(CMACRO) $(CPPFLAGS) $<
123
124install :
125	install -s $(NAME) $(BINDIR)/$(NAME)
126.if ! empty(COMPILER) && $(COMPILER) == GNUC
127	@./set_mcpp.sh '$(GCCDIR)' '$(gcc_maj_ver)' '$(gcc_min_ver)'    \
128            '$(cpp_call)' '$(CC)' '$(CXX)' 'x$(CPPFLAGS)' 'x' 'ln -s'  \
129            '$(INCDIR)' SYS_FREEBSD $(cpu)
130.endif
131
132clean	:
133	-rm *.o *.so $(NAME) mcpp.H mcpp.err libmcpp.*
134
135uninstall:
136	rm -f $(BINDIR)/$(NAME)
137.if ! empty(COMPILER) && $(COMPILER) == GNUC
138	@./unset_mcpp.sh '$(GCCDIR)' '$(gcc_maj_ver)' '$(gcc_min_ver)'   \
139            '$(cpp_call)' '$(CC)' '$(CXX)' 'x' 'ln -s' '$(INCDIR)' SYS_FREEBSD
140.endif
141
142.if empty(COMPILER)
143.if ! empty(MCPP_LIB) && $(MCPP_LIB) == 1
144# compiler-independent-build and MCPP_LIB is specified:
145CFLAGS += -DMCPP_LIB
146LIBDIR = /usr/local/lib
147
148mcpplib :   mcpplib_a mcpplib_so
149
150mcpplib_a:  $(OBJS)
151	ar -rv libmcpp.a $(OBJS)
152
153# shared library
154# mcpp 2.6.*: 0, mcpp 2.7: 1, mcpp 2.7.1: 2, mcpp 2.7.2: 3
155CUR = 3
156# mcpp 2.6.3: 0, mcpp 2.6.4: 1, mcpp 2.7, 2.7.1, 2.7.2: 0
157REV = 0
158# mcpp 2.6.*: 0, mcpp 2.7: 1, mcpp 2.7.1: 2, mcpp 2.7.2: 3
159AGE = 3
160SHLIB_VER = 0.$(CUR).$(REV)
161SOBJS = main.so directive.so eval.so expand.so support.so system.so mbchar.so
162.SUFFIXES: .so
163.c.so   :
164	$(CC) $(CFLAGS) $(MEM_MACRO) -c -fpic -o $*.so $*.c
165mcpplib_so: $(SOBJS)
166	$(CC) -shared -o libmcpp.so.$(SHLIB_VER) $(SOBJS)   # -fstack-protector
167	chmod a+x libmcpp.so.$(SHLIB_VER)
168
169mcpplib_install:
170	cp libmcpp.a libmcpp.so.$(SHLIB_VER) $(LIBDIR)
171	ranlib $(LIBDIR)/libmcpp.a
172	ln -sf libmcpp.so.$(SHLIB_VER) $(LIBDIR)/libmcpp.so
173	ln -sf libmcpp.so.$(SHLIB_VER) $(LIBDIR)/libmcpp.so.$(CUR)
174	# You should do 'ldconfig' as a root after install.
175	cp mcpp_lib.h mcpp_out.h $(INCDIR)
176	$(CC) -o $(NAME) main_libmcpp.c -l $(NAME)
177	install -s $(NAME) $(BINDIR)
178
179mcpplib_uninstall:
180	rm -f $(LIBDIR)/libmcpp.a $(LIBDIR)/libmcpp.so.$(SHLIB_VER) $(LIBDIR)/libmcpp.so.$(CUR) $(LIBDIR)/libmcpp.so
181	rm -f $(BINDIR)/$(NAME)
182	rm -f $(INCDIR)/mcpp*
183.endif
184
185# use mcpp as a subroutine from testmain.c
186.if ! empty(OUT2MEM) && $(OUT2MEM) == 1
187# output to memory buffer
188CFLAGS += -DOUT2MEM
189.endif
190TMAIN_LINKFLAGS = testmain.o -o testmain -L /usr/local/lib -l $(NAME)
191.if ! empty(MALLOC) && $(MALLOC) == KMMALLOC
192    TMAIN_LINKFLAGS += -l kmmalloc_debug
193.endif
194testmain :   testmain.o
195	$(CC) $(TMAIN_LINKFLAGS)
196testmain_install :
197	install -s testmain $(BINDIR)/testmain
198testmain_uninstall   :
199	rm -f $(BINDIR)/testmain
200.endif
201
202