#!/bin/sh # Try and be like autotools configure, but without autotools # Ensure that we do not inherit these from env STRLCPY= STRLCAT= VASPRINTF= LIBFETCH= PROPLIB= OS= BUILD= HOST= TARGET= DEBUG= BUILD_API_DOCS= BUILD_PIE= SILENT=yes HAVE_VISIBILITY=no 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] --etcdir=DIR configuration files [PREFIX/etc] --debug Build with debugging code and symbols --verbose Disable silent build to see compilation details --with-pie Build XBPS programs as PIE (default disabled) --with-api-docs install XBPS API Library documentation (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;; --etcdir) ETCDIR=$var;; --libdir) LIBDIR=$var;; --datadir|--infodir) ;; # ignore autotools --with-api-docs) BUILD_API_DOCS=$var;; --verbose) unset SILENT;; --with-pie) BUILD_PIE=$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} : ${ETCDIR:=${PREFIX}/etc} : ${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 echo "ETCDIR ?= $ETCDIR" >>$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 = -pthread" >>$CONFIG_MK if [ -n "$CFLAGS" ]; then echo "CFLAGS += $CFLAGS" >>$CONFIG_MK fi echo "LDFLAGS = -L\$(TOPDIR)/lib -L\$(LIBDIR)" >>$CONFIG_MK if [ -n "$LDFLAGS" ]; then echo "LDFLAGS += $LDFLAGS" >>$CONFIG_MK fi echo "CPPFLAGS = -I. -I\$(TOPDIR) -I\$(TOPDIR)/include" >>$CONFIG_MK echo "CPPFLAGS += -DHAVE_CONFIG_H" >>$CONFIG_MK echo "CPPFLAGS += -DXBPS_CONF_PATH=\\\"${ETCDIR}\\\"" >>$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=500" >>$CONFIG_MK echo "CPPFLAGS += -D_FILE_OFFSET_BITS=64" >> $CONFIG_MK ;; *) ;; esac # 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 [ -z "$var" ] && var="CFLAGS" printf "Checking if $CC supports -${mode}${flag} ... " cat <_ccflag.c #include 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" -a -z "$var" ]; 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 vla no-overlength-strings \ unsafe-loop-optimizations undef sign-compare \ missing-include-dirs old-style-definition \ init-self redundant-decls float-equal missing-noreturn \ cast-align cast-qual pointer-arith comment unused-macros \ declaration-after-statement write-strings stack-protector; do check_compiler_flag ${f} W done # # Check for some compiler flags. # check_compiler_flag pic f CFLAGS check_compiler_flag PIC f CFLAGS check_compiler_flag stack-protector-all f CFLAGS if [ $? -eq 0 ]; then if [ "$CC" = "gcc" ]; then check_compiler_flag "param ssp-buffer-size=1" - CFLAGS fi fi if [ $? -eq 0 ]; then echo "CPPFLAGS += -D_FORTIFY_SOURCE=2" >>$CONFIG_MK fi check_compiler_flag "visibility=default" f SHAREDLIB_CFLAGS if [ $? -eq 0 ]; then HAVE_VISIBILITY=yes echo "CPPFLAGS += -DHAVE_VISIBILITY=1" >>$CONFIG_MK fi check_compiler_flag "std=c99" "" CFLAGS # # Check for -Wl,--export-dynamic and if it fails, try -rdynamic. # check_compiler_flag "l,--export-dynamic" W LIBXBPS_LDFLAGS if [ $? -ne 0 ]; then check_compiler_flag dynamic r LIBXBPS_LDFLAGS fi # # Check if -fPIE and -pie are supported if --build-pie is set. # if [ -n "$BUILD_PIE" ]; then check_compiler_flag PIE f PROG_CFLAGS if [ $? -eq 0 ]; then check_compiler_flag pie "" PROG_LDFLAGS fi if [ $? -eq 0 ]; then echo "Building programs as PIE (Position Independent Executable)." BUILD_PIE_VAL=yes else BUILD_PIE_VAL=no fi fi # # Check for vasprintf(). # func=vasprintf printf "Checking for $func() ... " cat <_$func.c #define _GNU_SOURCE #include int main(void) { vasprintf(NULL, NULL, NULL); return 0; } EOF if $XCC _$func.c -o _$func 2>/dev/null; then VASPRINTF=yes echo "CPPFLAGS += -DHAVE_VASPRINTF" >> $CONFIG_MK else VASPRINTF=no echo "COMPAT_SRCS+= compat/vasprintf.o" >>$CONFIG_MK echo "#include \"compat.h\"" >>$CONFIG_H fi echo "$VASPRINTF." rm -f _$func.c _$func # # Check for strcasestr(). # func=strcasestr printf "Checking for $func() ..." cat <_$func.c #define _GNU_SOURCE #include int main(void) { const char *h = "NEEDCOFEE"; const char *n = "IneedCoffee"; strcasestr(n, h); return 0; } EOF if $XCC _$func.c -o _$func 2>/dev/null; then STRCASESTR=yes echo "CPPFLAGS += -DHAVE_STRCASESTR" >>$CONFIG_MK else STRCASESTR=no echo "COMPAT_SRCS += compat/strcasestr.o" >>$CONFIG_MK echo "#include \"compat.h\"" >>$CONFIG_H fi echo "$STRCASESTR." rm -f _$func _$func.c # # Check for strlcpy(). # func=strlcpy printf "Checking for $func() ... " cat <_$func.c #include int main(void) { const char s1[] = "foo"; char s2[10]; strlcpy(s2, s1, sizeof(s2)); return 0; } EOF if $XCC _$func.c -o _$func 2>/dev/null; then STRLCPY=yes echo "CPPFLAGS += -DHAVE_STRLCPY" >> $CONFIG_MK else STRLCPY=no echo "COMPAT_SRCS += compat/strlcpy.o" >>$CONFIG_MK echo "#include \"compat.h\"" >>$CONFIG_H fi echo "$STRLCPY." rm -f _$func.c _$func # # Check for strlcat(). func=strlcat printf "Checking for $func() ... " cat < _$func.c #include int main(void) { const char src[] = "foo"; char dst[10]; strlcat(dst, src, sizeof(dst)); return 0; } EOF if $XCC _$func.c -o _$func 2>/dev/null; then STRLCAT=yes echo "CPPFLAGS += -DHAVE_STRLCAT" >>$CONFIG_MK else STRLCAT=no echo "COMPAT_SRCS += compat/strlcat.o" >>$CONFIG_MK echo "#include \"compat.h\"" >>$CONFIG_H fi echo "$STRLCAT." rm -f _$func.c _$func # # Check for libfetch's fetchIO_read(). # func=fetchIO_read printf "Checking for $func() ... " cat < _$func.c #include int main(void) { fetchIO_read(NULL, NULL, 0); return 0; } EOF if $XCC -lfetch _$func.c -o _$func 2>/dev/null; then LIBFETCH=yes echo "USE_EXTERNAL_LIBFETCH = 1" >>$CONFIG_MK echo "LDFLAGS += -lfetch" >>$CONFIG_MK echo "PROG_LDFLAGS += \$(TOPDIR)/lib/libxbps.a -lfetch" >>$CONFIG_MK echo "STATIC_LIBS = \$(TOPDIR)/lib/libxbps.a -lfetch" >>$CONFIG_MK else LIBFETCH=no echo "CPPFLAGS += -I\$(TOPDIR)/lib/fetch" >>$CONFIG_MK echo "PROG_LDFLAGS += \$(TOPDIR)/lib/libxbps.a" >>$CONFIG_MK echo "STATIC_LIBS = \$(TOPDIR)/lib/libxbps.a" >>$CONFIG_MK fi echo "$LIBFETCH." rm -f _$func.c _$func # # Check for prop_dictionary_internalize_from_zfile(). # func=prop_dictionary_internalize_from_zfile printf "Checking for $func() ... " cat < _$func.c #include #include int main(void) { prop_dictionary_internalize_from_zfile(NULL); return 0; } EOF if $XCC -lprop _$func.c -o _$func 2>/dev/null; then PROPLIB=yes echo "USE_EXTERNAL_PROPLIB = 1" >>$CONFIG_MK echo "LDFLAGS += -lz -lpthread -lprop" >>$CONFIG_MK echo "STATIC_LIBS += -lprop -lz -lpthread" >>$CONFIG_MK else PROPLIB=no echo "CPPFLAGS += -I\$(TOPDIR)/lib/portableproplib" >>$CONFIG_MK echo "LDFLAGS += -lpthread" >>$CONFIG_MK echo "STATIC_LIBS += -lpthread" >>$CONFIG_MK fi echo "$PROPLIB." rm -f _$func.c _$func # # zlib is required. # func=InflateInit2 printf "Checking for $func() ... " cat < _$func.c #include int main(void) { z_stream strm; strm.zalloc = Z_NULL; strm.zfree = Z_NULL; strm.opaque = Z_NULL; strm.avail_in = 0; strm.next_in = Z_NULL; inflateInit2(&strm, 15+16); return 0; } EOF if $XCC -lz _$func.c -o _$func 2>/dev/null; then ZLIB=yes echo "LDFLAGS += -lz" >>$CONFIG_MK echo "STATIC_LIBS += -lz" >>$CONFIG_MK else ZLIB=no fi echo "$ZLIB." rm -f _$func.c _$func if [ "$ZLIB" = "no" ]; then echo "Failed to link with your system's zlib, can't continue..." exit 1 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 # # 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)." echo "CFLAGS += $($PKGCONFIG_BIN --cflags libarchive)" >>$CONFIG_MK echo "LDFLAGS += $($PKGCONFIG_BIN --libs libarchive)" >>$CONFIG_MK echo "STATIC_LIBS += $($PKGCONFIG_BIN --libs --static libarchive)" \ >>$CONFIG_MK fi # # 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)." echo "CFLAGS += $($PKGCONFIG_BIN --cflags libssl)" >>$CONFIG_MK echo "LDFLAGS += $($PKGCONFIG_BIN --libs libssl)" >>$CONFIG_MK echo "STATIC_LIBS += $($PKGCONFIG_BIN --libs --static libssl)" \ >>$CONFIG_MK fi if [ -n "$SILENT" ]; then echo "SILENT = @" >>$CONFIG_MK else echo "SILENT =" >>$CONFIG_MK fi 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 " ETCDIR = $ETCDIR" if [ -n "$CFLAGS" ]; then echo " CFLAGS = $CFLAGS" fi if [ -n "$LDFLAGS" ]; then echo " LDFLAGS = $LDFLAGS" fi echo echo " Build API documentation = $BUILD_API_DOCS_VALUE" echo " Build programs as PIE = $BUILD_PIE_VAL" echo " Build with debug = $DEBUG" echo " Use external proplib = $PROPLIB" echo " Use external libfetch = $LIBFETCH" if [ -n "$HAVE_VISIBILITY" ]; then echo " Symbol visibility = $HAVE_VISIBILITY" fi echo echo " You can now run make && make install clean." echo exit 0