summaryrefslogtreecommitdiffstats
path: root/config.sh
diff options
context:
space:
mode:
Diffstat (limited to 'config.sh')
-rw-r--r--config.sh176
1 files changed, 176 insertions, 0 deletions
diff --git a/config.sh b/config.sh
new file mode 100644
index 0000000..5f15de3
--- /dev/null
+++ b/config.sh
@@ -0,0 +1,176 @@
+outdir=${OUTDIR:-.build}
+srcdir=${SRCDIR:-$(dirname "$0")}
+AR=${AR:-ar}
+AS=${AS:-as}
+CC=${CC:-cc}
+CFLAGS=${CFLAGS:-}
+LD=${LD:-ld}
+SCDOC=${SCDOC:-scdoc}
+
+for arg
+do
+ # TODO: Add args for install directories
+ case "$arg" in
+ --prefix=*)
+ PREFIX=${arg#*=}
+ ;;
+ esac
+done
+
+subdir() {
+ eval ". $srcdir/$1/configure"
+}
+
+genrules() {
+ target="$1"
+ shift
+ printf '# Begin generated rules for %s\n' "$target"
+ for file in "$@"
+ do
+ ext="${file#*.}"
+ file="${file%.*}"
+ deps=
+ printf '%s.o: %s.%s%s\n' "$file" "$file" "$ext" "$deps"
+ done
+ printf '%s_objects=\\\n' "$target"
+ n=0
+ for file in "$@"
+ do
+ file="${file%.*}"
+ n=$((n+1))
+ if [ $n -eq $# ]
+ then
+ printf '\t%s.o\n' "$file"
+ else
+ printf '\t%s.o \\\n' "$file"
+ fi
+ done
+ printf '# End generated rules for %s\n' "$target"
+}
+
+append_cflags() {
+ for flag
+ do
+ CFLAGS="$(printf '%s \\\n\t%s' "$CFLAGS" "$flag")"
+ done
+}
+
+test_cflags() {
+ [ ! -e "$outdir"/check.c ] && cat <<-EOF > "$outdir"/check.c
+ int main(void) { return 0; }
+ EOF
+ werror=""
+ case "$CFLAGS" in
+ *-Werror*)
+ werror="-Werror"
+ ;;
+ esac
+ if $CC $werror "$@" -o /dev/null "$outdir"/check.c >/dev/null 2>&1
+ then
+ append_cflags "$@"
+ else
+ return 1
+ fi
+}
+
+find_library() {
+ name="$1"
+ pc="$2"
+ printf "Checking for %s... " "$name"
+ if ! pkg-config "$pc" 2>/dev/null
+ then
+ printf "NOT FOUND\n"
+ printf "Tried pkg-config %s\n" "$pc"
+ return 1
+ fi
+ printf "OK\n"
+ CFLAGS="$CFLAGS $(pkg-config --cflags "$pc")"
+ LIBS="$LIBS $(pkg-config --libs "$pc")"
+}
+
+docs() { true; }
+
+run_configure() {
+ mkdir -p $outdir
+
+ for flag in -g -std=c11 -D_XOPEN_SOURCE=700 -Wall -Wextra -Werror -pedantic
+ do
+ printf "Checking for %s... " "$flag"
+ if test_cflags "$flag"
+ then
+ echo yes
+ else
+ echo no
+ fi
+ done
+
+ find_library OpenSSL libssl
+ find_library OpenSSL libcrypto
+
+ printf "Checking for scdoc... "
+ if scdoc -v >/dev/null 2>&1
+ then
+ echo yes
+ all="$all docs"
+ else
+ echo no
+ fi
+
+ printf "Creating $outdir/config.mk... "
+ cat <<-EOF > "$outdir"/config.mk
+ CC=$CC
+ SCDOC=$SCDOC
+ LIBS=$LIBS
+ PREFIX=${PREFIX:-/usr/local}
+ OUTDIR=${outdir}
+ _INSTDIR=\$(DESTDIR)\$(PREFIX)
+ BINDIR?=${BINDIR:-\$(_INSTDIR)/bin}
+ LIBDIR?=${LIBDIR:-\$(_INSTDIR)/lib}
+ MANDIR?=${MANDIR:-\$(_INSTDIR)/share/man}
+ CACHE=\$(OUTDIR)/cache
+ CFLAGS=${CFLAGS}
+ CFLAGS+=-Iinclude -I\$(OUTDIR)
+ CFLAGS+=-DPREFIX='"\$(PREFIX)"'
+ CFLAGS+=-DLIBDIR='"\$(LIBDIR)"'
+
+ all: ${all}
+ EOF
+
+ for target in $all
+ do
+ $target >>"$outdir"/config.mk
+ done
+ echo done
+
+ touch $outdir/cppcache
+
+ if [ "$srcdir" = "." ]
+ then
+ return
+ fi
+
+ populate() (
+ path="$1"
+ mkdir -p "${path#$srcdir/}"
+ fullpath() ( cd "$1" && pwd )
+ for orig in "$path"/*
+ do
+ link="${orig#$srcdir/}"
+ if [ -d "$orig" ]
+ then
+ mkdir -p $link
+ populate "$orig"
+ elif [ -f "$orig" ]
+ then
+ ln -sf "$(fullpath "$path")"/"$(basename "$orig")" "$link"
+ fi
+ done
+ )
+
+ printf "Populating build dir... "
+ populate "$srcdir/include"
+ populate "$srcdir/src"
+ populate "$srcdir/doc"
+ ln -sf "$srcdir"/Makefile ./
+ echo done
+}