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