X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=bootstrap.sh;h=606d63d660ad01574b207c4d6729ed203f87d08c;hb=a8307570ed163de48393092f56360cea9c6e0a02;hp=a368197aaa77470a5b52705e10226047faabab0a;hpb=91ea3455ccf0cebaecbb2c0ee4ead073b6d86354;p=awesomized%2Flibmemcached diff --git a/bootstrap.sh b/bootstrap.sh index a368197a..606d63d6 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -151,7 +151,8 @@ function rebuild_host_os () fi } -# Valid values are: darwin,fedora,rhel,ubuntu +# Validate the distribution name, or toss an erro +# values: darwin,fedora,rhel,ubuntu,debian,opensuse function set_VENDOR_DISTRIBUTION () { local dist=`echo "$1" | tr '[A-Z]' '[a-z]'` @@ -165,9 +166,15 @@ function set_VENDOR_DISTRIBUTION () rhel) VENDOR_DISTRIBUTION='rhel' ;; + debian) + VENDOR_DISTRIBUTION='debian' + ;; ubuntu) VENDOR_DISTRIBUTION='ubuntu' ;; + suse) + VENDOR_DISTRIBUTION='opensuse' + ;; opensuse) VENDOR_DISTRIBUTION='opensuse' ;; @@ -177,21 +184,59 @@ function set_VENDOR_DISTRIBUTION () esac } +# Validate a Vendor's release name/number function set_VENDOR_RELEASE () { local release=`echo "$1" | tr '[A-Z]' '[a-z]'` - case "$VENDOR_DISTRIBUTION" in + + if $DEBUG; then + echo "VENDOR_DISTRIBUTION:$VENDOR_DISTRIBUTION" + echo "VENDOR_RELEASE:$release" + fi + + case $VENDOR_DISTRIBUTION in darwin) - VENDOR_RELEASE='mountain' + case $release in + 10.6*) + VENDOR_RELEASE='snow_leopard' + ;; + 10.7*) + VENDOR_RELEASE='mountain' + ;; + mountain) + VENDOR_RELEASE='mountain' + ;; + 10.8.*) + echo "mountain_lion" + VENDOR_RELEASE='mountain_lion' + ;; + *) + echo $VENDOR_RELEASE + VENDOR_RELEASE='unknown' + ;; + esac ;; fedora) VENDOR_RELEASE="$release" + if [[ "x$VENDOR_RELEASE" == '18' ]]; then + VENDOR_RELEASE='sphericalcow' + fi ;; rhel) VENDOR_RELEASE="$release" ;; + debian) + VENDOR_RELEASE="$release" + ;; ubuntu) VENDOR_RELEASE="$release" + if [[ "x$VENDOR_RELEASE" == 'x12.04' ]]; then + VENDOR_RELEASE="precise" + elif [[ "x$VENDOR_RELEASE" == 'x12.10' ]]; then + VENDOR_RELEASE="quantal" + elif [[ "x$VENDOR_RELEASE" == 'x13.04' ]]; then + VENDOR_RELEASE="raring" + fi ;; opensuse) VENDOR_RELEASE="$release" @@ -206,7 +251,7 @@ function set_VENDOR_RELEASE () } -# Valid values are: apple, redhat, centos, canonical +# Valid values are: apple, redhat, centos, canonical, oracle, suse function set_VENDOR () { local vendor=`echo "$1" | tr '[A-Z]' '[a-z]'` @@ -218,12 +263,30 @@ function set_VENDOR () redhat) VENDOR='redhat' ;; + fedora) + VENDOR='redhat' + ;; + redhat-release-server-*) + VENDOR='redhat' + ;; + enterprise-release-*) + VENDOR='oracle' + ;; centos) VENDOR='centos' ;; canonical) VENDOR='canonical' ;; + ubuntu) + VENDOR='canonical' + ;; + debian) + VENDOR='debian' + ;; + opensuse) + VENDOR='suse' + ;; suse) VENDOR='suse' ;; @@ -234,6 +297,27 @@ function set_VENDOR () set_VENDOR_DISTRIBUTION $2 set_VENDOR_RELEASE $3 + + # Set which vendor/versions we trust for autoreconf + case $VENDOR_DISTRIBUTION in + fedora) + if [[ "x$VENDOR_RELEASE" == 'x18' ]]; then + AUTORECONF_REBUILD_HOST=true + elif [[ "x$VENDOR_RELEASE" == 'xsphericalcow' ]]; then + AUTORECONF_REBUILD_HOST=true + elif [[ "x$VENDOR_RELEASE" == 'x19' ]]; then + AUTORECONF_REBUILD_HOST=true + fi + ;; + canonical) + if [[ "x$VENDOR_RELEASE" == 'xprecise' ]]; then + AUTORECONF_REBUILD_HOST=true + elif [[ "x$VENDOR_RELEASE" == 'xquantal' ]]; then + AUTORECONF_REBUILD_HOST=true + fi + ;; + esac + } function determine_target_platform () @@ -242,14 +326,14 @@ function determine_target_platform () UNAME_KERNEL=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_KERNEL_RELEASE=`(uname -r) 2>/dev/null` || UNAME_KERNEL_RELEASE=unknown - if [[ $(uname) == 'Darwin' ]]; then + if [[ -x '/usr/bin/sw_vers' ]]; then + local _VERSION=`/usr/bin/sw_vers -productVersion` + set_VENDOR 'apple' 'darwin' $_VERSION + elif [[ $(uname) == 'Darwin' ]]; then set_VENDOR 'apple' 'darwin' 'mountain' elif [[ -f '/etc/fedora-release' ]]; then local fedora_version=`cat /etc/fedora-release | awk ' { print $3 } '` set_VENDOR 'redhat' 'fedora' $fedora_version - if [[ "x$VENDOR_RELEASE" == 'x17' ]]; then - AUTORECONF_REBUILD_HOST=true - fi elif [[ -f '/etc/centos-release' ]]; then local centos_version=`cat /etc/centos-release | awk ' { print $7 } '` set_VENDOR 'centos' 'rhel' $centos_version @@ -259,14 +343,18 @@ function determine_target_platform () set_VENDOR 'suse' $suse_distribution $suse_version elif [[ -f '/etc/redhat-release' ]]; then local rhel_version=`cat /etc/redhat-release | awk ' { print $7 } '` - set_VENDOR 'redhat' 'rhel' $rhel_version + local _vendor=`rpm -qf /etc/redhat-release` + set_VENDOR $_vendor 'rhel' $rhel_version + elif [[ -f '/etc/os-release' ]]; then + source '/etc/os-release' + set_VENDOR $ID $ID $VERSION_ID + elif [[ -x '/usr/bin/lsb_release' ]]; then + local _ID=`/usr/bin/lsb_release -s -i` + local _VERSION=`/usr/bin/lsb_release -s -r` + set_VENDOR $_ID $_ID $_VERSION_ID elif [[ -f '/etc/lsb-release' ]]; then - local debian_DISTRIB_ID=`cat /etc/lsb-release | grep DISTRIB_ID | awk -F= ' { print $2 } '` - local debian_version=`cat /etc/lsb-release | grep DISTRIB_CODENAME | awk -F= ' { print $2 } '` - set_VENDOR 'canonical' $debian_DISTRIB_ID $debian_version - if [[ "x$VENDOR_RELEASE" == 'xprecise' ]]; then - AUTORECONF_REBUILD_HOST=true - fi + source '/etc/lsb-release' + set_VENDOR 'canonical' $DISTRIB_ID $DISTRIB_CODENAME fi rebuild_host_os @@ -297,11 +385,17 @@ function run_configure () local BUILD_CONFIGURE_ARG= # If ENV DEBUG is set we enable both debug and asssert, otherwise we see if this is a VCS checkout and if so enable assert - # Set ENV ASSERT in order to enable assert - if $DEBUG; then - BUILD_CONFIGURE_ARG+=' --enable-debug --enable-assert' - elif [[ -n "$VCS_CHECKOUT" ]]; then - BUILD_CONFIGURE_ARG+=' --enable-assert' + # Set ENV ASSERT in order to enable assert. + # If we are doing a valgrind run, we always compile with assert disabled + if $valgrind_run; then + BUILD_CONFIGURE_ARG+= " CXXFLAGS=-DNDEBUG " + BUILD_CONFIGURE_ARG+= " CFLAGS=-DNDEBUG " + else + if $DEBUG; then + BUILD_CONFIGURE_ARG+=' --enable-debug --enable-assert' + elif [[ -n "$VCS_CHECKOUT" ]]; then + BUILD_CONFIGURE_ARG+=' --enable-assert' + fi fi if [[ -n "$CONFIGURE_ARG" ]]; then @@ -353,7 +447,7 @@ function setup_gdb_command () { function setup_valgrind_command () { VALGRIND_PROGRAM=`type -p valgrind` if [[ -n "$VALGRIND_PROGRAM" ]]; then - VALGRIND_COMMAND="$VALGRIND_PROGRAM --error-exitcode=1 --leak-check=yes --show-reachable=yes --track-fds=yes --malloc-fill=A5 --free-fill=DE" + VALGRIND_COMMAND="$VALGRIND_PROGRAM --error-exitcode=1 --leak-check=yes --malloc-fill=A5 --free-fill=DE --xml=yes --xml-file=\"valgrind-%p.xml\"" fi } @@ -453,11 +547,6 @@ function safe_popd () function make_valgrind () { - if [[ "$VENDOR_DISTRIBUTION" == 'darwin' ]]; then - make_darwin_malloc - return - fi - # If the env VALGRIND_COMMAND is set then we assume it is valid local valgrind_was_set=false if [[ -z "$VALGRIND_COMMAND" ]]; then @@ -477,8 +566,10 @@ function make_valgrind () save_BUILD + valgrind_run=true + # If we are required to run configure, do so now - run_configure_if_required + run_configure # If we don't have a configure, then most likely we will be missing libtool assert_file 'configure' @@ -488,9 +579,22 @@ function make_valgrind () TESTS_ENVIRONMENT="$VALGRIND_COMMAND" fi - make_target 'check' || return 1 + make_target 'all' + make_target 'check' + ret=$? + + # If we aren't going to error, we will clean up our environment + if [ "$ret" -eq 0 ]; then + make 'distclean' + fi + + valgrind_run=false restore_BUILD + + if [ "$ret" -ne 0 ]; then + return 1 + fi } function make_install_system () @@ -541,32 +645,21 @@ function make_darwin_malloc () MallocScribble=$old_MallocScribble } -function snapshot_check () -{ - if [ ! -f "$BOOTSTRAP_SNAPSHOT_CHECK" ]; then - make_for_snapshot - fi - - if [ -n "$BOOTSTRAP_SNAPSHOT_CHECK" ]; then - assert_file "$BOOTSTRAP_SNAPSHOT_CHECK" 'snapshot check failed' - fi -} - # This will reset our environment, and make sure built files are available. function make_for_snapshot () { - # Make sure it is clean - make_maintainer_clean + # Lets make sure we have a clean environment + assert_no_file 'Makefile' + assert_no_file 'configure' + assert_no_directory 'autom4te.cache' run_configure - make_target 'dist' + make_target 'all' make_target 'distclean' # We should have a configure, but no Makefile at the end of this exercise assert_no_file 'Makefile' assert_exec_file 'configure' - - snapshot_check } function check_mingw () @@ -735,7 +828,7 @@ function make_for_clang_analyzer () function check_for_jenkins () { if ! $jenkins_build_environment; then - echo "Not inside of jenkins" + echo "Not inside of jenkins, simulating environment" if [ -f 'configure' ]; then make_maintainer_clean @@ -764,6 +857,13 @@ function make_universe () make_install_system } +function check_snapshot () +{ + if [ -n "$BOOTSTRAP_SNAPSHOT_CHECK" ]; then + assert_file "$BOOTSTRAP_SNAPSHOT_CHECK" 'snapshot check failed' + fi +} + function make_for_continuus_integration () { # Setup the environment if we are local @@ -775,7 +875,11 @@ function make_for_continuus_integration () # Platforms which require bootstrap should have some setup done before we hit this stage. # If we are building locally, skip this step, unless we are just testing locally. if $BOOTSTRAP_SNAPSHOT; then - snapshot_check + if $BOOTSTRAP_SNAPSHOT; then + assert_file 'configure' + fi + + check_snapshot else # If we didn't require a snapshot, then we should not have a configure assert_no_file 'configure' @@ -799,34 +903,7 @@ function make_for_continuus_integration () make_rpm elif [[ -d rpm ]]; then make_rpm - else - make_distcheck fi - - assert_exec_file 'configure' - assert_file 'Makefile' - - make_install_system - ;; - *-ubuntu-quantal-*) - run_configure - - assert_exec_file 'configure' - assert_file 'Makefile' - - make_target 'all' - - make_distcheck - - assert_exec_file 'configure' - assert_file 'Makefile' - - make_valgrind - - assert_exec_file 'configure' - assert_file 'Makefile' - - make_install_system ;; *) make_jenkins_default @@ -996,6 +1073,13 @@ function run_configure_if_required () assert_file 'Makefile' 'configure did not produce a Makefile' } +function run_make_maintainer_clean_if_possible () +{ + if [ -f 'Makefile' ]; then + make_maintainer_clean + fi +} + function run_autoreconf_if_required () { if [ ! -x 'configure' ]; then @@ -1003,6 +1087,7 @@ function run_autoreconf_if_required () fi assert_exec_file 'configure' + bash -n configure } function run_autoreconf () @@ -1016,7 +1101,7 @@ function run_autoreconf () run $BOOTSTRAP_LIBTOOLIZE '--copy' '--install' '--force' || die "Cannot execute $BOOTSTRAP_LIBTOOLIZE" fi - run $AUTORECONF || die "Cannot execute $AUTORECONF" + run $AUTORECONF $AUTORECONF_ARGS || die "Cannot execute $AUTORECONF" eval 'bash -n configure' || die "autoreconf generated a malformed configure" } @@ -1068,6 +1153,14 @@ function parse_command_line_options () ;; h) # help echo "bootstrap.sh [options] optional_target ..." + echo " -a # Just run autoreconf"; + echo " -p # Print ENV"; + echo " -c # Just run configure"; + echo " -m # Just run maintainer-clean"; + echo " -t # Make target"; + echo " -d # Enable debug"; + echo " -h # Show help"; + echo " -v # Be more verbose in output"; exit ;; v) # verbose @@ -1169,6 +1262,7 @@ function autoreconf_setup () if [[ -z "$BOOTSTRAP_LIBTOOLIZE" ]]; then echo "Couldn't find user supplied libtoolize, it is required" + return 1 fi else # If we are using OSX, we first check to see glibtoolize is available @@ -1177,21 +1271,27 @@ function autoreconf_setup () if [[ -z "$BOOTSTRAP_LIBTOOLIZE" ]]; then echo "Couldn't find glibtoolize, it is required on OSX" + return 1 fi else BOOTSTRAP_LIBTOOLIZE=`type -p libtoolize` if [[ -z "$BOOTSTRAP_LIBTOOLIZE" ]]; then echo "Couldn't find libtoolize, it is required" + return 1 fi fi fi + if $VERBOSE; then LIBTOOLIZE_OPTIONS="--verbose $BOOTSTRAP_LIBTOOLIZE_OPTIONS" fi + if $DEBUG; then LIBTOOLIZE_OPTIONS="--debug $BOOTSTRAP_LIBTOOLIZE_OPTIONS" fi + + # Here we set LIBTOOLIZE to true since we are going to invoke it via BOOTSTRAP_LIBTOOLIZE LIBTOOLIZE=true fi @@ -1229,7 +1329,7 @@ function autoreconf_setup () fi if [[ -n "$GNU_BUILD_FLAGS" ]]; then - AUTORECONF="$AUTORECONF $GNU_BUILD_FLAGS" + AUTORECONF_ARGS="$GNU_BUILD_FLAGS" fi fi @@ -1247,6 +1347,9 @@ function print_setup () echo 'BOOTSTRAP ENV' echo "AUTORECONF=$AUTORECONF" echo "HOST_OS=$HOST_OS" + echo "VENDOR=$VENDOR" + echo "VENDOR_DISTRIBUTION=$VENDOR_DISTRIBUTION" + echo "VENDOR_RELEASE=$VENDOR_RELEASE" echo "getopt()" if $AUTORECONF_OPTION; then @@ -1384,18 +1487,21 @@ function check_make_target() ;; 'clang-analyzer') ;; - 'test-*') + test-*) ;; - 'valgrind-*') + valgrind-*) ;; - 'gdb-*') + gdb-*) ;; 'dist') ;; *) - die "Unknown MAKE_TARGET option: $1" + echo "Matched default" + return 1 ;; esac + + return 0 } function bootstrap () @@ -1406,7 +1512,9 @@ function bootstrap () # Set up whatever we need to do to use autoreconf later require_libtoolise - autoreconf_setup + if ! autoreconf_setup; then + return 1 + fi if [ -z "$MAKE_TARGET" ]; then MAKE_TARGET="make_default" @@ -1441,8 +1549,15 @@ function bootstrap () # If we are running inside of Jenkins, we want to only run some of the possible tests if $jenkins_build_environment; then check_make_target $target + ret=$? + if [ $ret -ne 0 ]; then + die "Unknown MAKE_TARGET option: $target" + fi fi + local snapshot_run=false + local valgrind_run=false + case $target in 'self') self_test @@ -1500,11 +1615,17 @@ function bootstrap () ;; 'snapshot') make_for_snapshot + snapshot_run=true + check_snapshot ;; 'rpm') make_rpm ;; + 'darwin_malloc') + make_darwin_malloc + ;; 'valgrind') + make_maintainer_clean make_valgrind ;; 'universe') @@ -1518,6 +1639,13 @@ function bootstrap () make_target "$target" ;; esac + + if $jenkins_build_environment; then + if ! $snapshot_run; then + run_make_maintainer_clean_if_possible + fi + fi + done } @@ -1586,7 +1714,16 @@ function main () # We don't want Jenkins overriding other variables, so we NULL them. if [ -z "$MAKE_TARGET" ]; then if $jenkins_build_environment; then - MAKE_TARGET='jenkins' + if [[ -n "$LABEL" ]]; then + check_make_target $LABEL + if [ $? -eq 0 ]; then + MAKE_TARGET="$LABEL" + fi + fi + + if [ -z "$MAKE_TARGET" ]; then + MAKE_TARGET='jenkins' + fi fi fi