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