f888b582f9
Changes included in this set: * Added strlcat() and strlcpy() from OpenBSD, always use them if the system does not have them built in. * Changed an array of PATH_MAX size allocated in the stack, to a dynamically allocated buffer from heap. This should reduce memory usage a bit. * Simplify code that implemented a homegrown realpath(3) implementation, simply use realpath(3). * If compiler supports -fstack-protector, build all code with -D_FORTIFY_SOURCE=2 and --param ssp-buffer-size=1 so that all buffers are protected.
419 lines
9.5 KiB
Bash
Executable File
419 lines
9.5 KiB
Bash
Executable File
#!/bin/sh
|
|
# Try and be like autotools configure, but without autotools
|
|
|
|
# Ensure that we do not inherit these from env
|
|
STRLCPY=
|
|
STRLCAT=
|
|
OS=
|
|
BUILD=
|
|
HOST=
|
|
TARGET=
|
|
DEBUG=
|
|
BUILD_API_DOCS=
|
|
BUILD_PIE=
|
|
EXTERNAL_PROPLIB=
|
|
|
|
usage()
|
|
{
|
|
cat <<_EOF
|
|
\`configure' configures XBPS to adapt to many kinds of systems.
|
|
|
|
By default, \`make install' will install all the files in
|
|
\`/usr/local/sbin', \`/usr/local/lib' etc. You can specify
|
|
an installation prefix other than \`/usr/local' using \`--prefix',
|
|
for instance \`--prefix=\$HOME'.
|
|
|
|
--prefix=DIR install architecture-independent files in PREFIX
|
|
--sbindir=DIR system admin executables [PREFIX/sbin]
|
|
--libdir=DIR object code libraries [PREFIX/lib]
|
|
--includedir=DIR C header files [PREFIX/include]
|
|
--mandir=DIR man documentation [PREFIX/share/man]
|
|
--datadir=DIR read-only architecture-independent data [PREFIX/share]
|
|
|
|
--debug Build with debugging code and symbols
|
|
--with-pie Build XBPS programs as PIE (default disabled)
|
|
--with-api-docs install XBPS API Library documentation (default disabled)
|
|
--with-external-proplib Use external proplib [default disabled]
|
|
|
|
_EOF
|
|
exit 1
|
|
}
|
|
|
|
for x; do
|
|
opt=${x%%=*}
|
|
var=${x#*=}
|
|
case "$opt" in
|
|
--debug) DEBUG=yes;;
|
|
--prefix) PREFIX=$var;;
|
|
--sbindir) SBINDIR=$var;;
|
|
--mandir) MANDIR=$var;;
|
|
--datadir) SHAREDIR=$var;;
|
|
--build) BUILD=$var;;
|
|
--host) HOST=$var;;
|
|
--target) TARGET=$var;;
|
|
--includedir) INCLUDEDIR=$var;;
|
|
--libdir) LIBDIR=$var;;
|
|
--datadir|--infodir) ;; # ignore autotools
|
|
--with-api-docs) BUILD_API_DOCS=$var;;
|
|
--with-pie) BUILD_PIE=$var;;
|
|
--with-external-proplib) EXTERNAL_PROPLIB=$var;;
|
|
--help) usage;;
|
|
*) echo "$0: WARNING: unknown option $opt" >&2;;
|
|
esac
|
|
done
|
|
|
|
: ${SED:=sed}
|
|
|
|
: ${PREFIX:=/usr/local}
|
|
: ${SYSCONFDIR:=${PREFIX}/etc}
|
|
: ${SBINDIR:=${PREFIX}/sbin}
|
|
: ${LIBDIR:=${PREFIX}/lib}
|
|
: ${SHAREDIR:=${PREFIX}/share}
|
|
: ${MANDIR:=${PREFIX}/share/man}
|
|
: ${INCLUDEDIR:=${PREFIX}/include}
|
|
: ${TOPDIR:=..}
|
|
|
|
_which()
|
|
{
|
|
x="$(which "$1" 2>/dev/null)"
|
|
if [ -n "$x" ]; then
|
|
echo "$x"
|
|
return 0
|
|
fi
|
|
for x in /sbin/"$1" /usr/sbin/"$1" \
|
|
/usr/pkg/sbin/"$1" /usr/local/sbin/"$1"
|
|
do
|
|
if [ -e "$x" ]; then
|
|
echo "$x"
|
|
return 0
|
|
fi
|
|
done
|
|
return 1
|
|
}
|
|
|
|
CONFIG_H=config.h
|
|
CONFIG_MK=config.mk
|
|
|
|
if [ -z "$BUILD" ]; then
|
|
BUILD=`uname -m`-unknown-`uname -s | tr '[:upper:]' '[:lower:]'`
|
|
fi
|
|
if [ -z "$HOST" ]; then
|
|
[ -z "$TARGET" ] && TARGET=$BUILD
|
|
HOST=$TARGET
|
|
fi
|
|
if [ -z "$TARGET" ]; then
|
|
[ -z "$HOST" ] && HOST=$BUILD
|
|
TARGET=$HOST
|
|
fi
|
|
|
|
if [ -z "$OS" ]; then
|
|
# Derive OS from cpu-manufacturer-os-kernel
|
|
CPU=${TARGET%%-*}
|
|
REST=${TARGET#*-}
|
|
MANU=${REST%%-*}
|
|
REST=${REST#*-}
|
|
OS=${REST%%-*}
|
|
REST=${REST#*-}
|
|
KERNEL=${REST%%-*}
|
|
fi
|
|
|
|
echo "Configuring xbps for ... $OS"
|
|
rm -f $CONFIG_H $CONFIG_MK
|
|
echo "# Common vars used by XBPS on $OS." >$CONFIG_MK
|
|
echo "/* $OS */" >$CONFIG_H
|
|
|
|
echo "TOPDIR ?= $TOPDIR" >>$CONFIG_MK
|
|
echo "PREFIX ?= $PREFIX" >>$CONFIG_MK
|
|
echo "SBINDIR ?= $SBINDIR" >>$CONFIG_MK
|
|
echo "INCLUDEDIR ?= $INCLUDEDIR" >>$CONFIG_MK
|
|
echo "LIBDIR ?= $LIBDIR" >>$CONFIG_MK
|
|
echo "MANDIR ?= $MANDIR" >>$CONFIG_MK
|
|
echo "SHAREDIR ?= $SHAREDIR" >>$CONFIG_MK
|
|
|
|
[ -z "$DEBUG" ] && DEBUG=no
|
|
[ -z "$BUILD_PIE" ] && BUILD_PIE_VAL=no
|
|
|
|
if [ -z "$CC" ]; then
|
|
printf "Looking for compiler ... "
|
|
for b in $TARGET- ""; do
|
|
for cc in gcc pcc icc cc clang; do
|
|
if type $b$cc >/dev/null 2>&1; then
|
|
CC=$b$cc
|
|
echo "$CC"
|
|
break
|
|
fi
|
|
done
|
|
[ -n "$CC" ] && break
|
|
done
|
|
if [ -z "$CC" ]; then
|
|
echo
|
|
echo "no suitable compiler found - aborting" >&2
|
|
exit 1
|
|
fi
|
|
else
|
|
echo "Using compiler $CC"
|
|
fi
|
|
echo "CC = $CC" >>$CONFIG_MK
|
|
echo "CFLAGS = -fPIC -DPIC" >>$CONFIG_MK
|
|
echo "LDFLAGS = -L\$(TOPDIR)/lib -L\$(LIBDIR)" >>$CONFIG_MK
|
|
echo "CPPFLAGS = -I. -I\$(TOPDIR) -I\$(TOPDIR)/include" >>$CONFIG_MK
|
|
echo "CPPFLAGS += -DHAVE_CONFIG_H" >>$CONFIG_MK
|
|
|
|
if [ -n "$DEBUG" -a "$DEBUG" != no -a "$DEBUG" != false ]; then
|
|
echo "Building with debugging symbols."
|
|
echo "INSTALL_STRIPPED =" >>$CONFIG_MK
|
|
echo "CFLAGS += -g" >>$CONFIG_MK
|
|
echo "CPPFLAGS += -DDEBUG" >>$CONFIG_MK
|
|
else
|
|
echo "INSTALL_STRIPPED = -s" >>$CONFIG_MK
|
|
fi
|
|
|
|
case "$OS" in
|
|
linux)
|
|
echo "CPPFLAGS += -D_XOPEN_SOURCE=600 -D_GNU_SOURCE" >>$CONFIG_MK
|
|
echo "CPPFLAGS += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE" >> $CONFIG_MK
|
|
echo "CPPFLAGS += -D_LARGE_FILES" >> $CONFIG_MK
|
|
;;
|
|
*)
|
|
;;
|
|
esac
|
|
|
|
|
|
#
|
|
# Check if external proplib should be used instead.
|
|
#
|
|
if [ -z "$EXTERNAL_PROPLIB" ]; then
|
|
EXTERNAL_PROPLIB_VALUE=no
|
|
echo "CPPFLAGS += -I\$(TOPDIR)/lib/portableproplib" >>$CONFIG_MK
|
|
else
|
|
EXTERNAL_PROPLIB_VALUE=yes
|
|
echo "USE_EXTERNAL_PROPLIB = 1" >>$CONFIG_MK
|
|
echo "LDFLAGS += -lprop" >>$CONFIG_MK
|
|
echo "STATIC_PROPLIB = -lprop" >> $CONFIG_MK
|
|
fi
|
|
|
|
|
|
# Add CPPFLAGS and CFLAGS to CC for testing features
|
|
XCC="$CC `$SED -n -e 's/CPPLAGS+=*\(.*\)/\1/p' $CONFIG_MK`"
|
|
XCC="$XCC `$SED -n -e 's/CFLAGS+=*\(.*\)/\1/p' $CONFIG_MK`"
|
|
|
|
check_compiler_flag()
|
|
{
|
|
local flag="$1"
|
|
local mode="$2"
|
|
local var="$3"
|
|
local rv=0
|
|
|
|
if [ -z "$var" ]; then
|
|
var="CFLAGS"
|
|
fi
|
|
|
|
printf "Checking if $CC supports -${mode}${flag} ... "
|
|
cat <<EOF >_ccflag.c
|
|
#include <stdio.h>
|
|
int main(void) { return 0; }
|
|
EOF
|
|
if $XCC -${mode}${flag} _ccflag.c -o _ccflag 2>_ccflag.err; then
|
|
if ! test -s _ccflag.err; then
|
|
if [ "$mode" = "W" ]; then
|
|
echo "CPPFLAGS += -${mode}${flag}" >>$CONFIG_MK
|
|
else
|
|
echo "$var += -${mode}${flag}" >>$CONFIG_MK
|
|
fi
|
|
echo "yes."
|
|
else
|
|
rv=1
|
|
echo "no."
|
|
fi
|
|
else
|
|
rv=1
|
|
echo "no."
|
|
fi
|
|
rm -f _ccflag.c _ccflag _ccflag.err
|
|
return $rv
|
|
}
|
|
|
|
#
|
|
# Check for some compiler warning flags.
|
|
#
|
|
for f in all extra error shadow "format=2" missing-prototypes \
|
|
missing-declarations nested-externs \
|
|
cast-align cast-qual pointer-arith comment unused-macros \
|
|
declaration-after-statement stack-protector; do
|
|
check_compiler_flag ${f} W
|
|
done
|
|
|
|
#
|
|
# Check for some compiler flags.
|
|
#
|
|
check_compiler_flag stack-protector-all f
|
|
if [ $? -ne 0 ]; then
|
|
check_compiler_flag stack-protector f
|
|
fi
|
|
if [ $? -eq 0 ]; then
|
|
check_compiler_flag "param ssp-buffer-size=1" -
|
|
fi
|
|
if [ $? -eq 0 ]; then
|
|
echo "CPPFLAGS += -D_FORTIFY_SOURCE=2" >>$CONFIG_MK
|
|
fi
|
|
check_compiler_flag "visibility=default" f SHAREDLIB_CFLAGS
|
|
check_compiler_flag "std=c99"
|
|
|
|
#
|
|
# Check if -fPIE and -pie are supported if --build-pie is set.
|
|
#
|
|
if [ -n "$BUILD_PIE" ]; then
|
|
BUILD_PIE_VAL=yes
|
|
echo "Building programs as PIE (Position Independent Executable)."
|
|
check_compiler_flag PIE f PROG_CFLAGS
|
|
check_compiler_flag pie "" PROG_LDFLAGS
|
|
fi
|
|
|
|
#
|
|
# Check for strlcpy().
|
|
#
|
|
printf "Checking for strlcpy() ... "
|
|
cat <<EOF >_strlcpy.c
|
|
#include <string.h>
|
|
int main(void) {
|
|
const char s1[] = "foo";
|
|
char s2[10];
|
|
strlcpy(s2, s1, sizeof(s2));
|
|
return 0;
|
|
}
|
|
EOF
|
|
if $XCC _strlcpy.c -o _strlcpy 2>/dev/null; then
|
|
STRLCPY=yes
|
|
else
|
|
STRLCPY=no
|
|
fi
|
|
echo "$STRLCPY."
|
|
rm -f _strlcpy.c _strlcpy
|
|
if [ "$STRLCPY" = no ]; then
|
|
echo "COMPAT_SRCS += compat/strlcpy.o" >>$CONFIG_MK
|
|
echo "#include \"strlcpy.h\"" >>$CONFIG_H
|
|
echo "CPPFLAGS += -DHAVE_STRLCPY" >> $CONFIG_MK
|
|
fi
|
|
|
|
#
|
|
# Check for strlcat().
|
|
printf "Checking for strlcat() ... "
|
|
cat <<EOF > _strlcat.c
|
|
#include <string.h>
|
|
int main(void) {
|
|
const char src[] = "foo"
|
|
char dst[10];
|
|
strlcat(dst, src, sizeof(dst));
|
|
return 0;
|
|
}
|
|
EOF
|
|
if $XCC _strlcat.c -o _strlcat 2>/dev/null; then
|
|
STRLCAT=yes
|
|
else
|
|
STRLCAT=no
|
|
fi
|
|
echo "$STRLCAT."
|
|
rm -f _strlcat.c _strlcat
|
|
if [ "$STRLCAT" = no ]; then
|
|
echo "COMPAT_SRCS += compat/strlcat.o" >>$CONFIG_MK
|
|
echo "#include \"strlcat.h\"" >>$CONFIG_H
|
|
echo "CPPFLAGS += -DHAVE_STRLCAT" >>$CONFIG_MK
|
|
fi
|
|
|
|
#
|
|
# If building API library documentation, doxygen and graphviz are required.
|
|
#
|
|
if [ -n "$BUILD_API_DOCS" ]; then
|
|
echo "Building API documentation via doxygen and graphviz."
|
|
printf "Checking for doxygen ..."
|
|
DOXYGEN_BIN=$(_which doxygen)
|
|
if [ -z "$DOXYGEN_BIN" ]; then
|
|
echo "not found, exiting."
|
|
exit 1
|
|
else
|
|
echo yes
|
|
fi
|
|
printf "Checking for graphviz ... "
|
|
DOT_BIN=$(_which dot)
|
|
if [ -z "$DOT_BIN" ]; then
|
|
echo "dot(1) command not found, exiting."
|
|
exit 1
|
|
else
|
|
echo yes
|
|
fi
|
|
|
|
echo "BUILD_API_DOCS= yes" >> $CONFIG_MK
|
|
BUILD_API_DOCS_VALUE=yes
|
|
else
|
|
BUILD_API_DOCS_VALUE=no
|
|
fi
|
|
|
|
#
|
|
# pkg-config is required to know dependencies for static linking.
|
|
#
|
|
printf "Checking for pkg-config ... "
|
|
PKGCONFIG_BIN=$(_which pkg-config)
|
|
if [ -z "$PKGCONFIG_BIN" ]; then
|
|
echo "not found, exiting."
|
|
exit 1
|
|
else
|
|
echo yes
|
|
fi
|
|
|
|
#
|
|
# zlib with pkg-config support is required.
|
|
#
|
|
printf "Checking for zlib via pkg-config ..."
|
|
if ! $PKGCONFIG_BIN --exists zlib; then
|
|
echo "zlib.pc file not found, exiting."
|
|
exit 1
|
|
else
|
|
echo "found version $($PKGCONFIG_BIN --modversion zlib)."
|
|
fi
|
|
|
|
echo "STATIC_LIBS = -lz \$(STATIC_PROPLIB) -lpthread" >>$CONFIG_MK
|
|
|
|
#
|
|
# OpenSSL libssl with pkg-config support is required.
|
|
#
|
|
printf "Checking for OpenSSL via pkg-config ..."
|
|
if ! $PKGCONFIG_BIN --exists libssl; then
|
|
echo "libssl.pc file not found, exiting."
|
|
exit 1
|
|
else
|
|
echo "found version $($PKGCONFIG_BIN --modversion libssl)."
|
|
fi
|
|
|
|
echo "STATIC_LIBS += $($PKGCONFIG_BIN --libs --static libssl)" >>$CONFIG_MK
|
|
|
|
#
|
|
# libarchive >= 2.8.0 with pkg-config support is required.
|
|
#
|
|
printf "Checking for libarchive via pkg-config ... "
|
|
if ! $PKGCONFIG_BIN --exists libarchive; then
|
|
echo "libarchive.pc file not found, exiting."
|
|
exit 1
|
|
else
|
|
echo "found version $($PKGCONFIG_BIN --modversion libarchive)."
|
|
fi
|
|
|
|
echo "STATIC_LIBS += $($PKGCONFIG_BIN --libs --static libarchive)" >>$CONFIG_MK
|
|
|
|
echo
|
|
echo " XBPS has been configured with the following options:"
|
|
echo
|
|
echo " SBINDIR = $SBINDIR"
|
|
echo " LIBDIR = $LIBDIR"
|
|
echo " INCLUDEDIR = $INCLUDEDIR"
|
|
echo " SHAREDIR = $SHAREDIR"
|
|
echo " MANDIR = $MANDIR"
|
|
echo " BUILD_API_DOCS = $BUILD_API_DOCS_VALUE"
|
|
echo " BUILD_PIE = $BUILD_PIE_VAL"
|
|
echo " DEBUG = $DEBUG"
|
|
echo " EXTERNAL PROPLIB = $EXTERNAL_PROPLIB_VALUE"
|
|
echo
|
|
echo " You can now run make && make install clean."
|
|
echo
|
|
|
|
exit 0
|