From 880a46116019843ddc9032f3b109cd940b6af11d Mon Sep 17 00:00:00 2001 From: Michael R Sweet Date: Mon, 18 Nov 2024 09:29:28 -0500 Subject: [PATCH] Add linux makefiles (Issue #335) --- linux/Makefile | 411 +++++++++++++++++++++++++++++++++++++++++++++++++ linux/config.h | 43 ++++++ linux/mxml4.pc | 10 ++ 3 files changed, 464 insertions(+) create mode 100644 linux/Makefile create mode 100644 linux/config.h create mode 100644 linux/mxml4.pc diff --git a/linux/Makefile b/linux/Makefile new file mode 100644 index 0000000..338e116 --- /dev/null +++ b/linux/Makefile @@ -0,0 +1,411 @@ +# +# Linux makefile for Mini-XML, a small XML-like file parsing library. +# +# https://www.msweet.org/mxml +# +# Copyright © 2003-2024 by Michael R Sweet. +# +# Licensed under Apache License v2.0. See the file "LICENSE" for more +# information. +# + +# +# This is a POSIX makefile +# + +.POSIX: + + +# +# Mini-XML version... +# + +MXML_VERSION = 4.0.4 + + +# +# Programs... +# + +AR = /usr/bin/ar +CC = gcc +DSO = $(CC) +INSTALL = /home/mike/c/mxml/install-sh +LN = /usr/bin/ln -sf +MKDIR = /usr/bin/mkdir -p +RANLIB = ranlib +RM = /usr/bin/rm -f +RMDIR = /usr/bin/rmdir +SHELL = /bin/sh + + +# +# Installation programs... +# + +INSTALL_BIN = $(INSTALL) -c -m 755 +INSTALL_DATA = $(INSTALL) -c -m 444 +INSTALL_DIR = $(INSTALL) -d -m 755 +INSTALL_LIB = $(INSTALL) -c -m 755 +INSTALL_MAN = $(INSTALL) -c -m 444 + + +# +# Libraries... +# + +LIBMXML = libmxml4.so.2 +LIBMXML_BASE = libmxml4 +LIBMXML_STATIC = libmxml4.a +MXML_MAN = mxml4.3 +MXML_PC = mxml4.pc + + +# +# Install static libraries? +# + +INSTALL_STATIC = install-libmxml4.a + + +# +# Code signing... +# + +CODE_SIGN = /usr/bin/true +CODESIGN_IDENTITY = - +CSFLAGS = -s "$(CODESIGN_IDENTITY)" -o runtime --timestamp + + +# +# Library archiver... +# + +ARFLAGS = cr + + +# +# C compiler and preprocessor... +# + +CFLAGS = -fPIC $(CPPFLAGS) $(OPTIM) $(WARNINGS) +CPPFLAGS = -D_THREAD_SAFE -D_REENTRANT -D_FORTIFY_SOURCE=3 -D__USE_MISC -D_GNU_SOURCE +WARNINGS = -Wall -Wunused -Wno-char-subscripts -Wno-deprecated-declarations -Wno-format-truncation -Wno-format-y2k -Wno-switch -Wno-unused-result + + +# +# Linker options... +# + +DSOFLAGS = -Wl,-soname,`basename $@` -shared $(OPTIM) +LDFLAGS = -fPIE -pie -Wl,-z,relro,-z,now $(OPTIM) +LIBS = -lpthread -lm + + +# +# Optimization and architecture options for both the compiler and linker. +# + +OPTIM = -g -Os + + +# +# Directories... +# + +bindir = ${exec_prefix}/bin +datadir = ${datarootdir} +datarootdir = ${prefix}/share +docdir = ${prefix}/share/doc/mxml4 +exec_prefix = ${prefix} +includedir = ${prefix}/include/libmxml4 +infodir = ${datarootdir}/info +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localstatedir = ${prefix}/var +mandir = ${datarootdir}/man +oldincludedir = /usr/include +prefix = /usr/local +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +srcdir = . +sysconfdir = ${prefix}/etc +top_srcdir = . + +BUILDROOT = $(DSTROOT)$(DESTDIR) + + +# +# Rules... +# + +.SILENT: +.SUFFIXES: .c .man .o +.c.o: + echo Compiling $< + $(CC) $(CFLAGS) -c -o $@ $< + + +# +# Targets... +# + +DOCFILES = doc/mxml.epub doc/mxml.html doc/mxml-cover.png \ + CHANGES.md LICENSE NOTICE README.md +PUBLIBOBJS = mxml-attr.o mxml-file.o mxml-get.o mxml-index.o \ + mxml-node.o mxml-options.o mxml-search.o mxml-set.o +LIBOBJS = $(PUBLIBOBJS) mxml-private.o +OBJS = testmxml.o $(LIBOBJS) +ALLTARGETS = $(LIBMXML) testmxml +CROSSTARGETS = $(LIBMXML) +TARGETS = $(ALLTARGETS) + + +# +# Make everything... +# + +all: $(TARGETS) + + +# +# Clean everything... +# + +clean: + echo Cleaning build files... + $(RM) $(OBJS) $(ALLTARGETS) + $(RM) libmxml4.a + $(RM) libmxml4.so + $(RM) libmxml4.so.2 + + +# +# Really clean everything... +# + +distclean: clean + echo Cleaning distribution files... + $(RM) test.xmlfd + $(RM) temp1.xml temp1.xmlfd temp1s.xml + $(RM) temp2.xml temp2s.xml + $(RM) -r clang + + +# +# Install everything... +# + +.NOTPARALLEL: install install-$(LIBMXML) $(INSTALL_STATIC) + +install: $(TARGETS) install-$(LIBMXML) $(INSTALL_STATIC) + echo Installing documentation in $(BUILDROOT)$(docdir)... + $(INSTALL_DIR) $(BUILDROOT)$(docdir) + for file in $(DOCFILES); do \ + $(INSTALL_MAN) ../$$file $(BUILDROOT)$(docdir)/`basename $$file .md`; \ + done + echo Installing header files in $(BUILDROOT)$(includedir)... + $(INSTALL_DIR) $(BUILDROOT)$(includedir) + $(INSTALL_DATA) ../mxml.h $(BUILDROOT)$(includedir) + echo Installing pkgconfig files in $(BUILDROOT)$(libdir)/pkgconfig... + $(INSTALL_DIR) $(BUILDROOT)$(libdir)/pkgconfig + $(INSTALL_DATA) mxml4.pc $(BUILDROOT)$(libdir)/pkgconfig/$(MXML_PC) + echo Installing man pages in $(BUILDROOT)$(mandir)... + $(INSTALL_DIR) $(BUILDROOT)$(mandir)/man3 + $(INSTALL_MAN) ../doc/mxml.3 $(BUILDROOT)$(mandir)/man3/$(MXML_MAN) + +install-libmxml.a: libmxml.a + echo Installing libmxml.a to $(BUILDROOT)$(libdir)... + $(INSTALL_DIR) $(BUILDROOT)$(libdir) + $(INSTALL_LIB) libmxml.a $(BUILDROOT)$(libdir) + $(RANLIB) $(BUILDROOT)$(libdir)/libmxml.a + +install-libmxml.so.2: libmxml.so.2 + echo Installing libmxml.so to $(BUILDROOT)$(libdir)... + $(INSTALL_DIR) $(BUILDROOT)$(libdir) + $(INSTALL_LIB) libmxml.so.2 $(BUILDROOT)$(libdir) + $(RM) $(BUILDROOT)$(libdir)/libmxml.so + $(LN) libmxml.so.2 $(BUILDROOT)$(libdir)/libmxml.so + $(LDCONFIG) + +install-libmxml4.a: libmxml4.a + echo Installing libmxml4.a to $(BUILDROOT)$(libdir)... + $(INSTALL_DIR) $(BUILDROOT)$(libdir) + $(INSTALL_LIB) libmxml4.a $(BUILDROOT)$(libdir) + $(RANLIB) $(BUILDROOT)$(libdir)/libmxml4.a + +install-libmxml4.so.2: libmxml4.so.2 + echo Installing libmxml4.so to $(BUILDROOT)$(libdir)... + $(INSTALL_DIR) $(BUILDROOT)$(libdir) + $(INSTALL_LIB) libmxml4.so.2 $(BUILDROOT)$(libdir) + $(RM) $(BUILDROOT)$(libdir)/libmxml4.so + $(LN) libmxml4.so.2 $(BUILDROOT)$(libdir)/libmxml4.so + $(LDCONFIG) + + +# +# Uninstall everything... +# + +uninstall: uninstall-$(LIBMXML) uninstall-libmxml4.a + echo Uninstalling documentation from $(BUILDROOT)$(docdir)... + $(RM) -r $(BUILDROOT)$(docdir) + echo Uninstalling headers from $(BUILDROOT)$(includedir)... + $(RM) $(BUILDROOT)$(includedir)/mxml.h + echo Uninstalling pkgconfig files from $(BUILDROOT)$(libdir)/pkgconfig... + $(RM) $(BUILDROOT)$(libdir)/pkgconfig/$(MXML_PC) + echo Uninstalling man pages from $(BUILDROOT)$(mandir)... + $(RM) $(BUILDROOT)$(mandir)/man3/$(MXML_MAN) + +uninstall-libmxml.a: + echo Uninstalling libmxml.a from $(BUILDROOT)$(libdir)... + $(RM) $(BUILDROOT)$(libdir)/libmxml.a + +uninstall-libmxml.so.2: + echo Uninstalling libmxml.so from $(BUILDROOT)$(libdir)... + $(RM) $(BUILDROOT)$(libdir)/libmxml.so + $(RM) $(BUILDROOT)$(libdir)/libmxml.so.2 + $(LDCONFIG) + +uninstall-libmxml4.a: + echo Uninstalling libmxml4.a from $(BUILDROOT)$(libdir)... + $(RM) $(BUILDROOT)$(libdir)/libmxml4.a + +uninstall-libmxml4.so.2: + echo Uninstalling libmxml4.so from $(BUILDROOT)$(libdir)... + $(RM) $(BUILDROOT)$(libdir)/libmxml4.so + $(RM) $(BUILDROOT)$(libdir)/libmxml4.so.2 + $(LDCONFIG) + + +# +# Test everything... +# + +test: testmxml + @echo Testing library... + ./testmxml ../test.xml temp1s.xml >temp1.xml + ./testmxml temp1.xml temp2s.xml >temp2.xml + @if cmp temp1.xml temp2.xml; then \ + echo Stdio file test passed!; \ + $(RM) temp2.xml temp2s.xml; \ + else \ + echo Stdio file test failed!; \ + exit 1; \ + fi + @if cmp temp1.xml temp1s.xml; then \ + echo String test passed!; \ + $(RM) temp1.xml temp1s.xml; \ + else \ + echo String test failed!; \ + exit 1; \ + fi + @if cmp ../test.xml ../test.xmlfd; then \ + echo File descriptor test passed!; \ + $(RM) test.xmlfd temp1.xmlfd; \ + else \ + echo File descriptor test failed!; \ + exit 1; \ + fi + + +# +# libmxml.a +# + +libmxml.a libmxml4.a: $(LIBOBJS) + echo Creating $@... + $(RM) $@ + $(AR) $(ARFLAGS) $@ $(LIBOBJS) + $(RANLIB) $@ + + +# +# libmxml2.dll +# + +libmxml.dll libmxml4.dll: $(LIBOBJS) + echo Creating $@... + $(DSO) $(DSOFLAGS) -o $@ $(LIBOBJS) $(LIBS) + + +# +# libmxml.so.2 +# + +libmxml.so.2 libmxml4.so.2: $(LIBOBJS) + echo Creating $@... + $(DSO) $(DSOFLAGS) -o $@ $(LIBOBJS) $(LIBS) + $(RM) `basename $@ .2` + $(LN) $@ `basename $@ .2` + + +# +# testmxml +# + +testmxml: $(LIBMXML_STATIC) testmxml.o + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ testmxml.o $(LIBMXML_STATIC) $(LIBS) + +testmxml-vg: $(LIBOBJS) testmxml.o + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ testmxml.o $(LIBOBJS) $(LIBS) + + +# +# Documentation (depends on separate codedoc utility) +# + +.PHONY: doc +doc: ../mxml.h $(PUBLIBOBJS:.o=.c) \ + ../doc/body.md ../doc/body.man ../doc/footer.man \ + ../doc/mxml-cover.png + echo Generating API documentation... + $(RM) mxml.xml + codedoc --body ../doc/body.md \ + --coverimage ../doc/mxml-cover.png \ + mxml.xml mxml.h $(PUBLIBOBJS:.o=.c) >../doc/mxml.html + codedoc --body ../doc/body.md \ + --coverimage ../doc/mxml-cover.png \ + --epub ../doc/mxml.epub mxml.xml + codedoc --man mxml --title "Mini-XML API" \ + --body ../doc/body.man --footer ../doc/footer.man \ + mxml.xml >../doc/mxml.3 + $(RM) mxml.xml + + +# +# All object files depend on the makefile and config header... +# + +mxml-attr.o: ../mxml-attr.c ../mxml.h ../mxml-private.h Makefile config.h + echo Compiling $< + $(CC) $(CFLAGS) -c -o $@ $< +mxml-file.o: ../mxml-file.c ../mxml.h ../mxml-private.h Makefile config.h + echo Compiling $< + $(CC) $(CFLAGS) -c -o $@ $< +mxml-get.o: ../mxml-get.c ../mxml.h ../mxml-private.h Makefile config.h + echo Compiling $< + $(CC) $(CFLAGS) -c -o $@ $< +mxml-index.o: ../mxml-index.c ../mxml.h ../mxml-private.h Makefile config.h + echo Compiling $< + $(CC) $(CFLAGS) -c -o $@ $< +mxml-node.o: ../mxml-node.c ../mxml.h ../mxml-private.h Makefile config.h + echo Compiling $< + $(CC) $(CFLAGS) -c -o $@ $< +mxml-options.o: ../mxml-options.c ../mxml.h ../mxml-private.h Makefile config.h + echo Compiling $< + $(CC) $(CFLAGS) -c -o $@ $< +mxml-private.o: ../mxml-private.c ../mxml.h ../mxml-private.h Makefile config.h + echo Compiling $< + $(CC) $(CFLAGS) -c -o $@ $< +mxml-search.o: ../mxml-search.c ../mxml.h ../mxml-private.h Makefile config.h + echo Compiling $< + $(CC) $(CFLAGS) -c -o $@ $< +mxml-set.o: ../mxml-set.c ../mxml.h ../mxml-private.h Makefile config.h + echo Compiling $< + $(CC) $(CFLAGS) -c -o $@ $< +testmxml.o: ../testmxml.c ../mxml.h ../mxml-private.h Makefile config.h + echo Compiling $< + $(CC) $(CFLAGS) -c -o $@ $< diff --git a/linux/config.h b/linux/config.h new file mode 100644 index 0000000..7c43c2b --- /dev/null +++ b/linux/config.h @@ -0,0 +1,43 @@ +/* config.h. Generated from config.h.in by configure. */ +// +// Configuration file for Mini-XML, a small XML file parsing library. +// +// https://www.msweet.org/mxml +// +// Copyright © 2003-2024 by Michael R Sweet. +// +// Licensed under Apache License v2.0. See the file "LICENSE" for more +// information. +// + +#ifndef MXML_CONFIG_H +# define MXML_CONFIG_H +# include +# include +# include +# include +# include + + +// +// Version number +// + +# define MXML_VERSION "Mini-XML v4.0.4" + + +// +// Inline function support +// + +# define inline + + +// +// Have ? +// + +# define HAVE_PTHREAD_H 1 + + +#endif // !MXML_CONFIG_H diff --git a/linux/mxml4.pc b/linux/mxml4.pc new file mode 100644 index 0000000..f3e4585 --- /dev/null +++ b/linux/mxml4.pc @@ -0,0 +1,10 @@ +prefix=/usr/local +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include/libmxml4 + +Name: Mini-XML +Description: Lightweight XML support library +Version: 4.0.4 +Libs: -lmxml4 +Cflags: -I${includedir}