1#
2# Makefile for Mini-XML, a small XML-like file parsing library.
3#
4# https://www.msweet.org/mxml
5#
6# Copyright © 2003-2019 by Michael R Sweet.
7#
8# Licensed under Apache License v2.0.  See the file "LICENSE" for more
9# information.
10#
11
12#
13# Compiler tools definitions...
14#
15
16AR		=	@AR@
17ARFLAGS		=	@ARFLAGS@
18ARCHFLAGS	=	@ARCHFLAGS@
19CC		=	@CC@
20CFLAGS		=	$(OPTIM) $(ARCHFLAGS) @CFLAGS@ @CPPFLAGS@ @PTHREAD_FLAGS@
21CP		=	@CP@
22DSO		=	@DSO@
23DSOFLAGS	=	@DSOFLAGS@
24LDFLAGS		=	$(OPTIM) $(ARCHFLAGS) @LDFLAGS@
25INSTALL		=	@INSTALL@
26LIBMXML		=	@LIBMXML@
27LIBS		=	@LIBS@ @PTHREAD_LIBS@
28LN		=	@LN@ -s
29MKDIR		=	@MKDIR@
30OPTIM		=	@OPTIM@
31RANLIB		=	@RANLIB@
32RM		=	@RM@ -f
33SHELL		=	/bin/sh
34
35
36#
37# Configured directories...
38#
39
40prefix		=	@prefix@
41exec_prefix	=	@exec_prefix@
42bindir		=	@bindir@
43datarootdir	=	@datarootdir@
44includedir	=	@includedir@
45libdir		=	@libdir@
46mandir		=	@mandir@
47docdir		=	@docdir@
48BUILDROOT	=	$(DSTROOT)
49
50
51#
52# Install commands...
53#
54
55INSTALL_BIN	=	$(LIBTOOL) $(INSTALL) -m 755
56INSTALL_DATA	=	$(INSTALL) -m 644
57INSTALL_DIR	=	$(INSTALL) -d
58INSTALL_LIB	=	$(LIBTOOL) $(INSTALL) -m 755
59INSTALL_MAN	=	$(INSTALL) -m 644
60INSTALL_SCRIPT	=	$(INSTALL) -m 755
61
62
63#
64# Rules...
65#
66
67.SUFFIXES:	.c .man .o
68.c.o:
69	echo Compiling $<
70	$(CC) $(CFLAGS) -c -o $@ $<
71
72
73#
74# Targets...
75#
76
77DOCFILES	=	doc/mxml.epub doc/mxml.html doc/mxml-cover.png \
78			CHANGES.md LICENSE NOTICE README.md
79PUBLIBOBJS	=	mxml-attr.o mxml-entity.o mxml-file.o mxml-get.o \
80			mxml-index.o mxml-node.o mxml-search.o mxml-set.o
81LIBOBJS		=	$(PUBLIBOBJS) mxml-private.o mxml-string.o
82OBJS		=	testmxml.o $(LIBOBJS)
83ALLTARGETS	=	$(LIBMXML) testmxml
84CROSSTARGETS	=	$(LIBMXML)
85TARGETS		=	$(@TARGETS@)
86
87
88#
89# Make everything...
90#
91
92all:		$(TARGETS)
93
94
95#
96# Clean everything...
97#
98
99clean:
100	echo Cleaning build files...
101	$(RM) $(OBJS) $(ALLTARGETS)
102	$(RM) mxml1.dll
103	$(RM) libmxml.a
104	$(RM) libmxml.so.1.6
105	$(RM) libmxml.sl.1
106	$(RM) libmxml.1.dylib
107
108
109#
110# Really clean everything...
111#
112
113distclean:	clean
114	echo Cleaning distribution files...
115	$(RM) config.cache config.log config.status
116	$(RM) Makefile config.h
117	$(RM) -r autom4te*.cache
118	$(RM) *.bck *.bak
119	$(RM) -r clang
120
121
122#
123# Install everything...
124#
125
126install:	$(TARGETS) install-$(LIBMXML) install-libmxml.a
127	echo Installing documentation in $(BUILDROOT)$(docdir)...
128	$(INSTALL_DIR) $(BUILDROOT)$(docdir)
129	for file in $(DOCFILES); do \
130		$(INSTALL_MAN) $$file $(BUILDROOT)$(docdir)/`basename $$file .md`; \
131	done
132	echo Installing header files in $(BUILDROOT)$(includedir)...
133	$(INSTALL_DIR) $(BUILDROOT)$(includedir)
134	$(INSTALL_DATA) mxml.h $(BUILDROOT)$(includedir)
135	echo Installing pkgconfig files in $(BUILDROOT)$(libdir)/pkgconfig...
136	$(INSTALL_DIR) $(BUILDROOT)$(libdir)/pkgconfig
137	$(INSTALL_DATA) mxml.pc $(BUILDROOT)$(libdir)/pkgconfig
138	echo Installing man pages in $(BUILDROOT)$(mandir)...
139	$(INSTALL_DIR) $(BUILDROOT)$(mandir)/man3
140	$(INSTALL_MAN) doc/mxml.3 $(BUILDROOT)$(mandir)/man3/mxml.3
141
142install-libmxml.a:	libmxml.a
143	echo Installing libmxml.a to $(BUILDROOT)$(libdir)...
144	$(INSTALL_DIR) $(BUILDROOT)$(libdir)
145	$(INSTALL_DATA) libmxml.a $(BUILDROOT)$(libdir)
146	$(RANLIB) $(BUILDROOT)$(libdir)/libmxml.a
147
148install-libmxml.so.1.6:	libmxml.so.1.6
149	echo Installing libmxml.so to $(BUILDROOT)$(libdir)...
150	$(INSTALL_DIR) $(BUILDROOT)$(libdir)
151	$(INSTALL_LIB) libmxml.so.1.6 $(BUILDROOT)$(libdir)
152	$(RM) $(BUILDROOT)$(libdir)/libmxml.so
153	$(LN) libmxml.so.1.6 $(BUILDROOT)$(libdir)/libmxml.so
154	$(RM) $(BUILDROOT)$(libdir)/libmxml.so.1
155	$(LN) libmxml.so.1.6 $(BUILDROOT)$(libdir)/libmxml.so.1
156	$(LDCONFIG)
157
158install-libmxml.1.dylib: libmxml.1.dylib
159	echo Installing libmxml.dylib to $(BUILDROOT)$(libdir)...
160	$(INSTALL_DIR) $(BUILDROOT)$(libdir)
161	$(INSTALL_LIB) libmxml.1.dylib $(BUILDROOT)$(libdir)
162	$(RM) $(BUILDROOT)$(libdir)/libmxml.dylib
163	$(LN) libmxml.1.dylib $(BUILDROOT)$(libdir)/libmxml.dylib
164
165
166#
167# Uninstall everything...
168#
169
170uninstall: uninstall-$(LIBMXML) uninstall-libmxml.a
171	echo Uninstalling documentation from $(BUILDROOT)$(docdir)...
172	$(RM) -r $(BUILDROOT)$(docdir)
173	echo Uninstalling headers from $(BUILDROOT)$(includedir)...
174	$(RM) $(BUILDROOT)$(includedir)/mxml.h
175	echo Uninstalling pkgconfig files from $(BUILDROOT)$(libdir)/pkgconfig...
176	$(RM) $(BUILDROOT)$(libdir)/pkgconfig/mxml.pc
177	echo Uninstalling man pages from $(BUILDROOT)$(mandir)...
178	$(RM) $(BUILDROOT)$(mandir)/man3/mxml.3
179
180uninstall-libmxml.a:
181	echo Uninstalling libmxml.a from $(BUILDROOT)$(libdir)...
182	$(RM) $(BUILDROOT)$(libdir)/libmxml.a
183
184uninstall-libmxml.so.1.6:
185	echo Uninstalling libmxml.so from $(BUILDROOT)$(libdir)...
186	$(RM) $(BUILDROOT)$(libdir)/libmxml.so
187	$(RM) $(BUILDROOT)$(libdir)/libmxml.so.1
188	$(RM) $(BUILDROOT)$(libdir)/libmxml.so.1.6
189	$(LDCONFIG)
190
191uninstall-libmxml.1.dylib:
192	echo Uninstalling libmxml.dylib from $(BUILDROOT)$(libdir)...
193	$(RM) $(BUILDROOT)$(libdir)/libmxml.dylib
194	$(RM) $(BUILDROOT)$(libdir)/libmxml.1.dylib
195
196
197#
198# Figure out lines-of-code...
199#
200
201.PHONY: sloc
202
203sloc:
204	echo "libmxml: \c"
205	sloccount $(LIBOBJS:.o=.c) mxml-private.c mxml.h 2>/dev/null | \
206		grep "Total Physical" | awk '{print $$9}'
207
208
209#
210# libmxml.a
211#
212
213libmxml.a:	$(LIBOBJS)
214	echo Creating $@...
215	$(RM) $@
216	$(AR) $(ARFLAGS) $@ $(LIBOBJS)
217	$(RANLIB) $@
218
219$(LIBOBJS):	mxml.h
220mxml-entity.o mxml-file.o mxml-private.o: mxml-private.h
221
222
223#
224# mxml1.dll
225#
226
227mxml1.dll:	$(LIBOBJS)
228	echo Creating $@...
229	$(DSO) $(DSOFLAGS) $(LDFLAGS) -o $@ $(LIBOBJS) $(LIBS)
230
231
232#
233# libmxml.so.1.6
234#
235
236libmxml.so.1.6:	$(LIBOBJS)
237	echo Creating $@...
238	$(DSO) $(DSOFLAGS) $(LDFLAGS) -o libmxml.so.1.6 $(LIBOBJS) $(LIBS)
239	$(RM) libmxml.so libmxml.so.1
240	$(LN) libmxml.so.1.6 libmxml.so
241	$(LN) libmxml.so.1.6 libmxml.so.1
242
243
244#
245# libmxml.1.dylib
246#
247
248libmxml.1.dylib:	$(LIBOBJS)
249	echo Creating $@...
250	$(DSO) $(DSOFLAGS) $(LDFLAGS) -o libmxml.1.dylib \
251		-install_name $(libdir)/libmxml.dylib \
252		-current_version 1.6.0 \
253		-compatibility_version 1.0.0 \
254		$(LIBOBJS) $(LIBS)
255	$(RM) libmxml.dylib
256	$(LN) libmxml.1.dylib libmxml.dylib
257
258
259#
260# testmxml
261#
262
263testmxml:	libmxml.a testmxml.o
264	echo Linking $@...
265	$(CC) $(LDFLAGS) -o $@ testmxml.o libmxml.a $(LIBS)
266	@echo Testing library...
267	./testmxml test.xml temp1s.xml >temp1.xml
268	./testmxml temp1.xml temp2s.xml >temp2.xml
269	@if cmp temp1.xml temp2.xml; then \
270		echo Stdio file test passed!; \
271		$(RM) temp2.xml temp2s.xml; \
272	else \
273		echo Stdio file test failed!; \
274	fi
275	@if cmp temp1.xml temp1s.xml; then \
276		echo String test passed!; \
277		$(RM) temp1.xml temp1s.xml; \
278	else \
279		echo String test failed!; \
280	fi
281	@if cmp test.xml test.xmlfd; then \
282		echo File descriptor test passed!; \
283		$(RM) test.xmlfd; \
284	else \
285		echo File descriptor test failed!; \
286	fi
287
288testmxml-vg:	$(LIBOBJS) testmxml.o
289	echo Linking $@...
290	$(CC) $(LDFLAGS) -o $@ testmxml.o $(LIBOBJS) $(LIBS)
291
292testmxml.o:	mxml.h
293
294
295#
296# Documentation (depends on separate codedoc utility)
297#
298
299.PHONY: doc
300doc:	mxml.h $(PUBLIBOBJS:.o=.c) \
301		doc/body.md doc/body.man doc/footer.man \
302		doc/mxml-cover.png
303	echo Generating API documentation...
304	$(RM) mxml.xml
305	codedoc --body doc/body.md \
306		--coverimage doc/mxml-cover.png \
307		mxml.xml mxml.h $(PUBLIBOBJS:.o=.c) >doc/mxml.html
308	codedoc --body doc/body.md \
309		--coverimage doc/mxml-cover.png \
310		--epub doc/mxml.epub mxml.xml
311	codedoc --man mxml --title "Mini-XML API" \
312		--body doc/body.man --footer doc/footer.man \
313		mxml.xml >doc/mxml.3
314	$(RM) mxml.xml
315
316
317#
318# All object files depend on the makefile and config header...
319#
320
321$(OBJS):	Makefile config.h
322