421 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			421 lines
		
	
	
		
			9.6 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
 | 
						|
	if [ "$CC" = "gcc" ]; then
 | 
						|
		check_compiler_flag "param ssp-buffer-size=1" -
 | 
						|
	fi
 | 
						|
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)."
 | 
						|
	[ "$CC" = "gcc" ] && 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
 |