#! /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 -g -D_FILE_OFFSET_BITS=64 -Wall -MD'
default_LDFLAGS="-lcjson -lm"

CC=${CC:-$default_CC}
CFLAGS=${CFLAGS:-"$default_CFLAGS $default_NPCFLAGS"}
LDFLAGS=${LDFLAGS:-$default_LDFLAGS}
USERGEN_LDFLAGS=${LDFLAGS}

build_thumbnail=0

help()
{
	cat <<-EOF
$0 [OPTION ...]

--prefix      Set installation directory [$default_prefix]
--thumbnail   Build thumbnail generator

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 ;;
		--thumbnail ) build_thumbnail=1; shift ;;
		-h | --help ) help; exit 0 ;;
		* ) test "$1" != "" && help && exit 1 || break ;;
	esac
done

if pkg-config libsodium
then
	CFLAGS="$CFLAGS $(pkg-config --cflags libsodium)"
	LDFLAGS="$LDFLAGS $(pkg-config --libs libsodium)"
	USERGEN_LDFLAGS="$USERGEN_LDFLAGS $(pkg-config --libs libsodium)"
else
	echo "Error: libsodium not found." >&2
	exit 1
fi

if pkg-config dynstr
then
	in_tree_dynstr=0
	CFLAGS="$CFLAGS $(pkg-config --cflags dynstr)"
	LDFLAGS="$LDFLAGS $(pkg-config --libs dynstr)"
	USERGEN_LDFLAGS="$USERGEN_LDFLAGS $(pkg-config --libs dynstr)"
else
	echo "Info: dynstr not found. Using in-tree copy" >&2
	in_tree_dynstr=1
	CFLAGS="$CFLAGS -Ilibweb/dynstr/include"
	LDFLAGS="$LDFLAGS -Llibweb/dynstr -ldynstr"
	USERGEN_LDFLAGS="$LDFLAGS -Llibweb/dynstr -ldynstr"
fi

if pkg-config libweb
then
	in_tree_libweb=0
	CFLAGS="$CFLAGS $(pkg-config --cflags libweb)"
	LDFLAGS="$LDFLAGS $(pkg-config --libs libweb)"
else
	echo "Info: libweb not found. Using in-tree copy" >&2
	in_tree_libweb=1
	CFLAGS="$CFLAGS -Ilibweb/include"
	LDFLAGS="$LDFLAGS -Llibweb -lweb"
fi

if pkg-config fdzipstream
then
	in_tree_fdzipstream=0
	CFLAGS="$CFLAGS $(pkg-config --cflags fdzipstream)"
	LDFLAGS="$LDFLAGS $(pkg-config --libs fdzipstream)"
else
	echo "Info: fdzipstream not found. Using in-tree copy" >&2
	in_tree_fdzipstream=1
	CFLAGS="$CFLAGS -Ifdzipstream/fdzipstream"
	LDFLAGS="$LDFLAGS -Lfdzipstream -lfdzipstream -lz"
fi

cleanup()
{
	rm -f $F
}

F=/tmp/Makefile.slcl
trap cleanup EXIT

cat <<EOF > $F
.POSIX:

CC = $CC
PREFIX = $prefix
DST = $prefix/bin
CFLAGS = $CFLAGS
LDFLAGS = $LDFLAGS
USERGEN_LDFLAGS = $USERGEN_LDFLAGS
EOF

cat <<"EOF" >> $F
PROJECT = slcl
DEPS = $(OBJECTS:.o=.d)
OBJECTS = \
	auth.o \
	cftw.o \
	crealpath.o \
	hex.o \
	jwt.o \
	main.o \
	page.o \
	style.o \
	zip.o

USERGEN_OBJECTS = \
	hex.o \
	usergen.o \

all: $(PROJECT) usergen

install: all
	mkdir -p $(DST)
	cp slcl usergen $(DST)
	chmod 0755 $(DST)/slcl
	chmod 0755 $(DST)/usergen
	+cd doc && $(MAKE) PREFIX=$(PREFIX) install

FORCE:

$(PROJECT): $(OBJECTS)
	$(CC) $(OBJECTS) $(LDFLAGS) -o $@

usergen: $(USERGEN_OBJECTS)
	$(CC) $(USERGEN_OBJECTS) $(USERGEN_LDFLAGS) -o $@
EOF

if [ $in_tree_dynstr -ne 0 ]
then
cat <<"EOF" >> $F
DYNSTR = libweb/dynstr/libdynstr.a
$(PROJECT): $(DYNSTR)
$(DYNSTR): FORCE
	+cd libweb/dynstr && $(MAKE) CC=$(CC)
EOF
fi

if [ $in_tree_libweb -ne 0 ]
then
cat <<"EOF" >> $F
LIBWEB = libweb/libweb.a
$(PROJECT): $(LIBWEB)
$(LIBWEB): FORCE
	+cd libweb && $(MAKE) CC=$(CC)
EOF
fi

if [ $in_tree_fdzipstream -ne 0 ]
then
cat <<"EOF" >> $F
FDZIPSTREAM = fdzipstream/libfdzipstream.a
$(PROJECT): $(FDZIPSTREAM)
$(FDZIPSTREAM): FORCE $(DYNSTR)
	+cd fdzipstream && $(MAKE) CC=$(CC)
EOF
fi

if [ $build_thumbnail -ne 0 ]
then
cat <<"EOF" >> $F
THUMBNAIL = thumbnail/thumbnail
thumbnail $(PROJECT): $(THUMBNAIL)
$(THUMBNAIL): FORCE
	+cd thumbnail && $(MAKE) CC=$(CC)
EOF
fi

cat <<"EOF" >> $F
clean:
	rm -f $(OBJECTS) $(DEPS)
EOF

if [ $in_tree_dynstr -ne 0 ]
then
cat <<"EOF" >> $F
	+cd libweb/dynstr && $(MAKE) clean
EOF
fi

if [ $in_tree_libweb -ne 0 ]
then
cat <<"EOF" >> $F
	+cd libweb && $(MAKE) clean
EOF
fi

if [ $in_tree_fdzipstream -ne 0 ]
then
cat <<"EOF" >> $F
	+cd fdzipstream && $(MAKE) clean
EOF
fi

cat <<"EOF" >> $F
distclean: clean
	rm -f slcl usergen
	rm Makefile
EOF

# dynstr has no distclean target as of the time of this writing.

if [ $in_tree_libweb -ne 0 ]
then
cat <<"EOF" >> $F
	+cd libweb && $(MAKE) distclean
EOF
fi

if [ $in_tree_fdzipstream -ne 0 ]
then
cat <<"EOF" >> $F
	+cd fdzipstream && $(MAKE) distclean
EOF
fi

if [ $build_thumbnail -ne 0 ]
then
cat <<"EOF" >> $F
	+cd thumbnail && $(MAKE) distclean
EOF
fi

cat <<"EOF" >> $F
-include $(DEPS)
EOF

mv $F Makefile
