diff options
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | Makefile | 73 | ||||
| -rw-r--r-- | README.md | 23 | ||||
| -rwxr-xr-x | configure | 178 |
4 files changed, 199 insertions, 76 deletions
@@ -9,3 +9,4 @@ examples/headers/headers examples/hello/hello examples/html/html examples/put/put +/Makefile diff --git a/Makefile b/Makefile deleted file mode 100644 index af79de3..0000000 --- a/Makefile +++ /dev/null @@ -1,73 +0,0 @@ -.POSIX: - -PROJECT = libweb -PROJECT_A = $(PROJECT).a -MAJOR_VERSION = 0 -MINOR_VERSION = 1 -PATCH_VERSION = 0 -VERSION = $(MAJOR_VERSION).$(MINOR_VERSION).$(PATCH_VERSION) -PROJECT_SO = $(PROJECT).so.$(VERSION) -PROJECT_SO_FQ = $(PROJECT).so.$(MAJOR_VERSION) -PROJECT_SO_NV = $(PROJECT).so -prefix = /usr/local -exec_prefix = $(prefix) -includedir = $(prefix)/include -datarootdir = $(prefix)/share -mandir = $(datarootdir)/man -libdir = $(exec_prefix)/lib -pkgcfgdir = $(libdir)/pkgconfig -O = -O1 -CDEFS = -D_FILE_OFFSET_BITS=64 # Required for large file support on 32-bit. -CFLAGS = $(O) $(CDEFS) -g -Iinclude -Idynstr/include -fPIC -MD -MF $(@:.o=.d) -LDFLAGS = -shared -DEPS = $(OBJECTS:.o=.d) -OBJECTS = \ - form.o \ - handler.o \ - html.o \ - http.o \ - server.o \ - wildcard_cmp.o - -all: $(PROJECT_A) $(PROJECT_SO) - -install: all $(pkgcfgdir)/libweb.pc - mkdir -p $(DESTDIR)$(includedir) - cp -R include/libweb $(DESTDIR)$(includedir) - chmod 0644 $(DESTDIR)$(includedir)/libweb/*.h - mkdir -p $(DESTDIR)$(libdir) - cp $(PROJECT_A) $(PROJECT_SO) $(DESTDIR)$(libdir) - chmod 0755 $(libdir)/$(PROJECT_A) $(DESTDIR)$(libdir)/$(PROJECT_SO) - ln -fs $(libdir)/$(PROJECT_SO) $(DESTDIR)$(libdir)/$(PROJECT_SO_FQ) - ln -fs $(libdir)/$(PROJECT_SO) $(DESTDIR)$(libdir)/$(PROJECT_SO_NV) - +cd doc && $(MAKE) install \ - DESTDIR=$(DESTDIR) \ - prefix=$(prefix) \ - datarootdir=$(datarootdir) \ - mandir=$(mandir) - -clean: - rm -f $(OBJECTS) $(DEPS) - +cd examples && $(MAKE) clean - -distclean: clean - rm -f $(PROJECT_A) $(PROJECT_SO) - +cd examples && $(MAKE) distclean - -FORCE: - -examples: FORCE - +cd examples && $(MAKE) - -$(PROJECT_A): $(OBJECTS) - $(AR) $(ARFLAGS) $@ $(OBJECTS) - -$(PROJECT_SO): $(OBJECTS) - $(CC) $(LDFLAGS) $(OBJECTS) -o $@ - -$(pkgcfgdir)/libweb.pc: libweb.pc - mkdir -p $(pkgcfgdir) - sed -e 's,/usr/local,$(prefix),' $< > $@ - chmod 0644 $@ - --include $(DEPS) @@ -76,14 +76,23 @@ apk add cmake Two build environments are provided for `libweb` - feel free to choose any of them: -- A mostly POSIX-compliant [`Makefile`](Makefile). +- A [`configure`](configure) POSIX shell and mostly POSIX-compliant +[`Makefile`](Makefile). - A [`CMakeLists.txt`](CMakeLists.txt). `libweb` can be built using the standard build process: #### Make +First, generate the `Makefile` via the `configure` script: + ```sh +$ ./configure +``` + +Then: + +``` $ make ``` @@ -93,12 +102,20 @@ the use of recursive `make`. For example, assuming `libweb` is contained on a subdirectory: ```make -libweb/libweb.a: +libweb/Makefile: + cd libweb && ./configure +libweb/libweb.a: libweb/Makefile +cd libweb && $(MAKE) ``` Additionally, `libweb` can be installed using the `install` target. A -custom prefix can be assigned via the `PREFIX` variable: +custom prefix can be assigned via the `configure` script: + +```sh +$ ./configure --prefix=$HOME/libweb-prefix +``` + +Or, directly from the generated `Makefile`: ```sh $ make PREFIX=$HOME/libweb-prefix install diff --git a/configure b/configure new file mode 100755 index 0000000..4d055f9 --- /dev/null +++ b/configure @@ -0,0 +1,178 @@ +#! /bin/sh + +set -e + +default_prefix=/usr/local +prefix=$default_prefix +default_CC='c99' +# FILE_OFFSET_BITS=64 is required for large file support on 32-bit platforms. +default_CFLAGS='-O1 -D_FILE_OFFSET_BITS=64 -MD -Iinclude -fPIC' +default_LDFLAGS="-shared" + +CC=${CC:-$default_CC} + +help() +{ + cat <<-EOF +$0 [OPTION ...] + +--prefix Set installation directory [$default_prefix] + +Some influential environment variables: + CC C compiler [$default_CC] + CFLAGS C compiler flags [$default_CFLAGS] + LDFLAGS Link-time flags [$default_LDFLAGS] +EOF +} + +while true; do + split_arg=0 + + if printf "%s" "$1" | grep -e '=' > /dev/null + then + key="$(printf "%s" "$1" | cut -d '=' -f1)" + value="$(printf "%s" "$1" | cut -d '=' -f2)" + split_arg=1 + else + key="$1" + value="$2" + fi + + case "$key" in + --prefix ) prefix="$value"; shift; test $split_arg -eq 0 && shift ;; + -h | --help ) help; exit 0 ;; + * ) test "$1" != "" && help && exit 1 || break ;; + esac +done + +if pkg-config dynstr +then + in_tree_dynstr=0 + proj_CFLAGS="$(pkg-config --cflags dynstr) $proj_CFLAGS" + proj_LDFLAGS="$(pkg-config --libs dynstr) $proj_LDFLAGS" +else + echo "Info: dynstr not found. Using in-tree copy" >&2 + in_tree_dynstr=1 + proj_CFLAGS="-Idynstr/include $proj_CFLAGS" + proj_LDFLAGS="-Ldynstr -ldynstr $proj_LDFLAGS" +fi + +proj_CFLAGS="$proj_CFLAGS $default_CFLAGS $CFLAGS" +proj_LDFLAGS="$proj_LDFLAGS $default_LDFLAGS $LDFLAGS" + +cleanup() +{ + rm -f $F +} + +F=/tmp/Makefile.libweb +trap cleanup EXIT + +cat <<EOF > $F +.POSIX: + +CC = ${CC} +CFLAGS = $CFLAGS +PROJ_CFLAGS = $proj_CFLAGS +PROJ_LDFLAGS = $proj_LDFLAGS +prefix = $prefix +EOF + +cat <<"EOF" >> $F +PROJECT = libweb +PROJECT_A = $(PROJECT).a +MAJOR_VERSION = 0 +MINOR_VERSION = 1 +PATCH_VERSION = 0 +VERSION = $(MAJOR_VERSION).$(MINOR_VERSION).$(PATCH_VERSION) +PROJECT_SO = $(PROJECT).so.$(VERSION) +PROJECT_SO_FQ = $(PROJECT).so.$(MAJOR_VERSION) +PROJECT_SO_NV = $(PROJECT).so +exec_prefix = $(prefix) +includedir = $(prefix)/include +datarootdir = $(prefix)/share +mandir = $(datarootdir)/man +libdir = $(exec_prefix)/lib +pkgcfgdir = $(libdir)/pkgconfig +O = -O1 +DEPS = $(OBJECTS:.o=.d) +OBJECTS = \ + form.o \ + handler.o \ + html.o \ + http.o \ + server.o \ + wildcard_cmp.o + +all: $(PROJECT_A) $(PROJECT_SO) + +install: all $(pkgcfgdir)/libweb.pc + mkdir -p $(DESTDIR)$(includedir) + cp -R include/libweb $(DESTDIR)$(includedir) + chmod 0644 $(DESTDIR)$(includedir)/libweb/*.h + mkdir -p $(DESTDIR)$(libdir) + cp $(PROJECT_A) $(PROJECT_SO) $(DESTDIR)$(libdir) + chmod 0755 $(libdir)/$(PROJECT_A) $(DESTDIR)$(libdir)/$(PROJECT_SO) + ln -fs $(libdir)/$(PROJECT_SO) $(DESTDIR)$(libdir)/$(PROJECT_SO_FQ) + ln -fs $(libdir)/$(PROJECT_SO) $(DESTDIR)$(libdir)/$(PROJECT_SO_NV) + +cd doc && $(MAKE) install \ + DESTDIR=$(DESTDIR) \ + prefix=$(prefix) \ + datarootdir=$(datarootdir) \ + mandir=$(mandir) + +FORCE: + +.c.o: + $(CC) $(PROJ_CFLAGS) -c $< -o $@ + +examples: FORCE + +cd examples && $(MAKE) + +$(PROJECT_A): $(OBJECTS) + $(AR) $(ARFLAGS) $@ $(OBJECTS) + +$(PROJECT_SO): $(OBJECTS) + $(CC) $(PROJ_LDFLAGS) $(OBJECTS) -o $@ + +$(pkgcfgdir)/libweb.pc: libweb.pc + mkdir -p $(pkgcfgdir) + sed -e 's,/usr/local,$(prefix),' $< > $@ + chmod 0644 $@ +EOF + +if [ $in_tree_dynstr -ne 0 ] +then +cat <<"EOF" >> $F +DYNSTR = dynstr/libdynstr.a +$(PROJECT): $(DYNSTR) +$(DYNSTR): FORCE + +cd dynstr && $(MAKE) CC=$(CC) +EOF +fi + +cat <<"EOF" >> $F +clean: + rm -f $(OBJECTS) $(DEPS) + +cd examples && $(MAKE) clean +EOF + +if [ $in_tree_dynstr -ne 0 ] +then +cat <<"EOF" >> $F + +cd dynstr && $(MAKE) clean +EOF +fi + +cat <<"EOF" >> $F +distclean: clean + rm -f $(PROJECT_A) $(PROJECT_SO) + +cd examples && $(MAKE) distclean + rm Makefile +EOF + +cat <<"EOF" >> $F +-include $(DEPS) +EOF + +mv $F Makefile |
