1#* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2#*                                                                           *
3#*   File....: Makefile                                                      *
4#*   Name....: Zimpl Makefile                                                *
5#*   Author..: Thorsten Koch                                                 *
6#*   Copyright by Author, All rights reserved                                *
7#*                                                                           *
8#* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
9#*
10#* Copyright (C) 2005-2018 by Thorsten Koch <koch@zib.de>
11#*
12#* This program is free software; you can redistribute it and/or
13#* modify it under the terms of the GNU General Public License
14#* as published by the Free Software Foundation; either version 2
15#* of the License, or (at your option) any later version.
16#*
17#* This program is distributed in the hope that it will be useful,
18#* but WITHOUT ANY WARRANTY; without even the implied warranty of
19#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20#* GNU General Public License for more details.
21#*
22#* You should have received a copy of the GNU General Public License
23#* along with this program; if not, write to the Free Software
24#* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
25#*
26#
27.PHONY:		all depend clean lint doc doxygen check valgrind libdbl coverage
28
29ARCH            :=      $(shell uname -m | \
30                        sed \
31			-e s/sun../sparc/ \
32			-e s/i.86/x86/ \
33			-e s/i86pc/x86/ \
34			-e s/amd64/x86_64/ \
35			-e s/IP../mips/ \
36			-e s/9000..../hppa/ \
37			-e s/Power\ Macintosh/ppc/ \
38			-e s/00........../pwr4/)
39OSTYPE          :=      $(shell uname -s | \
40                        tr '[:upper:]' '[:lower:]' | \
41			tr '/' '_' | \
42                        sed \
43			-e s/cygwin.*/cygwin/ \
44                        -e s/irix../irix/ \
45                        -e s/windows.*/windows/ \
46                        -e s/mingw.*/mingw/)
47
48HOSTNAME	:=      $(shell uname -n | tr '[:upper:]' '[:lower:]')
49
50VERSION		=	3.3.6
51VERBOSE		=	false
52SHARED		=	false
53STATIC		=	false
54ZLIB		=	true
55LINK		=	static
56OPT		=	opt
57COMP		=	gnu
58CC		=	gcc
59CC_o		= 	-o #
60LINKCC   	=	gcc
61LINKCC_o 	=	-o #the white space is important
62LIBEXT		= 	.a
63YACC		=	bison
64LEX		=	flex
65DCC		=	gcc
66LINT		=	pclp64_linux # _debug
67CPPCHECK	=	cppcheck
68AR		=	ar cr
69AR_o	   	=
70RANLIB		=	ranlib
71DOXY		=	doxygen
72VALGRIND	=	valgrind --tool=memcheck --leak-check=full \
73			--leak-resolution=high --show-reachable=yes
74
75SRCDIR		=	src/zimpl
76BINDIR		=	bin
77LIBDIR		=	lib
78LINTCONF	=	/opt/pclint/config
79
80CPPFLAGS	=	-I$(SRCDIR)/.. -DVERSION='"$(VERSION)"'
81CFLAGS		=	-O
82LDFLAGS		=	-lgmp -lm
83YFLAGS		=	-d -t -v
84LFLAGS		=	-d
85ARFLAGS		=
86DFLAGS		=	-MM
87
88GCCWARN		=	-Wall -W -Wpointer-arith -Wcast-align -Wwrite-strings \
89			-Wstrict-prototypes -Wmissing-prototypes -Winline \
90			-Wmissing-declarations -Wshadow -Waggregate-return \
91			-Wno-unused -Wno-unknown-pragmas
92
93ifeq ($(ZLIB),true)
94LDFLAGS		+=	-lz
95else
96CPPFLAGS	+=	-DWITHOUT_ZLIB
97endif
98
99ifeq ($(SHARED),true)
100LINK		=	shared
101endif
102ifeq ($(STATIC),true)
103LINK		=	static
104endif
105
106BASE		=	$(OSTYPE).$(ARCH).$(COMP).$(OPT)
107OBJDIR		=	obj/O.$(OSTYPE).$(ARCH).$(COMP).$(LINK).$(OPT)
108NAME		=	zimpl
109BINNAME		=	$(NAME)-$(VERSION).$(OSTYPE).$(ARCH).$(COMP).$(LINK).$(OPT)
110LIBNAME		=	$(NAME)-$(VERSION).$(BASE)
111
112LIBRARY		=	$(LIBDIR)/lib$(LIBNAME)$(LIBEXT)
113LIBRARYDBL	=	$(LIBDIR)/lib$(LIBNAME).dbl$(LIBEXT)
114LIBLINK		=	$(LIBDIR)/lib$(NAME).$(BASE)$(LIBEXT)
115LIBDBLLINK	=	$(LIBDIR)/lib$(NAME).$(BASE).dbl$(LIBEXT)
116
117BINARY		=	$(BINDIR)/$(BINNAME)
118BINARYDBL	=	$(BINDIR)/$(BINNAME).dbl
119BINLINK		=	$(BINDIR)/$(NAME).$(BASE)
120BINSHORTLINK	=	$(BINDIR)/$(NAME)
121DEPEND		=	$(SRCDIR)/depend
122
123#-----------------------------------------------------------------------------
124
125OBJECT  	=       zimpl.o xlpglue.o zlpglue.o \
126			ratlpstore.o ratlpfwrite.o ratmpswrite.o ratmstwrite.o \
127			ratordwrite.o ratpresolve.o
128LIBBASE		=	blkmem.o bound.o code.o conname.o define.o elem.o entry.o \
129			hash.o heap.o idxset.o inst.o iread.o list.o \
130			load.o local.o metaio.o mmlparse2.o mmlscan.o mono.o \
131			mshell.o prog.o random.o rdefpar.o source.o \
132			setempty.o setpseudo.o setlist.o setrange.o setprod.o \
133			setmulti.o set4.o stmt.o stkchk.o strstore2.o symbol.o \
134			term2.o tuple.o vinst.o zimpllib.o
135LIBOBJ		=	$(LIBBASE) gmpmisc.o numbgmp.o
136LIBDBLOBJ	=	$(LIBBASE) numbdbl.o
137OBJXXX		=	$(addprefix $(OBJDIR)/,$(OBJECT))
138LIBXXX		=	$(addprefix $(OBJDIR)/,$(LIBOBJ))
139LIBDBLXXX	=	$(addprefix $(OBJDIR)/,$(LIBDBLOBJ))
140OBJSRC		=	$(addprefix $(SRCDIR)/,$(OBJECT:.o=.c))
141LIBSRC		=	$(addprefix $(SRCDIR)/,$(LIBOBJ:.o=.c)) #(SRCDIR)/numbdbl.c
142
143#-----------------------------------------------------------------------------
144include make/make.$(OSTYPE).$(ARCH).$(COMP).$(OPT)
145-include make/local/make.$(HOSTNAME)
146-include make/local/make.$(HOSTNAME).$(COMP)
147-include make/local/make.$(HOSTNAME).$(COMP).$(OPT)
148#-----------------------------------------------------------------------------
149
150FLAGS           +=      $(USRFLAGS)
151OFLAGS          +=      $(USROFLAGS)
152CFLAGS          +=      $(USRCFLAGS) $(USROFLAGS)
153LDFLAGS         +=      $(USRLDFLAGS)
154ARFLAGS         +=      $(USRARFLAGS)
155DFLAGS          +=      $(USRDFLAGS)
156
157
158ifeq ($(VERBOSE),false)
159.SILENT:	$(LIBRARY) $(LIBLINK) $(BINARY) $(BINLINK) $(BINSHORTLINK) \
160		$(SRCDIR)/mmlparse2.c $(SRCDIR)/mmlscan.c $(OBJXXX) $(LIBXXX) $(LIBDBLXXX)
161endif
162
163all:		$(LIBRARY) $(LIBLINK) $(BINARY) $(BINLINK) $(BINSHORTLINK)
164
165double:		$(LIBRARYDBL) $(LIBDBLLINK) $(BINARYDBL) # $(BINLINK) $(BINSHORTLINK)
166
167$(LIBLINK):	$(LIBRARY)
168		@rm -f $@
169		cd $(dir $@) && ln -s $(notdir $(LIBRARY)) $(notdir $@)
170
171$(LIBDBLLINK):	$(LIBRARYDBL)
172		@rm -f $@
173		cd $(dir $@) && ln -s $(notdir $(LIBRARYDBL)) $(notdir $@)
174
175$(BINLINK) $(BINSHORTLINK):	$(BINARY)
176		@rm -f $@
177		cd $(dir $@) && ln -s $(notdir $(BINARY)) $(notdir $@)
178
179$(BINARY):	$(OBJDIR) $(BINDIR) $(OBJXXX) $(LIBRARY)
180		@echo "-> linking $@"
181ifeq ($(COMP), msvc)
182		$(LINKCC) $(CFLAGS) $(OBJXXX) $(LIBRARY) $(LDFLAGS) $(LINKCC_o)$@
183else
184		$(LINKCC) $(CFLAGS) $(OBJXXX) -L$(LIBDIR) -l$(LIBNAME) $(LDFLAGS) $(LINKCC_o)$@
185endif
186
187$(BINARYDBL):	$(OBJDIR) $(BINDIR) $(OBJXXX) $(LIBRARYDBL)
188		@echo "-> linking $@"
189		$(LINKCC) $(CFLAGS) $(OBJXXX) -L$(LIBDIR) -l$(LIBNAME).dbl $(LDFLAGS) $(CC_o)$@
190
191$(LIBRARY):	$(OBJDIR) $(LIBDIR) $(LIBXXX)
192		@echo "-> generating library $@"
193		-rm -f $(LIBRARY)
194		$(AR) $(AR_o)$@ $(LIBXXX) $(ARFLAGS)
195ifneq ($(RANLIB),)
196		$(RANLIB) $@
197endif
198
199libdbl:		$(LIBRARYDBL) $(LIBDBLLINK)
200
201$(LIBRARYDBL):	$(OBJDIR) $(LIBDIR) $(LIBDBLXXX)
202		@echo "-> generating library $@"
203		-rm -f $(LIBRARYDBL)
204		$(AR) $@ $(LIBDBLXXX) $(ARFLAGS)
205		$(RANLIB) $@
206
207$(SRCDIR)/mmlparse2.c:	$(SRCDIR)/mmlparse2.y $(SRCDIR)/mme.h
208		@echo "-> generating yacc parser $@"
209		$(YACC) $(YFLAGS) -o $@ $<
210
211$(SRCDIR)/mmlscan.c:	$(SRCDIR)/mmlscan.l $(SRCDIR)/mme.h
212		@echo "-> generating lex scanner $@"
213		$(LEX) $(LFLAGS) -o$@ $<
214
215lint:		$(OBJSRC) $(LIBSRC)
216		$(LINT) $(LINTCONF)/co-gcc.lnt $(SRCDIR)/project2.lnt \
217		-I$(LINTCONF) -I$(SRCDIR) -dNO_MSHELL -dVERSION='"$(VERSION)"' $^
218
219cppcheck:	$(OBJSRC) $(LIBSRC)
220		$(CPPCHECK) $(CPPFLAGS) -I/usr/include -I/usr/include/x86_64-linux-gnu -I/usr/include/x86_64-linux-gnu/bits -I/usr/include/x86_64-linux-gnu/sys -I/usr/include/linux -I/usr/lib/gcc/x86_64-linux-gnu/5/include --inline-suppr --suppressions-list=src/cppcheck.txt --enable=warning,style,performance,portability,information $^
221
222doc:
223		cd doc; make -f Makefile
224
225doxygen:
226		cd doc; $(DOXY) $(NAME).dxy
227
228check:
229		cd check; \
230		/bin/sh ./check.sh ../$(BINARY)
231
232valgrind:
233		cd check; \
234		/bin/sh ./check.sh "$(VALGRIND) ../$(BINARY)"
235
236coverage:
237		-ln -s ../../src $(OBJDIR)
238		-mkdir -p gcov
239		lcov -d $(OBJDIR) -z
240		make OPT=gcov check
241		lcov -d $(OBJDIR) -c >gcov/z.capture
242		lcov -d $(OBJDIR) -r gcov/z.capture "*mmlscan.c" "*mmlparse2.c" >gcov/zimpl.capture
243		genhtml -o gcov gcov/zimpl.capture
244		-rm gcov/z.capture
245
246$(OBJDIR):
247		@echo "** creating directory \"$@\""
248		@-mkdir -p $(OBJDIR)
249
250$(LIBDIR):
251		@echo "** creating directory \"$@\""
252		@-mkdir -p $(LIBDIR)
253
254$(BINDIR):
255		@echo "** creating directory \"$@\""
256		@-mkdir -p $(BINDIR)
257
258clean:
259		-rm -rf $(OBJDIR)/* $(BINARY) $(LIBRARY) $(LIBRARYDBL) $(LIBLINK) $(BINLINK) $(BINSHORTLINK)
260
261depend:
262		$(SHELL) -ec '$(DCC) $(DFLAGS) $(CPPFLAGS) $(OBJSRC) $(LIBSRC) \
263		| sed '\''s|^\([0-9A-Za-z\_]\{1,\}\)\.o|$$\(OBJDIR\)/\1.o|g'\'' \
264		>$(DEPEND)'
265
266-include	$(DEPEND)
267
268$(OBJDIR)/%.o:	$(SRCDIR)/%.c
269		@echo "-> compiling $@"
270		$(CC) $(CPPFLAGS) $(CFLAGS) -c $< $(CC_o)$@
271
272# --- EOF ---------------------------------------------------------------------
273