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