#! /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