mirror of
https://github.com/bjc/prosody.git
synced 2025-03-31 11:47:40 +03:00
592 lines
15 KiB
Bash
Executable file
592 lines
15 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
# Defaults
|
|
|
|
APP_NAME="Prosody"
|
|
APP_DIRNAME="prosody"
|
|
PREFIX="/usr/local"
|
|
SYSCONFDIR="$PREFIX/etc/$APP_DIRNAME"
|
|
LIBDIR="$PREFIX/lib"
|
|
DATADIR="$PREFIX/var/lib/$APP_DIRNAME"
|
|
LUA_SUFFIX=""
|
|
LUA_DIR="/usr"
|
|
LUA_BINDIR="/usr/bin"
|
|
LUA_INCDIR="/usr/include"
|
|
LUA_LIBDIR="/usr/lib"
|
|
IDN_LIB="idn"
|
|
ICU_FLAGS="-licui18n -licudata -licuuc"
|
|
OPENSSL_LIB="crypto"
|
|
CC="gcc"
|
|
LD="gcc"
|
|
RUNWITH="lua"
|
|
EXCERTS="yes"
|
|
PRNG=
|
|
PRNGLIBS=
|
|
|
|
CFLAGS="-fPIC -std=c99"
|
|
CFLAGS="$CFLAGS -Wall -pedantic -Wextra -Wshadow -Wformat=2"
|
|
LDFLAGS="-shared"
|
|
|
|
IDN_LIBRARY="icu"
|
|
# Help
|
|
|
|
show_help() {
|
|
cat <<EOF
|
|
Configure $APP_NAME prior to building.
|
|
|
|
--help This help.
|
|
--ostype=OS Use one of the OS presets. May be one of:
|
|
debian, macosx, linux, freebsd, openbsd, netbsd
|
|
--prefix=DIR Prefix where $APP_NAME should be installed.
|
|
Default is $PREFIX
|
|
--sysconfdir=DIR Location where the config file should be installed.
|
|
Default is \$PREFIX/etc/$APP_DIRNAME
|
|
--libdir=DIR Location where the server files should be stored.
|
|
Default is \$PREFIX/lib
|
|
--datadir=DIR Location where the server data should be stored.
|
|
Default is \$PREFIX/var/lib/$APP_DIRNAME
|
|
--lua-version=VERSION Use specific Lua version: 5.2, 5.3, or 5.4
|
|
Default is auto-detected.
|
|
--lua-suffix=SUFFIX Versioning suffix to use in Lua filenames.
|
|
Default is "$LUA_SUFFIX" (lua$LUA_SUFFIX...)
|
|
--with-lua=PREFIX Use Lua from given prefix.
|
|
Default is auto-detected (the parent directory of \$LUA_BINDIR).
|
|
--with-lua-bin=DIR You can also specify Lua's bin dir.
|
|
Default is the directory of the auto-detected Lua interpreter,
|
|
or \$LUA_DIR/bin if --with-lua is used.
|
|
--runwith=BINARY What Lua binary to set as runtime environment.
|
|
Default is $RUNWITH
|
|
--with-lua-include=DIR You can also specify Lua's includes dir.
|
|
Default is \$LUA_DIR/include
|
|
--with-lua-lib=DIR You can also specify Lua's libraries dir.
|
|
Default is \$LUA_DIR/lib
|
|
--with-idn=LIB The name of the IDN library to link with.
|
|
Default is $IDN_LIB
|
|
--idn-library=(idn|icu) Select library to use for IDNA functionality.
|
|
idn: use GNU libidn
|
|
icu: use ICU from IBM (default)
|
|
--with-ssl=LIB The name of the SSL to link with.
|
|
Default is $OPENSSL_LIB
|
|
--with-random=METHOD CSPRNG backend to use. One of
|
|
getrandom: Linux kernel
|
|
arc4random: OpenBSD kernel
|
|
openssl: OpenSSL RAND method
|
|
Default is to use /dev/urandom
|
|
--cflags=FLAGS Flags to pass to the compiler
|
|
Default is $CFLAGS
|
|
--add-cflags=FLAGS Adds additional CFLAGS, preserving defaults.
|
|
Can be repeated.
|
|
--ldflags=FLAGS Flags to pass to the linker
|
|
Default is $LDFLAGS
|
|
--add-ldflags=FLAGS Adds additional linker flags, preserving defaults.
|
|
Can be repeated.
|
|
--c-compiler=CC The C compiler to use when building modules.
|
|
Default is $CC
|
|
--compiler-wrapper=WRAPPER Adds a prefix to compiler and linker calls,
|
|
usable for eg distcc or ccache.
|
|
--linker=CC The linker to use when building modules.
|
|
Default is $LD
|
|
--no-example-certs Disables generation of example certificates.
|
|
EOF
|
|
}
|
|
|
|
# Helper functions
|
|
|
|
find_program() {
|
|
prog=$(command -v "$1" 2>/dev/null)
|
|
if [ -n "$prog" ]
|
|
then
|
|
dirname "$prog"
|
|
fi
|
|
}
|
|
|
|
die() {
|
|
echo "$*"
|
|
echo
|
|
echo "configure failed."
|
|
echo
|
|
exit 1
|
|
}
|
|
|
|
# COMPAT SC2039 has been phased out, remove in the future
|
|
# shellcheck disable=SC2039,SC3037
|
|
case $(echo -n x) in
|
|
-n*) echo_n_flag='';;
|
|
*) echo_n_flag='-n';;
|
|
esac
|
|
|
|
echo_n() {
|
|
echo $echo_n_flag "$*"
|
|
}
|
|
|
|
# ----------------------------------------------------------------------------
|
|
# MAIN PROGRAM
|
|
# ----------------------------------------------------------------------------
|
|
|
|
# Parse options
|
|
|
|
while [ -n "$1" ]
|
|
do
|
|
value=$(echo "$1" | sed 's/[^=]*.\(.*\)/\1/')
|
|
key=$(echo "$1" | sed 's/=.*//')
|
|
# shellcheck disable=SC2088
|
|
if echo "$value" | grep "~" >/dev/null 2>/dev/null
|
|
then
|
|
echo
|
|
echo '*WARNING*: the "~" sign is not expanded in flags.'
|
|
# shellcheck disable=SC2016
|
|
echo 'If you mean the home directory, use $HOME instead.'
|
|
echo
|
|
fi
|
|
case "$key" in
|
|
--help)
|
|
show_help
|
|
exit 0
|
|
;;
|
|
--prefix)
|
|
[ -n "$value" ] || die "Missing value in flag $key."
|
|
PREFIX="$value"
|
|
PREFIX_SET=yes
|
|
;;
|
|
--sysconfdir)
|
|
[ -n "$value" ] || die "Missing value in flag $key."
|
|
SYSCONFDIR="$value"
|
|
SYSCONFDIR_SET=yes
|
|
;;
|
|
--ostype)
|
|
OSPRESET="$value"
|
|
OSPRESET_SET="yes"
|
|
;;
|
|
--libdir)
|
|
LIBDIR="$value"
|
|
LIBDIR_SET=yes
|
|
;;
|
|
--datadir)
|
|
DATADIR="$value"
|
|
DATADIR_SET=yes
|
|
;;
|
|
--lua-suffix)
|
|
[ -n "$value" ] || die "Missing value in flag $key."
|
|
LUA_SUFFIX="$value"
|
|
LUA_SUFFIX_SET=yes
|
|
;;
|
|
--lua-version|--with-lua-version)
|
|
[ -n "$value" ] || die "Missing value in flag $key."
|
|
LUA_VERSION="$value"
|
|
[ "$LUA_VERSION" != "5.1" ] || die "Lua 5.1 is no longer supported"
|
|
[ "$LUA_VERSION" = "5.2" ] || [ "$LUA_VERSION" = "5.3" ] || [ "$LUA_VERSION" = "5.4" ] || die "Invalid Lua version in flag $key."
|
|
LUA_VERSION_SET=yes
|
|
;;
|
|
--with-lua)
|
|
[ -n "$value" ] || die "Missing value in flag $key."
|
|
LUA_DIR="$value"
|
|
LUA_DIR_SET=yes
|
|
;;
|
|
--with-lua-bin)
|
|
[ -n "$value" ] || die "Missing value in flag $key."
|
|
LUA_BINDIR="$value"
|
|
LUA_BINDIR_SET=yes
|
|
;;
|
|
--with-lua-include)
|
|
[ -n "$value" ] || die "Missing value in flag $key."
|
|
LUA_INCDIR="$value"
|
|
LUA_INCDIR_SET=yes
|
|
;;
|
|
--with-lua-lib)
|
|
[ -n "$value" ] || die "Missing value in flag $key."
|
|
LUA_LIBDIR="$value"
|
|
LUA_LIBDIR_SET=yes
|
|
;;
|
|
--with-idn)
|
|
IDN_LIB="$value"
|
|
;;
|
|
--idn-library)
|
|
IDN_LIBRARY="$value"
|
|
;;
|
|
--with-ssl)
|
|
OPENSSL_LIB="$value"
|
|
;;
|
|
--with-random)
|
|
case "$value" in
|
|
getrandom)
|
|
PRNG=GETRANDOM
|
|
;;
|
|
openssl)
|
|
PRNG=OPENSSL
|
|
;;
|
|
arc4random)
|
|
PRNG=ARC4RANDOM
|
|
;;
|
|
esac
|
|
;;
|
|
--cflags)
|
|
CFLAGS="$value"
|
|
;;
|
|
--add-cflags)
|
|
CFLAGS="$CFLAGS $value"
|
|
;;
|
|
--ldflags)
|
|
LDFLAGS="$value"
|
|
;;
|
|
--add-ldflags)
|
|
LDFLAGS="$LDFLAGS $value"
|
|
;;
|
|
--c-compiler)
|
|
CC="$value"
|
|
;;
|
|
--linker)
|
|
LD="$value"
|
|
;;
|
|
--runwith)
|
|
RUNWITH="$value"
|
|
RUNWITH_SET=yes
|
|
;;
|
|
--no-example-certs)
|
|
EXCERTS=
|
|
;;
|
|
--compiler-wrapper)
|
|
CC="$value $CC"
|
|
LD="$value $LD"
|
|
;;
|
|
*)
|
|
die "Error: Unknown flag: $1"
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
if [ "$OSPRESET_SET" = "yes" ]; then
|
|
# TODO make this a switch?
|
|
if [ "$OSPRESET" = "debian" ]; then
|
|
CFLAGS="$CFLAGS -ggdb"
|
|
fi
|
|
if [ "$OSPRESET" = "macosx" ]; then
|
|
if [ "$LUA_INCDIR_SET" != "yes" ]; then
|
|
LUA_INCDIR=/usr/local/include;
|
|
LUA_INCDIR_SET=yes
|
|
fi
|
|
if [ "$LUA_LIBDIR_SET" != "yes" ]; then
|
|
LUA_LIBDIR=/usr/local/lib
|
|
LUA_LIBDIR_SET=yes
|
|
fi
|
|
CFLAGS="$CFLAGS -mmacosx-version-min=10.3"
|
|
LDFLAGS="-bundle -undefined dynamic_lookup"
|
|
fi
|
|
if [ "$OSPRESET" = "linux" ]; then
|
|
CFLAGS="$CFLAGS -ggdb"
|
|
fi
|
|
if [ "$OSPRESET" = "freebsd" ] || [ "$OSPRESET" = "openbsd" ]; then
|
|
LUA_INCDIR="/usr/local/include/lua52"
|
|
LUA_INCDIR_SET=yes
|
|
CFLAGS="-Wall -fPIC -I/usr/local/include"
|
|
LDFLAGS="-I/usr/local/include -L/usr/local/lib -shared"
|
|
LUA_SUFFIX="52"
|
|
LUA_SUFFIX_SET=yes
|
|
LUA_DIR=/usr/local
|
|
LUA_DIR_SET=yes
|
|
CC=cc
|
|
LD=ld
|
|
fi
|
|
if [ "$OSPRESET" = "openbsd" ]; then
|
|
LUA_INCDIR="/usr/local/include";
|
|
LUA_INCDIR_SET="yes"
|
|
fi
|
|
if [ "$OSPRESET" = "netbsd" ]; then
|
|
LUA_INCDIR="/usr/pkg/include/lua-5.2"
|
|
LUA_INCDIR_SET=yes
|
|
LUA_LIBDIR="/usr/pkg/lib/lua/5.2"
|
|
LUA_LIBDIR_SET=yes
|
|
CFLAGS="-Wall -fPIC -I/usr/pkg/include"
|
|
LDFLAGS="-L/usr/pkg/lib -Wl,-rpath,/usr/pkg/lib -shared"
|
|
fi
|
|
if [ "$OSPRESET" = "pkg-config" ]; then
|
|
if [ "$LUA_SUFFIX_SET" != "yes" ]; then
|
|
LUA_SUFFIX="5.4";
|
|
LUA_SUFFIX_SET=yes
|
|
fi
|
|
LUA_CF="$(pkg-config --cflags-only-I lua"$LUA_SUFFIX")"
|
|
LUA_CF="${LUA_CF#*-I}"
|
|
LUA_CF="${LUA_CF%% *}"
|
|
if [ "$LUA_CF" != "" ]; then
|
|
LUA_INCDIR="$LUA_CF"
|
|
LUA_INCDIR_SET=yes
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
if [ "$PREFIX_SET" = "yes" ] && [ ! "$SYSCONFDIR_SET" = "yes" ]
|
|
then
|
|
if [ "$PREFIX" = "/usr" ]
|
|
then SYSCONFDIR=/etc/$APP_DIRNAME
|
|
else SYSCONFDIR=$PREFIX/etc/$APP_DIRNAME
|
|
fi
|
|
fi
|
|
|
|
if [ "$PREFIX_SET" = "yes" ] && [ ! "$DATADIR_SET" = "yes" ]
|
|
then
|
|
if [ "$PREFIX" = "/usr" ]
|
|
then DATADIR=/var/lib/$APP_DIRNAME
|
|
else DATADIR=$PREFIX/var/lib/$APP_DIRNAME
|
|
fi
|
|
fi
|
|
|
|
if [ "$PREFIX_SET" = "yes" ] && [ ! "$LIBDIR_SET" = "yes" ]
|
|
then
|
|
LIBDIR=$PREFIX/lib
|
|
fi
|
|
|
|
detect_lua_version() {
|
|
detected_lua=$("$1" -e 'print(_VERSION:match(" (5%.[234])$"))' 2> /dev/null)
|
|
if [ "$detected_lua" != "nil" ]
|
|
then
|
|
if [ "$LUA_VERSION_SET" != "yes" ]
|
|
then
|
|
echo "Lua version detected: $detected_lua"
|
|
LUA_VERSION=$detected_lua
|
|
return 0
|
|
elif [ "$LUA_VERSION" = "$detected_lua" ]
|
|
then
|
|
return 0
|
|
fi
|
|
fi
|
|
return 1
|
|
}
|
|
|
|
search_interpreter() {
|
|
suffix="$1"
|
|
if [ "$LUA_BINDIR_SET" = "yes" ]
|
|
then
|
|
find_lua="$LUA_BINDIR"
|
|
elif [ "$LUA_DIR_SET" = "yes" ]
|
|
then
|
|
LUA_BINDIR="$LUA_DIR/bin"
|
|
if [ -f "$LUA_BINDIR/lua$suffix" ]
|
|
then
|
|
find_lua="$LUA_BINDIR"
|
|
fi
|
|
else
|
|
find_lua=$(find_program lua"$suffix")
|
|
fi
|
|
if [ -n "$find_lua" ] && [ -x "$find_lua/lua$suffix" ]
|
|
then
|
|
if detect_lua_version "$find_lua/lua$suffix"
|
|
then
|
|
echo "Lua interpreter found: $find_lua/lua$suffix..."
|
|
if [ "$LUA_BINDIR_SET" != "yes" ]
|
|
then
|
|
LUA_BINDIR="$find_lua"
|
|
fi
|
|
if [ "$LUA_DIR_SET" != "yes" ]
|
|
then
|
|
LUA_DIR=$(dirname "$find_lua")
|
|
fi
|
|
LUA_SUFFIX="$suffix"
|
|
return 0
|
|
fi
|
|
fi
|
|
return 1
|
|
}
|
|
|
|
lua_interp_found=no
|
|
if [ "$LUA_SUFFIX_SET" != "yes" ]
|
|
then
|
|
if [ "$LUA_VERSION_SET" = "yes" ] && [ "$LUA_VERSION" = "5.2" ]
|
|
then
|
|
suffixes="5.2 52 -5.2 -52"
|
|
elif [ "$LUA_VERSION_SET" = "yes" ] && [ "$LUA_VERSION" = "5.3" ]
|
|
then
|
|
suffixes="5.3 53 -5.3 -53"
|
|
elif [ "$LUA_VERSION_SET" = "yes" ] && [ "$LUA_VERSION" = "5.4" ]
|
|
then
|
|
suffixes="5.4 54 -5.4 -54"
|
|
else
|
|
suffixes="5.2 52 -5.2 -52"
|
|
suffixes="$suffixes 5.3 53 -5.3 -53"
|
|
suffixes="$suffixes 5.4 54 -5.4 -54"
|
|
fi
|
|
for suffix in "" $suffixes
|
|
do
|
|
search_interpreter "$suffix" && {
|
|
lua_interp_found=yes
|
|
break
|
|
}
|
|
done
|
|
else
|
|
search_interpreter "$LUA_SUFFIX" && {
|
|
lua_interp_found=yes
|
|
}
|
|
fi
|
|
|
|
# See #1353
|
|
if [ "$LUA_DIR_SET" != "yes" ] && [ "$LUA_DIR" = "/" ]
|
|
then
|
|
LUA_DIR="/usr"
|
|
fi
|
|
|
|
|
|
if [ "$lua_interp_found" != "yes" ] && [ "$RUNWITH_SET" != "yes" ]
|
|
then
|
|
if [ "$LUA_VERSION_SET" ]; then
|
|
interp="Lua $LUA_VERSION";
|
|
else
|
|
interp="Lua";
|
|
fi
|
|
if [ "$LUA_DIR_SET" ] || [ "$LUA_BINDIR_SET" ]; then
|
|
where="$LUA_BINDIR";
|
|
else
|
|
where="\$PATH";
|
|
fi
|
|
echo "$interp interpreter not found in $where"
|
|
die "You may want to use the flags --with-lua, --with-lua-bin and/or --lua-suffix. See --help."
|
|
fi
|
|
|
|
if [ "$LUA_VERSION_SET" = "yes" ] && [ "$RUNWITH_SET" != "yes" ]
|
|
then
|
|
echo_n "Checking if $LUA_BINDIR/lua$LUA_SUFFIX is Lua version $LUA_VERSION... "
|
|
if detect_lua_version "$LUA_BINDIR/lua$LUA_SUFFIX"
|
|
then
|
|
echo "yes"
|
|
else
|
|
echo "no"
|
|
die "You may want to use the flags --with-lua, --with-lua-bin and/or --lua-suffix. See --help."
|
|
fi
|
|
fi
|
|
|
|
if [ "$LUA_INCDIR_SET" != "yes" ]
|
|
then
|
|
LUA_INCDIR="$LUA_DIR/include"
|
|
fi
|
|
|
|
if [ "$LUA_LIBDIR_SET" != "yes" ]
|
|
then
|
|
LUA_LIBDIR="$LUA_DIR/lib"
|
|
fi
|
|
|
|
lua_h="$LUA_INCDIR/lua.h"
|
|
echo_n "Looking for lua.h at $lua_h..."
|
|
if [ -f "$lua_h" ]
|
|
then
|
|
echo found
|
|
else
|
|
echo "not found"
|
|
for postfix in "$LUA_VERSION" "$LUA_SUFFIX"; do
|
|
if ! [ "$postfix" = "" ]; then
|
|
v_dir="$LUA_INCDIR/lua/$postfix";
|
|
else
|
|
v_dir="$LUA_INCDIR/lua";
|
|
fi
|
|
lua_h="$v_dir/lua.h"
|
|
echo_n "Looking for lua.h at $lua_h..."
|
|
if [ -f "$lua_h" ]
|
|
then
|
|
LUA_INCDIR="$v_dir"
|
|
echo found
|
|
break;
|
|
else
|
|
echo "not found"
|
|
d_dir="$LUA_INCDIR/lua$postfix"
|
|
lua_h="$d_dir/lua.h"
|
|
echo_n "Looking for lua.h at $lua_h..."
|
|
if [ -f "$lua_h" ]
|
|
then
|
|
echo found
|
|
LUA_INCDIR="$d_dir"
|
|
break;
|
|
else
|
|
echo "not found"
|
|
fi
|
|
fi
|
|
done
|
|
if [ ! -f "$lua_h" ]; then
|
|
echo "lua.h not found."
|
|
echo
|
|
die "You may want to use the flag --with-lua or --with-lua-include. See --help."
|
|
fi
|
|
fi
|
|
|
|
if [ "$lua_interp_found" = "yes" ]
|
|
then
|
|
echo_n "Checking if Lua header version matches that of the interpreter... "
|
|
header_version=$(sed -n 's/.*LUA_VERSION_NUM.*5.\(.\).*/5.\1/p' "$lua_h")
|
|
if [ "$header_version" = "$LUA_VERSION" ]
|
|
then
|
|
echo "yes"
|
|
else
|
|
echo "no"
|
|
echo "lua.h version mismatch (interpreter: $LUA_VERSION; lua.h: $header_version)."
|
|
die "You may want to use the flag --with-lua or --with-lua-include. See --help."
|
|
fi
|
|
fi
|
|
|
|
if [ "$IDN_LIBRARY" = "icu" ]
|
|
then
|
|
IDNA_LIBS="$ICU_FLAGS"
|
|
IDNA_FLAGS="-DUSE_STRINGPREP_ICU"
|
|
fi
|
|
if [ "$IDN_LIBRARY" = "idn" ]
|
|
then
|
|
IDNA_LIBS="-l$IDN_LIB"
|
|
fi
|
|
|
|
if [ -f config.unix ]; then
|
|
rm -f config.unix
|
|
fi
|
|
|
|
if [ "$RUNWITH_SET" != yes ]; then
|
|
RUNWITH="lua$LUA_SUFFIX"
|
|
fi
|
|
|
|
OPENSSL_LIBS="-l$OPENSSL_LIB"
|
|
|
|
if [ "$PRNG" = "OPENSSL" ]; then
|
|
PRNGLIBS=$OPENSSL_LIBS
|
|
elif [ "$PRNG" = "ARC4RANDOM" ] && [ "$(uname)" = "Linux" ]; then
|
|
PRNGLIBS="-lbsd"
|
|
fi
|
|
|
|
# Write config
|
|
|
|
echo "Writing configuration..."
|
|
echo
|
|
|
|
rm -f built
|
|
cat <<EOF > config.unix
|
|
# This file was automatically generated by the configure script.
|
|
# Run "./configure --help" for details.
|
|
|
|
LUA_VERSION=$LUA_VERSION
|
|
PREFIX=$PREFIX
|
|
SYSCONFDIR=$SYSCONFDIR
|
|
LIBDIR=$LIBDIR
|
|
DATADIR=$DATADIR
|
|
LUA_SUFFIX=$LUA_SUFFIX
|
|
LUA_DIR=$LUA_DIR
|
|
LUA_DIR_SET=$LUA_DIR_SET
|
|
LUA_INCDIR=$LUA_INCDIR
|
|
LUA_LIBDIR=$LUA_LIBDIR
|
|
LUA_BINDIR=$LUA_BINDIR
|
|
IDN_LIB=$IDN_LIB
|
|
IDNA_FLAGS=$IDNA_FLAGS
|
|
IDNA_LIBS=$IDNA_LIBS
|
|
OPENSSL_LIBS=$OPENSSL_LIBS
|
|
CFLAGS=$CFLAGS
|
|
LDFLAGS=$LDFLAGS
|
|
CC=$CC
|
|
LD=$LD
|
|
RUNWITH=$RUNWITH
|
|
EXCERTS=$EXCERTS
|
|
RANDOM=$PRNG
|
|
RANDOM_LIBS=$PRNGLIBS
|
|
|
|
|
|
EOF
|
|
|
|
echo "Installation prefix: $PREFIX"
|
|
echo "$APP_NAME configuration directory: $SYSCONFDIR"
|
|
echo "Using Lua from: $LUA_DIR"
|
|
|
|
make clean > /dev/null 2> /dev/null
|
|
|
|
echo
|
|
echo "Done. You can now run 'make' to build."
|
|
echo
|