#! /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 -Wall -MD'
default_LDFLAGS="-lm"
CC=${CC:-$default_CC}
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
proj_CFLAGS="$proj_CFLAGS $(pkg-config --cflags libsodium)"
proj_LDFLAGS="$proj_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 libcjson
then
proj_CFLAGS="$(pkg-config --cflags libcjson) $proj_CFLAGS"
proj_LDFLAGS="$(pkg-config --libs libcjson) $proj_LDFLAGS"
USERGEN_LDFLAGS="$USERGEN_LDFLAGS $(pkg-config --libs libcjson)"
else
echo "Error: libcjson not found." >&2
exit 1
fi
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"
USERGEN_LDFLAGS="$USERGEN_LDFLAGS $(pkg-config --libs dynstr)"
else
echo "Info: dynstr not found. Using in-tree copy" >&2
in_tree_dynstr=1
proj_CFLAGS="$proj_CFLAGS -Ilibweb/dynstr/include"
proj_LDFLAGS="$proj_LDFLAGS -Llibweb/dynstr -ldynstr"
USERGEN_LDFLAGS="$USERGEN_LDFLAGS -Llibweb/dynstr -ldynstr"
fi
if pkg-config libweb
then
in_tree_libweb=0
proj_CFLAGS="$proj_CFLAGS $(pkg-config --cflags libweb)"
proj_LDFLAGS="$proj_LDFLAGS $(pkg-config --libs libweb)"
else
echo "Info: libweb not found. Using in-tree copy" >&2
in_tree_libweb=1
proj_CFLAGS="$proj_CFLAGS -Ilibweb/include"
proj_LDFLAGS="$proj_LDFLAGS -Llibweb -lweb"
if [ -f libweb/Makefile ]
then
echo "Info: Re-configuring libweb" >&2
(cd libweb && CFLAGS="$CFLAGS" LDFLAGS="$LDFLAGS" ./configure \
--prefix="$prefix")
fi
fi
if [ $build_thumbnail -ne 0 ]
then
if [ -f thumbnail/Makefile ]
then
echo "Info: Re-configuring thumbnail" >&2
(cd thumbnail && CFLAGS="$CFLAGS" LDFLAGS="$LDFLAGS" ./configure \
--prefix="$prefix")
fi
fi
if pkg-config fdzipstream
then
in_tree_fdzipstream=0
proj_proj_CFLAGS="$proj_CFLAGS $(pkg-config --cflags fdzipstream)"
proj_proj_LDFLAGS="$proj_LDFLAGS $(pkg-config --libs fdzipstream)"
else
echo "Info: fdzipstream not found. Using in-tree copy" >&2
in_tree_fdzipstream=1
proj_CFLAGS="$proj_CFLAGS -Ifdzipstream/fdzipstream"
proj_LDFLAGS="$proj_LDFLAGS -Lfdzipstream -lfdzipstream"
fi
if pkg-config zlib
then
proj_CFLAGS="$proj_CFLAGS $(pkg-config --cflags zlib)"
proj_LDFLAGS="$proj_LDFLAGS $(pkg-config --libs zlib)"
else
echo "Error: zlib not found." >&2
exit 1
fi
proj_CFLAGS="$proj_CFLAGS $default_CFLAGS $CFLAGS"
proj_LDFLAGS="$proj_LDFLAGS $default_LDFLAGS $LDFLAGS"
USERGEN_LDFLAGS="$USERGEN_LDFLAGS $LDFLAGS"
cleanup()
{
rm -f $F
}
F=/tmp/Makefile.slcl
trap cleanup EXIT
cat <<EOF > $F
.POSIX:
CC = $CC
PREFIX = $prefix
DST = $prefix/bin
CFLAGS = $CFLAGS
PROJ_CFLAGS = $proj_CFLAGS
PROJ_LDFLAGS = $proj_LDFLAGS
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
FORCE:
.c.o:
$(CC) $(PROJ_CFLAGS) -c $< -o $@
$(PROJECT): $(OBJECTS)
$(CC) $(OBJECTS) $(PROJ_LDFLAGS) -o $@
usergen: $(USERGEN_OBJECTS)
$(CC) $(USERGEN_OBJECTS) $(USERGEN_LDFLAGS) -o $@
install: all
mkdir -p $(DST)
cp slcl usergen $(DST)
chmod 0755 $(DST)/slcl
chmod 0755 $(DST)/usergen
+cd doc && $(MAKE) PREFIX=$(PREFIX) install
EOF
if [ $build_thumbnail -ne 0 ]
then
cat <<"EOF" >> $F
+test -f $(THUMBNAIL_MK) && cd thumbnail && $(MAKE) install || :
EOF
fi
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_MK = libweb/Makefile
$(LIBWEB_MK):
cd libweb && CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" \
./configure --prefix=$(PREFIX)
LIBWEB = libweb/libweb.a
$(PROJECT): $(LIBWEB)
$(LIBWEB): $(LIBWEB_MK) FORCE
+cd libweb && $(MAKE) CC=$(CC)
libweb: $(LIBWEB)
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_MK = thumbnail/Makefile
thumbnail $(PROJECT): $(THUMBNAIL)
$(THUMBNAIL_MK):
cd thumbnail && CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" \
./configure --prefix=$(PREFIX)
$(THUMBNAIL): $(THUMBNAIL_MK) FORCE
+cd thumbnail && $(MAKE) CC=$(CC)
all: $(THUMBNAIL)
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
+test -f $(LIBWEB_MK) && cd libweb && $(MAKE) clean || :
EOF
fi
if [ $in_tree_fdzipstream -ne 0 ]
then
cat <<"EOF" >> $F
+cd fdzipstream && $(MAKE) clean
EOF
fi
if [ $build_thumbnail -ne 0 ]
then
cat <<"EOF" >> $F
+test -f $(THUMBNAIL_MK) && cd thumbnail && $(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
+test -f $(LIBWEB_MK) && 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
+test -f $(THUMBNAIL_MK) && cd thumbnail && $(MAKE) distclean || :
EOF
fi
cat <<"EOF" >> $F
-include $(DEPS)
EOF
mv $F Makefile