1# makefile to compile MCPP version 2.7.2 and later for CygWIN / GCC / GNU make
2# 		2008/09   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:
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 make libmcpp (subroutine build of mcpp):
15#       make MCPP_LIB=1 mcpplib
16#       make MCPP_LIB=1 mcpplib_install
17# To make testmain using libmcpp (add 'DLL_IMPORT=1' to link against DLL):
18#       make [OUT2MEM=1] testmain
19#       make [OUT2MEM=1] testmain_install
20
21# COMPILER:
22#   Specify whether make a compiler-independent-build or GCC-specific-build
23# compiler-independent-build:   empty
24# compiler-specific-build:      GNUC
25
26# NAME: name of mcpp executable
27NAME = mcpp
28
29# CC:   name of gcc executable
30#       e.g. cc, gcc, gcc-2.95.3, i686-pc-linux-gnu-gcc-3.4.3
31CC = gcc
32CXX = g++
33CFLAGS = -c -O2 -Wall   #-v
34CPPFLAGS =
35#CPPFLAGS = -Wp,-vQW3
36    # for MCPP to output a bit verbose diagnosis to "mcpp.err"
37
38LINKFLAGS = -o $(NAME)
39
40ifeq    ($(COMPILER), )
41# compiler-independent-build
42CPPOPTS =
43# BINDIR:   directory to install mcpp: /usr/bin or /usr/local/bin
44BINDIR = /usr/local/bin
45# INCDIR:   directory to install mcpp_lib.h, mcpp_out.h for libmcpp
46INCDIR = /usr/local/include
47
48else
49# compiler-specific-build:  Adjust for your system
50
51ifeq    ($(COMPILER), GNUC)
52# The directory where 'gcc' (cc) command is located
53GCCDIR = /usr/bin
54#GCCDIR = /usr/local/bin
55# set GCC version
56gcc_maj_ver = 3
57gcc_min_ver = 4
58# INCDIR:   version specific include directory
59#INCDIR = /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5/include
60INCDIR = /usr/lib/gcc/i686-pc-cygwin/3.4.4/include
61CPPOPTS = -DCOMPILER=$(COMPILER)
62
63# BINDIR:   the directory where cpp0 or cc1 resides
64#BINDIR = /usr/lib/gcc-lib/i686-pc-cygwin/2.95.3-5
65BINDIR = /usr/lib/gcc/i686-pc-cygwin/3.4.4
66cpu = i386
67#cpu = x86_64
68ifeq ($(gcc_maj_ver), 2)
69cpp_call = $(BINDIR)/cpp0.exe
70else
71cpp_call = $(BINDIR)/cc1.exe
72endif
73endif
74endif
75
76OBJS = main.o directive.o eval.o expand.o support.o system.o mbchar.o
77
78$(NAME): $(OBJS)
79	$(CC) $(OBJS) $(LINKFLAGS)
80
81PREPROCESSED = 0
82
83ifeq	($(PREPROCESSED), 1)
84CMACRO = -DPREPROCESSED
85#CPPFLAGS += -std=c99
86    # '-std=c99' option is sometimes necessary to work around
87    # the confusion of system header files
88# Make a "pre-preprocessed" header file to recompile MCPP with MCPP.
89mcpp.H	: system.H noconfig.H internal.H
90ifeq    ($(COMPILER), GNUC)
91	$(CC) -v -E -Wp,-b $(CPPFLAGS) $(CPPOPTS) -o mcpp.H preproc.c
92else
93	@echo "Do 'sudo make COMPILER=GNUC install' prior to recompile."
94	@echo "Then, do 'make COMPILER=GNUC PREPROCESSED=1'."
95	@exit
96endif
97$(OBJS) : mcpp.H
98else
99CMACRO = $(CPPOPTS)
100$(OBJS) : noconfig.H
101main.o directive.o eval.o expand.o support.o system.o mbchar.o:   \
102        system.H internal.H
103endif
104
105.c.o	:
106	$(CC) $(CFLAGS) $(CMACRO) $(CPPFLAGS) $<
107
108install :
109	install -s -b $(NAME).exe $(BINDIR)/$(NAME).exe
110ifeq    ($(COMPILER), GNUC)
111	@./set_mcpp.sh '$(GCCDIR)' '$(gcc_maj_ver)' '$(gcc_min_ver)'        \
112            '$(cpp_call)' '$(CC)' '$(CXX)' 'x$(CPPFLAGS)' 'x.exe' 'ln -s'   \
113            '$(INCDIR)' SYS_CYGWIN $(cpu)
114endif
115
116clean	:
117	-rm *.o *.so *.exe mcpp.H mcpp.err libmcpp.* cygmcpp.*
118
119uninstall:
120	rm -f $(BINDIR)/$(NAME).exe
121ifeq    ($(COMPILER), GNUC)
122	@./unset_mcpp.sh '$(GCCDIR)' '$(gcc_maj_ver)' '$(gcc_min_ver)'   \
123        '$(cpp_call)' '$(CC)' '$(CXX)' 'x.exe' 'ln -s' '$(INCDIR)' SYS_CYGWIN
124endif
125
126ifeq    ($(COMPILER), )
127LIBDIR = /usr/local/lib
128ifeq    ($(MCPP_LIB), 1)
129# compiler-independent-build and MCPP_LIB=1
130CFLAGS += -DMCPP_LIB
131
132mcpplib :   mcpplib_a mcpplib_dll
133
134mcpplib_a:  $(OBJS)
135	ar -rv libmcpp.a $(OBJS)
136
137# DLL
138DLL_VER = 0
139SOBJS = main.so directive.so eval.so expand.so support.so system.so mbchar.so
140.SUFFIXES: .so
141.c.so   :
142	$(CC) $(CFLAGS) $(MEM_MACRO) -c -DPIC -o $*.so $*.c
143mcpplib_dll: $(SOBJS)
144	$(CC) -shared -o cygmcpp-$(DLL_VER).dll $(SOBJS) -Wl,--enable-auto-image-base,--out-implib,libmcpp.dll.a
145
146mcpplib_install:
147	cp libmcpp.a libmcpp.dll.a $(LIBDIR)
148	cp cygmcpp-$(DLL_VER).dll $(BINDIR)
149	ranlib $(LIBDIR)/libmcpp.a
150	cp mcpp_lib.h mcpp_out.h $(INCDIR)
151	$(CC) -o $(NAME) main_libmcpp.c $(LIBDIR)/libmcpp.dll.a
152	install -s -b $(NAME).exe $(BINDIR)/$(NAME).exe
153mcpplib_uninstall:
154	rm -f $(LIBDIR)/libmcpp.a $(LIBDIR)/libmcpp.dll.a $(BINDIR)/cygmcpp-$(DLL_VER).dll
155	rm -f $(BINDIR)/$(NAME).exe
156	rm -f $(INCDIR)/mcpp*
157endif
158
159# use mcpp as a subroutine from testmain.c
160ifeq    ($(OUT2MEM), 1)
161# output to memory buffer
162CFLAGS += -DOUT2MEM
163endif
164TMAIN_LINKFLAGS = testmain.o -o testmain.exe
165ifeq    ($(DLL_IMPORT), 1)
166TMAIN_LINKFLAGS += $(LIBDIR)/libmcpp.dll.a
167CFLAGS += -DDLL_IMPORT
168else
169TMAIN_LINKFLAGS += $(LIBDIR)/libmcpp.a
170endif
171testmain :   testmain.o
172	$(CC) $(TMAIN_LINKFLAGS)
173testmain_install :
174	install -s testmain.exe $(BINDIR)/testmain.exe
175testmain_uninstall   :
176	rm -f $(BINDIR)/testmain.exe
177
178endif
179
180