forked from aniani/gmnisrv
177 lines
2.9 KiB
Bash
177 lines
2.9 KiB
Bash
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
|
|
}
|