123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926 |
- #!/usr/bin/env bash
- #
- # Copyright (C) 2012-2013 Brian Aker
- # All rights reserved.
- #
- # Redistribution and use in source and binary forms, with or without
- # modification, are permitted provided that the following conditions are
- # met:
- #
- # * Redistributions of source code must retain the above copyright
- # notice, this list of conditions and the following disclaimer.
- #
- # * Redistributions in binary form must reproduce the above
- # copyright notice, this list of conditions and the following disclaimer
- # in the documentation and/or other materials provided with the
- # distribution.
- #
- # * The names of its contributors may not be used to endorse or
- # promote products derived from this software without specific prior
- # written permission.
- #
- # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- # Environment Variables that will influence the build:
- # AUTOMAKE
- # AUTORECONF
- # LIBTOOLIZE
- # MAKE
- # PREFIX
- # LOG_COMPILER
- # VERBOSE
- # WARNINGS
- #
- use_banner ()
- {
- echo "#####################################################################################"
- echo "#"
- echo "#"
- echo "#"
- echo "# TARGET:$1"
- echo "#"
- echo "#"
- echo "#"
- echo "#####################################################################################"
- }
- command_not_found_handle ()
- {
- warn "$*" ": command not found"
- #if $DEBUG; then
- echo ""
- echo "Stack trace:"
- local frame=0
- while caller $frame; do
- ((frame++));
- done
- echo ""
- #fi
- return 127
- }
- error ()
- {
- echo "${BASH_SOURCE[0]}:${BASH_LINENO[0]}: " "$*" >&2
- }
- die ()
- {
- echo "${BASH_SOURCE[0]}:${BASH_LINENO[0]}: " "$*" >&2
- exit 1;
- }
- warn ()
- {
- echo "${BASH_SOURCE[0]}:${BASH_LINENO[0]}: " "$*"
- #echo "$BASH_SOURCE:${BASH_LINENO[0]}: $@" >&1
- }
- nassert ()
- {
- local param_name=\$"$1"
- local param_value
- param_value="$(eval "expr \"$param_name\" ")"
- if [ -n "$param_value" ]; then
- echo "${BASH_SOURCE[0]}:${BASH_LINENO[0]}: assert($param_name) had value of $param_value" >&2
- exit 1
- fi
- }
- assert ()
- {
- local param_name=\$"$1"
- local param_value
- param_value="$(eval "expr \"$param_name\" ")"
- if [ -z "$param_value" ]; then
- echo "${BASH_SOURCE[0]}:${BASH_LINENO[0]}: assert($param_name)" >&2
- exit 1
- fi
- }
- assert_file ()
- {
- if [ ! -f "$1" ]; then
- echo "${BASH_SOURCE[0]}:${BASH_LINENO[0]}: assert($1) does not exist: $2" >&2
- exit 1;
- fi
- }
- assert_no_file ()
- {
- if [ -f "$1" ]; then
- echo "${BASH_SOURCE[0]}:${BASH_LINENO[0]}: assert($1) file exists: $2" >&2
- exit 1;
- fi
- }
- assert_no_directory ()
- {
- if [ -d "$1" ]; then
- echo "${BASH_SOURCE[0]}:${BASH_LINENO[0]}: assert($1) directory exists: $2" >&2
- exit 1;
- fi
- }
- assert_exec_file ()
- {
- if [ ! -f "$1" ]; then
- echo "${BASH_SOURCE[0]}:${BASH_LINENO[0]}: assert($1) does not exist: $2" >&2
- exit 1;
- fi
- if [ ! -x "$1" ]; then
- echo "${BASH_SOURCE[0]}:${BASH_LINENO[0]}: assert($1) exists but is not executable: $2" >&2
- exit 1;
- fi
- }
- command_exists ()
- {
- type "$1" &> /dev/null ;
- }
- rebuild_host_os ()
- {
- HOST_OS="${UNAME_MACHINE_ARCH}-${VENDOR}-${VENDOR_DISTRIBUTION}-${VENDOR_RELEASE}-${UNAME_KERNEL}-${UNAME_KERNEL_RELEASE}"
- if [ -z "$1" ]; then
- if $verbose; then
- echo "HOST_OS=$HOST_OS"
- fi
- fi
- }
- # Validate the distribution name, or toss an erro
- # values: darwin,fedora,rhel,ubuntu,debian,opensuse
- set_VENDOR_DISTRIBUTION ()
- {
- local dist
- dist="$(echo "$1" | tr '[:upper:]' '[:lower:]')"
- case "$dist" in
- darwin)
- VENDOR_DISTRIBUTION='darwin'
- ;;
- fedora)
- VENDOR_DISTRIBUTION='fedora'
- ;;
- rhel)
- VENDOR_DISTRIBUTION='rhel'
- ;;
- debian)
- VENDOR_DISTRIBUTION='debian'
- ;;
- ubuntu)
- VENDOR_DISTRIBUTION='ubuntu'
- ;;
- suse)
- VENDOR_DISTRIBUTION='opensuse'
- ;;
- opensuse*)
- VENDOR_DISTRIBUTION='opensuse'
- ;;
- alpine)
- VENDOR_DISTRIBUTION='alpine'
- ;;
- nixos)
- VENDOR_DISTRIBUTION='nixos'
- ;;
- rocky)
- VENDOR_DISTRIBUTION='rocky'
- ;;
- *)
- die "attempt to set an invalid VENDOR_DISTRIBUTION=$dist"
- ;;
- esac
- }
- # Validate a Vendor's release name/number
- set_VENDOR_RELEASE ()
- {
- local release
- release="$(echo "$1" | tr '[:upper:]' '[:lower:]')"
- if $verbose; then
- echo "VENDOR_DISTRIBUTION:$VENDOR_DISTRIBUTION"
- echo "VENDOR_RELEASE:$release"
- fi
- case $VENDOR_DISTRIBUTION in
- darwin)
- 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'
- ;;
- 10.9)
- echo "mavericks"
- VENDOR_RELEASE='mavericks'
- ;;
- 10.9.*)
- echo "mavericks"
- VENDOR_RELEASE='mavericks'
- ;;
- *)
- echo "$release"
- VENDOR_RELEASE='unknown'
- ;;
- esac
- ;;
- fedora)
- VENDOR_RELEASE="$release"
- ;;
- rhel)
- VENDOR_RELEASE="$release"
- ;;
- debian)
- VENDOR_RELEASE="$release"
- ;;
- ubuntu)
- VENDOR_RELEASE="$release"
- if [[ "z$VENDOR_RELEASE" == 'z12.04' ]]; then
- VENDOR_RELEASE="precise"
- elif [[ "z$VENDOR_RELEASE" == 'z12.10' ]]; then
- VENDOR_RELEASE="quantal"
- elif [[ "z$VENDOR_RELEASE" == 'z13.04' ]]; then
- VENDOR_RELEASE="raring"
- fi
- ;;
- opensuse)
- VENDOR_RELEASE="$release"
- ;;
- alpine)
- VENDOR_RELEASE="$release"
- ;;
- nixos)
- VENDOR_RELEASE="$release"
- ;;
- rocky)
- VENDOR_RELEASE="$release"
- ;;
- unknown)
- die "attempt to set VENDOR_RELEASE without setting VENDOR_DISTRIBUTION"
- ;;
- *)
- die "attempt to set with an invalid VENDOR_DISTRIBUTION=$VENDOR_DISTRIBUTION"
- ;;
- esac
- }
- # Valid values are: alpine, apple, redhat, centos, canonical, oracle, suse
- set_VENDOR ()
- {
- local vendor
- vendor="$(echo "$1" | tr '[:upper:]' '[:lower:]')"
- case $vendor in
- alpine)
- VENDOR='alpine'
- ;;
- apple)
- VENDOR='apple'
- ;;
- 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'
- ;;
- nixos)
- VENDOR='nixos'
- ;;
- opensuse*)
- VENDOR='suse'
- ;;
- suse)
- VENDOR='suse'
- ;;
- rocky*)
- VENDOR='rocky'
- ;;
- *)
- die "An attempt was made to set an invalid VENDOR=$vendor"
- ;;
- esac
- set_VENDOR_DISTRIBUTION "$2"
- set_VENDOR_RELEASE "$3"
- }
- determine_target_platform ()
- {
- UNAME_MACHINE_ARCH="$(uname -m 2>/dev/null)" || UNAME_MACHINE_ARCH=unknown
- UNAME_KERNEL="$(uname -s 2>/dev/null)" || UNAME_KERNEL=unknown
- UNAME_KERNEL_RELEASE="$(uname -r 2>/dev/null)" || UNAME_KERNEL_RELEASE=unknown
- if [[ -x '/usr/bin/sw_vers' ]]; then
- local _VERSION
- _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
- fedora_version="$(awk ' { print $3 } ' < /etc/fedora-release)"
- set_VENDOR 'redhat' 'fedora' "$fedora_version"
- elif [[ -f '/etc/sl-release' ]]; then
- local sl_version
- sl_version="$(awk ' { print $4 } ' < /etc/sl-release)"
- set_VENDOR 'centos' 'rhel' "$sl_version"
- elif [[ -f '/etc/centos-release' ]]; then
- local centos_version
- centos_version="$(awk ' { print $7 } ' < /etc/centos-release)"
- set_VENDOR 'centos' 'rhel' "$centos_version"
- elif [[ -f '/etc/SuSE-release' ]]; then
- local suse_distribution
- suse_distribution="$(head -1 /etc/SuSE-release | awk ' { print $1 } ')"
- local suse_version
- suse_version="$(head -1 /etc/SuSE-release | awk ' { print $2 } ')"
- set_VENDOR 'suse' "$suse_distribution" "$suse_version"
- elif [[ -f '/etc/redhat-release' ]]; then
- local rhel_version
- rhel_version="$(awk ' { print $7 } ' < /etc/redhat-release)"
- local _vendor
- _vendor="$(rpm -qf /etc/redhat-release)"
- set_VENDOR "$_vendor" 'rhel' "$rhel_version"
- elif [[ -f '/etc/os-release' ]]; then
- # shellcheck disable=SC1091
- source '/etc/os-release'
- set_VENDOR "$ID" "$ID" "$VERSION_ID"
- elif [[ -x '/usr/bin/lsb_release' ]]; then
- local _ID
- _ID="$(/usr/bin/lsb_release -s -i)"
- local _VERSION
- _VERSION="$(/usr/bin/lsb_release -s -r)"
- set_VENDOR "$_ID" "$_ID" "$_VERSION_ID"
- elif [[ -f '/etc/lsb-release' ]]; then
- # shellcheck disable=SC1091
- source '/etc/lsb-release'
- set_VENDOR 'canonical' "$DISTRIB_ID" "$DISTRIB_CODENAME"
- elif [[ -f '/etc/alpine-release' ]]; then
- local alpine_version
- alpine_version="$(cat /etc/alpine-release)"
- set_VENDOR 'alpine' 'alpine' "$alpine_version"
- fi
- rebuild_host_os
- }
- run_configure ()
- {
- # We will run autoreconf if we are required
- run_autoreconf_if_required
- # We always begin at the root of our build
- if [ ! $? ]; then
- die "Programmer error, we entered run_configure with a stacked directory"
- fi
- if ! command_exists "$CONFIGURE"; then
- die "$CONFIGURE does not exist"
- fi
- # Arguments for configure
- local BUILD_CONFIGURE_ARG=''
- # If 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 we are doing a valgrind run, we always compile with assert disabled
- if $valgrind_run; then
- BUILD_CONFIGURE_ARG="--enable-assert=no $BUILD_CONFIGURE_ARG"
- else
- if $debug; then
- BUILD_CONFIGURE_ARG="--enable-debug --enable-assert $BUILD_CONFIGURE_ARG"
- elif [[ -n "$VCS_CHECKOUT" ]]; then
- BUILD_CONFIGURE_ARG="--enable-assert $BUILD_CONFIGURE_ARG"
- fi
- fi
- if [[ -n "$CONFIGURE_ARG" ]]; then
- BUILD_CONFIGURE_ARG="$CONFIGURE_ARG $BUILD_CONFIGURE_ARG"
- fi
- if [[ -n "$PREFIX_ARG" ]]; then
- BUILD_CONFIGURE_ARG="$PREFIX_ARG $BUILD_CONFIGURE_ARG"
- fi
- ret=1;
- # If we are executing on OSX use CLANG, otherwise only use it if we find it in the ENV
- case $HOST_OS in
- rhel-5*)
- command_exists 'gcc44' || die "Could not locate gcc44"
- run CC=gcc44 CXX=gcc44 "$top_srcdir/configure" "$BUILD_CONFIGURE_ARG" || die "Cannot execute CC=gcc44 CXX=gcc44 configure $BUILD_CONFIGURE_ARG"
- ret=$?
- ;;
- *)
- run "$CONFIGURE" "$BUILD_CONFIGURE_ARG"
- ret=$?
- ;;
- esac
- if [ $ret -ne 0 ]; then
- die "Could not execute $CONFIGURE $BUILD_CONFIGURE_ARG"
- fi
- if [ ! -f 'Makefile' ]; then
- die "Programmer error, configure was run but no Makefile existed after $CONFIGURE was run"
- fi
- }
- setup_gdb_command ()
- {
- GDB_TMPFILE=$(mktemp /tmp/gdb.XXXXXXXXXX)
- echo 'set logging overwrite on' > "$GDB_TMPFILE"
- {
- echo 'set logging on'
- echo 'set environment LIBTEST_IN_GDB=1'
- echo 'run'
- echo 'thread apply all bt'
- echo 'quit'
- } >> "$GDB_TMPFILE"
- GDB_COMMAND="gdb -f -batch -x $GDB_TMPFILE"
- }
- setup_valgrind_command ()
- {
- VALGRIND_PROGRAM="$(type -p valgrind)"
- if [[ -n "$VALGRIND_PROGRAM" ]]; then
- VALGRIND_COMMAND="$VALGRIND_PROGRAM --error-exitcode=1 --leak-check=yes --malloc-fill=A5 --free-fill=DE --xml=yes --xml-file=\"valgrind-%p.xml\""
- fi
- }
- save_BUILD ()
- {
- if [[ -n "$OLD_CONFIGURE" ]]; then
- die "OLD_CONFIGURE($OLD_CONFIGURE) was set on push, programmer error!"
- fi
- if [[ -n "$OLD_CONFIGURE_ARG" ]]; then
- die "OLD_CONFIGURE_ARG($OLD_CONFIGURE_ARG) was set on push, programmer error!"
- fi
- if [[ -n "$OLD_PREFIX" ]]; then
- die "OLD_PREFIX($OLD_PREFIX) was set on push, programmer error!"
- fi
- if [[ -n "$OLD_MAKE" ]]; then
- die "OLD_MAKE($OLD_MAKE) was set on push, programmer error!"
- fi
- if [[ -n "$OLD_LOG_COMPILER" ]]; then
- die "OLD_LOG_COMPILER($OLD_LOG_COMPILER) was set on push, programmer error!"
- fi
- if [[ -n "$CONFIGURE" ]]; then
- OLD_CONFIGURE=$CONFIGURE
- fi
- if [[ -n "$CONFIGURE_ARG" ]]; then
- OLD_CONFIGURE_ARG=$CONFIGURE_ARG
- fi
- if [[ -n "$MAKE" ]]; then
- OLD_MAKE=$MAKE
- fi
- if [[ -n "$LOG_COMPILER" ]]; then
- OLD_LOG_COMPILER=$LOG_COMPILER
- fi
- }
- restore_BUILD ()
- {
- if [[ -n "$OLD_CONFIGURE" ]]; then
- CONFIGURE=$OLD_CONFIGURE
- fi
- if [[ -n "$OLD_CONFIGURE_ARG" ]]; then
- CONFIGURE_ARG=$OLD_CONFIGURE_ARG
- fi
- if [[ -n "$OLD_PREFIX" ]]; then
- PREFIX_ARG=$OLD_PREFIX
- fi
- if [[ -n "$OLD_MAKE" ]]; then
- MAKE=$OLD_MAKE
- fi
- if [[ -n "$OLD_LOG_COMPILER" ]]; then
- LOG_COMPILER=$OLD_LOG_COMPILER
- fi
- OLD_CONFIGURE=
- OLD_CONFIGURE_ARG=
- OLD_PREFIX=
- OLD_MAKE=
- OLD_LOG_COMPILER=
- export -n CC CXX
- }
- make_valgrind ()
- {
- # If the env VALGRIND_COMMAND is set then we assume it is valid
- local valgrind_was_set=false
- if [[ -z "$VALGRIND_COMMAND" ]]; then
- setup_valgrind_command
- if [[ -n "$VALGRIND_COMMAND" ]]; then
- valgrind_was_set=true
- fi
- else
- valgrind_was_set=true
- fi
- # If valgrind_was_set is set to no we bail
- if ! $valgrind_was_set; then
- echo 'valgrind was not present'
- return 1
- fi
- save_BUILD
- valgrind_run=true
- # If we are required to run configure, do so now
- run_configure
- # If we don't have a configure, then most likely we will be missing libtool
- assert_file 'configure'
- if [[ -x 'libtool' ]]; then
- LOG_COMPILER="./libtool --mode=execute $VALGRIND_COMMAND"
- else
- LOG_COMPILER="$VALGRIND_COMMAND"
- fi
- make_target 'all'
- make_target 'check'
- ret=$?
- valgrind_run=false
- restore_BUILD
- if [ "$ret" -ne 0 ]; then
- return 1
- fi
- }
- make_install_system ()
- {
- local INSTALL_LOCATION
- INSTALL_LOCATION="$(mktemp -d /tmp/XXXXXXXXXX)"
- save_BUILD
- PREFIX_ARG="--prefix=$INSTALL_LOCATION"
- if [ ! -d "$INSTALL_LOCATION" ] ; then
- die "ASSERT temp directory not found '$INSTALL_LOCATION'"
- fi
- run_configure #install_buid_dir
- make_target 'install'
- make_target 'installcheck'
- make_target 'uninstall'
- rm -r -f "$INSTALL_LOCATION"
- make 'distclean'
- if [ -f 'Makefile' ]; then
- die "ASSERT Makefile should not exist"
- fi
- restore_BUILD
- }
- make_darwin_malloc ()
- {
- run_configure_if_required
- old_MallocGuardEdges=$MallocGuardEdges
- MallocGuardEdges=1
- old_MallocErrorAbort=$MallocErrorAbort
- MallocErrorAbort=1
- old_MallocScribble=$MallocScribble
- MallocScribble=1
- make_check
- MallocGuardEdges=$old_MallocGuardEdges
- MallocErrorAbort=$old_MallocErrorAbort
- MallocScribble=$old_MallocScribble
- }
- # This will reset our environment, and make sure built files are available.
- make_for_snapshot ()
- {
- # 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 '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'
- }
- check_mingw ()
- {
- command_exists 'mingw64-configure'
- ret=$?
- if [ "$ret" -ne 0 ]; then
- return 1
- fi
- command_exists 'mingw64-make'
- ret=$?
- if [ "$ret" -ne 0 ]; then
- return 1
- fi
- return 0
- }
- check_clang ()
- {
- command_exists 'clang'
- ret=$?
- if [ "$ret" -ne 0 ]; then
- return 1
- fi
- return 0
- }
- check_clang_analyzer ()
- {
- command_exists 'scan-build'
- ret=$?
- if [ "$ret" -ne 0 ]; then
- return 1
- fi
- return 0
- }
- make_skeleton ()
- {
- run_configure
- ret=$?
- if [ $ret -eq 0 ]; then
- assert_file 'Makefile'
- make_target 'all' 'warn'
- ret=$?
- if [ $ret -ne 0 ]; then
- warn "$MAKE failed"
- else
- if [[ -n "$DISPLAY" ]]; then
- if command_exists 'wine'; then
- LOG_COMPILER='wine'
- fi
- fi
- if [[ -n "$LOG_COMPILER" ]]; then
- make_target 'check' 'warn' || warn "$MAKE check failed"
- ret=$?
- fi
- fi
- if $jenkins_build_environment; then
- make_target 'clean' 'warn'
- fi
- fi
- return $ret
- }
- make_for_mingw ()
- {
- if ! check_mingw; then
- return 1
- fi
- # Make sure it is clean
- if [ -f Makefile ] || [ -f configure ]; then
- make_maintainer_clean
- fi
- run_autoreconf
- save_BUILD
- CONFIGURE='mingw64-configure'
- MAKE='mingw64-make'
- CONFIGURE_ARGS='--enable-static --disable-shared'
- make_skeleton
- ret=$?
- restore_BUILD
- return $ret
- }
- make_for_clang ()
- {
- if ! check_clang; then
- return 1
- fi
- # Make sure it is clean
- if [ -f Makefile ] || [ -f configure ]; then
- make_maintainer_clean
- fi
- run_autoreconf
- save_BUILD
- CC=clang CXX=clang++
- export CC CXX
- make_skeleton
- ret=$?
- make_target 'check'
- restore_BUILD
- return $ret
- }
- make_for_clang_analyzer ()
- {
- if ! check_clang; then
- return 1
- fi
- if ! check_clang_analyzer; then
- die 'clang-analyzer was not found'
- fi
- # Make sure it is clean
- if [ -f Makefile ] || [ -f configure ]; then
- make_maintainer_clean
- fi
- run_autoreconf
- save_BUILD
- CC=clang CXX=clang++
- export CC CXX
- CONFIGURE='scan-build ./configure'
- CONFIGURE_ARGS='--enable-debug'
- export CONFIGURE_ARGS
- run_configure
- scan-build -o clang-html make -j4 -k
- restore_BUILD
- }
- # If we are locally testing, we should make sure the environment is setup correctly
- check_for_jenkins ()
- {
- if ! $jenkins_build_environment; then
- echo "Not inside of jenkins, simulating environment"
- if [ -f 'configure' ]; then
- make_maintainer_clean
- fi
- if $BOOTSTRAP_SNAPSHOT; then
- make_for_snapshot
- fi
- fi
- }
- make_universe ()
- {
- use_banner 'make maintainer-clean'
- make_maintainer_clean
- use_banner 'snapshot'
- make_for_snapshot
- use_banner 'valgrind'
- make_valgrind
- use_banner 'gdb'
- make_gdb
- use_banner 'rpm'
- make_rpm
- use_banner 'clang'
- make_for_clang
- use_banner 'clang analyzer'
- make_for_clang_analyzer
- use_banner 'mingw'
- if ! check_mingw
- then
- make_for_mingw
- fi
- use_banner 'make distcheck'
- make_distcheck
- use_banner 'make install'
- make_install_system
- }
- check_snapshot ()
- {
- if [ -n "$BOOTSTRAP_SNAPSHOT_CHECK" ]; then
- assert_file "$BOOTSTRAP_SNAPSHOT_CHECK" 'snapshot check failed'
- fi
- }
- make_for_continuus_integration ()
- {
- # Setup the environment if we are local
- check_for_jenkins
- # No matter then evironment, we should not have a Makefile at this point
- assert_no_file 'Makefile'
- # 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
- 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'
- run_autoreconf
- fi
- assert_no_file 'Makefile' 'Programmer error, Makefile existed where build state should have been clean'
- case $HOST_OS in
- *)
- make_jenkins_default
- ;;
- esac
- make_maintainer_clean
- }
- # The point to this test is to test bootstrap.sh itself
- self_test ()
- {
- # We start off with a clean env
- make_maintainer_clean
- # eval "./bootstrap.sh jenkins" || die "failed 'jenkins'"
- # eval "./bootstrap.sh all" || die "failed 'all'"
- # eval "./bootstrap.sh gdb" || die "failed 'gdb'"
- # eval "./bootstrap.sh maintainer-clean" || die "failed 'maintainer-clean'"
- }
- make_install_html ()
- {
- run_configure_if_required
- assert_file 'configure'
- make_target 'install-html'
- }
- make_gdb ()
- {
- save_BUILD
- if command_exists 'gdb'; then
- run_configure_if_required
- # Set ENV GDB_COMMAND
- if [[ -z "$GDB_COMMAND" ]]; then
- setup_gdb_command
- fi
- # If we don't have a configure, then most likely we will be missing libtool
- assert_file 'configure'
- if [[ -f 'libtool' ]]; then
- LOG_COMPILER="./libtool --mode=execute $GDB_COMMAND"
- else
- LOG_COMPILER="$GDB_COMMAND"
- fi
- make_target 'check'
- if [ -f 'gdb.txt' ]; then
- rm 'gdb.txt'
- fi
- if [ -f '.gdb_history' ]; then
- rm '.gdb_history'
- fi
- if $jenkins_build_environment; then
- make_target 'clean'
- fi
- else
- echo 'gdb was not present'
- return 1
- fi
- restore_BUILD
- }
- # $1 target to compile
- # $2 to die, or not to die, based on contents
- make_target ()
- {
- if [ -z "$1" ]; then
- die "Programmer error, no target provided for make"
- fi
- if [ ! -f 'Makefile' ]; then
- die "Programmer error, make was called before configure"
- run_configure
- fi
- if [ -n "$LOG_COMPILER" ]; then
- if $verbose; then
- echo "LOG_COMPILER=$LOG_COMPILER"
- fi
- fi
- if [ -z "$MAKE" ]; then
- die "MAKE was not set"
- fi
- # $2 represents error or warn
- run "$MAKE" "$1"
- ret=$?
- if [ $ret -ne 0 ]; then
- if [ -n "$2" ]; then
- warn "Failed to execute $MAKE $1: $ret"
- elif [ $ret -eq 2 ]; then
- die "Failed to execute $MAKE $1"
- else
- die "Failed to execute $MAKE $1: $ret"
- fi
- fi
- return $ret
- }
- make_distcheck ()
- {
- make_target 'distcheck'
- }
- make_rpm ()
- {
- if command_exists 'rpmbuild'; then
- if [ -f 'rpm.am' ] || [ -d 'rpm' ]; then
- run_configure_if_required
- make_target 'dist-rpm'
- return $?
- fi
- fi
- return 1
- }
- make_maintainer_clean ()
- {
- run_configure_if_required
- make_target 'maintainer-clean' 'no_error'
- # Lets make sure we really cleaned up the environment
- assert_no_file 'Makefile'
- assert_no_file 'configure'
- assert_no_directory 'autom4te.cache'
- }
- make_distclean ()
- {
- run_configure_if_required
- make_target 'distclean' 'no_error'
- # Lets make sure we really cleaned up the environment
- assert_no_file 'Makefile'
- assert_file 'configure'
- }
- make_check ()
- {
- make_target 'check'
- }
- make_jenkins_default ()
- {
- run_configure
- make_target 'all'
- }
- make_default ()
- {
- run_configure_if_required
- make_target 'all'
- }
- run_configure_if_required ()
- {
- run_autoreconf_if_required
- if [ ! -f 'Makefile' ]; then
- run_configure
- fi
- assert_file 'Makefile' 'configure did not produce a Makefile'
- }
- run_make_maintainer_clean_if_possible ()
- {
- if [ -f 'Makefile' ]; then
- make_maintainer_clean
- fi
- }
- run_autoreconf_if_required ()
- {
- if [ ! -x 'configure' ]; then
- run_autoreconf
- fi
- assert_exec_file 'configure'
- bash -n configure
- }
- run_autoreconf ()
- {
- if [[ -z "$AUTORECONF" ]]; then
- die "Programmer error, tried to call run_autoreconf () but AUTORECONF was not set"
- fi
- if $use_libtool; then
- assert "$BOOTSTRAP_LIBTOOLIZE"
- if $jenkins_build_environment; then
- run "$BOOTSTRAP_LIBTOOLIZE" '--copy' '--install' || die "Cannot execute $BOOTSTRAP_LIBTOOLIZE"
- else
- run "$BOOTSTRAP_LIBTOOLIZE" '--copy' '--install' '--force' || die "Cannot execute $BOOTSTRAP_LIBTOOLIZE"
- fi
- fi
- run "$AUTORECONF" "$AUTORECONF_ARGS" || die "Cannot execute $AUTORECONF"
- eval 'bash -n configure' || die "autoreconf generated a malformed configure"
- }
- run ()
- {
- if $verbose; then
- echo "\`$*'" "$ARGS"
- fi
- if [ -z "$1" ]; then
- return 127;
- fi
- eval "$@" "$ARGS"
- }
- parse_command_line_options ()
- {
- local SHORTOPTS=':apcmt:dvho:'
- nassert OPT_TARGET
- while getopts "$SHORTOPTS" opt; do
- case $opt in
- a) #--autoreconf
- AUTORECONF_OPTION=true
- OPT_TARGET+='autoreconf'
- ;;
- p) #--print-env
- print_setup_opt=true
- ;;
- c) # --configure
- CONFIGURE_OPTION=true
- OPT_TARGET+='configure'
- ;;
- m) # maintainer-clean
- CLEAN_OPTION=true
- ;;
- o) # target
- CONFIGURE_ARG="$OPTARG"
- ;;
- t) # target
- TARGET_OPTION=true
- TARGET_OPTION_ARG="$OPTARG"
- OPT_TARGET+="$OPTARG"
- ;;
- d) # debug
- opt_debug=true
- enable_debug
- ;;
- 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 " -o # Specify configure arguments";
- echo " -t # Make target";
- echo " -d # Enable debug";
- echo " -h # Show help";
- echo " -v # Be more verbose in output";
- exit
- ;;
- v) # verbose
- opt_verbose=true
- verbose=true
- ;;
- :)
- echo "Option -$OPTARG requires an argument." >&2
- exit 1
- ;;
- *)
- echo "$0: error - unrecognized option $1" 1>&2
- exit 1
- ;;
- esac
- done
- shift $((OPTIND-1))
- if [ -n "$1" ]; then
- OPT_TARGET="$*"
- fi
- }
- determine_vcs ()
- {
- if [[ -d '.git' ]]; then
- VCS_CHECKOUT=git
- elif [[ -d '.bzr' ]]; then
- VCS_CHECKOUT=bzr
- elif [[ -d '.svn' ]]; then
- VCS_CHECKOUT=svn
- elif [[ -d '.hg' ]]; then
- VCS_CHECKOUT=hg
- else
- VCS_CHECKOUT=
- fi
- if [[ -n "$VCS_CHECKOUT" ]]; then
- verbose=true
- fi
- }
- require_libtoolise ()
- {
- grep '^[ ]*A[CM]_PROG_LIBTOOL' configure.ac >/dev/null \
- && use_libtool=true
- grep '^[ ]*LT_INIT' configure.ac >/dev/null \
- && use_libtool=true
- }
- autoreconf_setup ()
- {
- # Set ENV MAKE in order to override "make"
- if [[ -z "$MAKE" ]]; then
- if command_exists 'gmake'; then
- MAKE="$(type -p gmake)"
- else
- if command_exists 'make'; then
- MAKE="$(type -p make)"
- fi
- fi
-
- if [ "$VCS_CHECKOUT" ]; then
- if $debug; then
- MAKE="$MAKE --warn-undefined-variables"
- fi
- fi
- if $debug; then
- MAKE="$MAKE -d"
- fi
- fi
- if [[ -z "$GNU_BUILD_FLAGS" ]]; then
- if $jenkins_build_environment; then
- GNU_BUILD_FLAGS="--install"
- else
- GNU_BUILD_FLAGS="--install --force"
- fi
- fi
- if $verbose; then
- GNU_BUILD_FLAGS="$GNU_BUILD_FLAGS --verbose"
- fi
- if [ -z "$ACLOCAL_PATH" ]; then
- ACLOCAL_PATH="/usr/local/share/aclocal $ACLOCAL_PATH"
- fi
- if [[ -z "$WARNINGS" ]]; then
- if [[ -n "$VCS_CHECKOUT" ]]; then
- WARNINGS="all,error"
- else
- WARNINGS="all"
- fi
- fi
- if $use_libtool; then
- if [[ -n "$LIBTOOLIZE" ]]; then
- BOOTSTRAP_LIBTOOLIZE=$(type -p "$LIBTOOLIZE")
- 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
- if [[ "$VENDOR_DISTRIBUTION" == "darwin" ]]; then
- BOOTSTRAP_LIBTOOLIZE="$(type -p glibtoolize)"
- 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
- # Test the ENV AUTOMAKE if it exists
- if [[ -n "$AUTOMAKE" ]]; then
- run "$AUTOMAKE" '--help' &> /dev/null || die "Failed to run AUTOMAKE:$AUTOMAKE"
- fi
- # Test the ENV AUTOCONF if it exists
- if [[ -n "$AUTOCONF" ]]; then
- run "$AUTOCONF" '--help' &> /dev/null || die "Failed to run AUTOCONF:$AUTOCONF"
- fi
- # Test the ENV AUTOHEADER if it exists
- if [[ -n "$AUTOHEADER" ]]; then
- run "$AUTOHEADER" '--help' &> /dev/null || die "Failed to run AUTOHEADER:$AUTOHEADER"
- fi
- # Test the ENV AUTOM4TE if it exists
- if [[ -n "$AUTOM4TE" ]]; then
- run "$AUTOM4TE" '--help' &> /dev/null || die "Failed to run AUTOM4TE:$AUTOM4TE"
- fi
- # Test the ENV AUTOHEADER if it exists, if not we add one and add --install
- if [[ -z "$ACLOCAL" ]]; then
- ACLOCAL="aclocal --install"
- fi
- run "$ACLOCAL" '--help' &> /dev/null || die "Failed to run ACLOCAL:$ACLOCAL"
- if [[ -z "$AUTORECONF" ]]; then
- AUTORECONF="$(type -p autoreconf)"
- if [[ -z "$AUTORECONF" ]]; then
- die "Couldn't find autoreconf"
- fi
- if [[ -n "$GNU_BUILD_FLAGS" ]]; then
- AUTORECONF_ARGS="$GNU_BUILD_FLAGS"
- fi
- fi
- run "$AUTORECONF" '--help' &> /dev/null || die "Failed to run AUTORECONF:$AUTORECONF"
- }
- print_setup ()
- {
- local saved_debug_status=$debug
- if $debug; then
- disable_debug
- fi
- echo '----------------------------------------------'
- 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
- echo "--autoreconf"
- fi
- if $CLEAN_OPTION; then
- echo "--clean"
- fi
- if $CONFIGURE_OPTION; then
- echo "--configure"
- fi
- if $opt_debug; then
- echo "--debug"
- fi
- if $print_setup_opt; then
- echo "--print-env"
- fi
- if $TARGET_OPTION; then
- echo "--target=$TARGET_OPTION_ARG"
- fi
- if $opt_verbose; then
- echo "--verbose"
- fi
- if [[ -n "$MAKE" ]]; then
- echo "MAKE=$MAKE"
- fi
- if [[ -n "$BOOTSTRAP_TARGET" ]]; then
- echo "BOOTSTRAP_TARGET=$BOOTSTRAP_TARGET"
- fi
- if [[ -n "$PREFIX" ]]; then
- echo "PREFIX=$PREFIX"
- fi
- if [[ -n "$LOG_COMPILER" ]]; then
- echo "LOG_COMPILER=$LOG_COMPILER"
- fi
- if [[ -n "$VCS_CHECKOUT" ]]; then
- echo "VCS_CHECKOUT=$VCS_CHECKOUT"
- fi
- if $debug; then
- echo "debug=true"
- fi
- if [[ -n "$WARNINGS" ]]; then
- echo "WARNINGS=$WARNINGS"
- fi
- if $saved_debug_status; then
- echo "DEBUG=true"
- fi
- echo '----------------------------------------------'
- if $saved_debug_status; then
- enable_debug
- fi
- }
- make_clean_option ()
- {
- run_configure_if_required
- make_maintainer_clean
- if [[ "$VCS_CHECKOUT" == 'git' ]]; then
- run "$VCS_CHECKOUT" status --ignored
- elif [[ -n "$VCS_CHECKOUT" ]]; then
- run "$VCS_CHECKOUT" status
- fi
- }
- make_for_autoreconf ()
- {
- if [ -f 'Makefile' ]; then
- make_maintainer_clean
- fi
- run_autoreconf
- assert_no_file 'Makefile'
- }
- check_make_target()
- {
- local ret=0
- case $1 in
- 'self')
- ;;
- 'rpm')
- ;;
- 'gdb')
- ;;
- 'clean_op')
- ;;
- 'autoreconf')
- ;;
- 'install-system')
- ;;
- 'configure')
- ;;
- 'distcheck')
- ;;
- 'check')
- ;;
- 'snapshot')
- ;;
- 'mingw')
- ;;
- 'universe')
- ;;
- 'valgrind')
- ;;
- 'jenkins')
- ;;
- 'distclean')
- ;;
- 'maintainer-clean')
- ;;
- 'install')
- ;;
- 'all')
- ;;
- 'make_default')
- ;;
- 'clang')
- ;;
- 'clang-analyzer')
- ;;
- test-*)
- ;;
- valgrind-*)
- ;;
- gdb-*)
- ;;
- 'dist')
- ;;
- *)
- echo "Matched default"
- ret=1
- ;;
- esac
- return $ret
- }
- execute_job ()
- {
- # We should always have a target by this point
- assert BOOTSTRAP_TARGET
- determine_target_platform
- determine_vcs
- # Set up whatever we need to do to use autoreconf later
- use_libtool=false
- require_libtoolise
- if ! autoreconf_setup; then
- return 1
- fi
- if $print_setup_opt -o "$debug"; then
- echo
- print_setup
- echo
- # Exit if all we were looking for were the currently used options
- if $print_setup_opt; then
- exit
- fi
- fi
- # Use OLD_LOG_COMPILER for tracking the state of the variable
- local OLD_LOG_COMPILER=
- # Set ENV PREFIX in order to set --prefix for ./configure
- if [[ -n "$PREFIX" ]]; then
- PREFIX_ARG="--prefix=$PREFIX"
- fi
- if $CLEAN_OPTION; then
- make_maintainer_clean
- fi
- local BOOTSTRAP_TARGET_ARRAY
- BOOTSTRAP_TARGET_ARRAY=( "$BOOTSTRAP_TARGET" )
- for target in "${BOOTSTRAP_TARGET_ARRAY[@]}"
- do
- # 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
- warn "Unknown BOOTSTRAP_TARGET option: $target"
- target="jenkins"
- fi
- fi
- if $jenkins_build_environment; then
- use_banner $target
- fi
- local valgrind_run=false
- case $target in
- 'self')
- self_test
- ;;
- 'gdb')
- make_gdb
- ;;
- 'install-html')
- make_install_html
- ;;
- 'clean_op')
- make_clean_option
- ;;
- 'autoreconf')
- make_for_autoreconf
- ;;
- 'install-system')
- make_install_system
- ;;
- 'configure')
- run_configure
- ;;
- 'make_default')
- make_default
- ;;
- 'clang')
- make_distclean
- if ! check_clang; then
- die "clang was not found"
- fi
- if ! make_for_clang; then
- die "Failed to build clang: $?"
- fi
- ;;
- 'clang-analyzer')
- make_distclean
- if ! check_clang_analyzer; then
- die "clang-analyzer was not found"
- fi
- if ! check_clang; then
- die "clang was not found"
- fi
- if ! make_for_clang_analyzer; then
- die "Failed to build clang-analyzer: $?"
- fi
- ;;
- 'mingw')
- make_distclean
- if ! make_for_mingw; then
- die "Failed to build mingw: $?"
- fi
- ;;
- 'snapshot')
- make_for_snapshot
- check_snapshot
- ;;
- 'rpm')
- make_rpm
- ;;
- 'darwin_malloc')
- make_darwin_malloc
- ;;
- 'valgrind')
- make_valgrind
- ;;
- 'universe')
- make_universe
- ;;
- 'jenkins')
- make_for_continuus_integration
- ;;
- *)
- run_configure_if_required
- make_target "$target"
- ;;
- esac
- done
- }
- main ()
- {
- # Are we running inside of Jenkins?
- if [[ -n "$JENKINS_HOME" ]]; then
- declare -r jenkins_build_environment=true
- else
- declare -r jenkins_build_environment=false
- fi
- # Variables we export
- declare -x VCS_CHECKOUT=
- # Variables we control globally
- local -a BOOTSTRAP_TARGET=
- local CONFIGURE=
- local use_libtool=false
- local verbose=false
- #getop variables
- local opt_debug=false
- local opt_verbose=false
- if [[ -n "$VERBOSE" ]]; then
- verbose=true
- fi
- # Options for getopt
- local AUTORECONF_OPTION=false
- local CLEAN_OPTION=false
- local CONFIGURE_OPTION=false
- local print_setup_opt=false
- local TARGET_OPTION=false
- local TARGET_OPTION_ARG=
- local OLD_CONFIGURE=
- local OLD_CONFIGURE_ARG=
- local OLD_PREFIX=
- local OLD_MAKE=
- local OLD_LOG_COMPILER=
- local -r top_srcdir="$(pwd)"
- # Default configure
- if [ -z "$CONFIGURE" ]; then
- CONFIGURE="$top_srcdir/configure"
- fi
- # Variables for determine_target_platform () and rebuild_host_os ()
- # UNAME_MACHINE_ARCH= uname -m
- # VENDOR= apple, redhat, centos, canonical
- # VENDOR_RELEASE=
- # RHEL{rhel,Tikanga,Santiago}
- # Ubuntu{ubuntu,Lucid,Maverick,Natty,Oneiric,Precise,Quantal}
- # Fedora{fedora,Verne,Beefy}
- # OSX{osx,lion,snow,mountain}
- # VENDOR_DISTRIBUTION= darwin,fedora,rhel,ubuntu
- # UNAME_KERNEL= Linux, Darwin,...
- # UNAME_KERNEL_RELEASE= Linux, Darwin,...
- local UNAME_MACHINE_ARCH=unknown
- local VENDOR=unknown
- local VENDOR_RELEASE=unknown
- local VENDOR_DISTRIBUTION=unknown
- local UNAME_KERNEL=unknown
- local UNAME_KERNEL_RELEASE=unknown
- local HOST_OS=
- rebuild_host_os no_output
- local OPT_TARGET=
- parse_command_line_options "$@"
- nassert BOOTSTRAP_TARGET
- if [ -n "$OPT_TARGET" ]; then
- BOOTSTRAP_TARGET="$OPT_TARGET"
- fi
- if [ -z "$BOOTSTRAP_TARGET" ]; then
- BOOTSTRAP_TARGET="make_default"
- fi
- # We should always have a target by this point
- assert BOOTSTRAP_TARGET
- execute_job
- local ret=$?
- jobs -l
- wait
- exit $ret
- }
- set_branch ()
- {
- if [ -z "$BRANCH" ]; then
- if [ -z "$CI_PROJECT_TEAM" ]; then
- die "Variable CI_PROJECT_TEAM has not been set"
- fi
- if [ -z "$PROJECT" ]; then
- die "Variable PROJECT has not been set"
- fi
- if [ -z "$BUILD_TAG" ]; then
- die "Variable BUILD_TAG has not been set"
- fi
- BRANCH="lp:~$CI_PROJECT_TEAM/$PROJECT/$BUILD_TAG"
- export BRANCH
- fi
- if [ -z "$BRANCH" ]; then
- die "Missing values required to build BRANCH variable."
- fi
- }
- merge ()
- {
- if [ -z "$VCS_CHECKOUT" ]; then
- die "Merges require VCS_CHECKOUT."
- fi
- set_branch
- if [[ "$VCS_CHECKOUT" == 'bzr' ]]; then
- if test -n "$BRANCH_TO_MERGE"; then
- bzr merge "$BRANCH_TO_MERGE"
- bzr commit --message="Merge $BRANCH_TO_MERGE Build: $BUILD_TAG" --unchanged
- fi
- bzr push "$BRANCH"
- elif [[ -n "$VCS_CHECKOUT" ]]; then
- die "Merge attempt occurred, current VCS setup does not support this"
- fi
- }
- enable_debug ()
- {
- if ! $debug; then
- local caller_loc
- caller_loc="$(caller)"
- if [[ -n "$1" ]]; then
- echo "$caller_loc Enabling debug: $1"
- else
- echo "$caller_loc Enabling debug"
- fi
- set -x
- debug=true
- fi
- }
- usage ()
- {
- cat << EOF
- Usage: $program_name [OPTION]..
- Bootstrap this package from the checked-out sources, and optionally walk through CI run.
- Options:
- EOF
- }
- disable_debug ()
- {
- set +x
- debug=false
- }
- check_shell ()
- {
- if [ -x '/usr/local/bin/shellcheck' ]; then
- /usr/local/bin/shellcheck "$1"
- local ret=$?
- if [ "$ret" -ne 0 ]; then
- die "$1 failed shellcheck"
- fi
- fi
- }
- bootstrap ()
- {
- check_shell 'bootstrap.sh'
- local env_debug_enabled=false
- local debug=false
- export ACLOCAL
- export AUTOCONF
- export AUTOHEADER
- export AUTOM4TE
- export AUTOMAKE
- export AUTORECONF
- export CONFIGURE_ARG
- export DEBUG
- export GNU_BUILD_FLAGS
- export LIBTOOLIZE
- export LIBTOOLIZE_OPTIONS
- export MAKE
- export PREFIX_ARG
- export LOG_COMPILER
- export VERBOSE
- export WARNINGS
- case $OSTYPE in
- darwin*)
- export MallocGuardEdges
- export MallocErrorAbort
- export MallocScribble
- ;;
- esac
- # We check for DEBUG twice, once before we source the config file, and once afterward
- if [[ -n "$DEBUG" ]]; then
- env_debug_enabled=true
- fi
- # Variables which only can be set by .bootstrap
- BOOTSTRAP_SNAPSHOT=false
- BOOTSTRAP_SNAPSHOT_CHECK=
- if [ -f '.bootstrap' ]; then
- # shellcheck disable=SC1091
- source '.bootstrap'
- fi
- # We do this in order to protect the case where DEBUG that came from the ENV (i.e. it overrides what is found in .bootstrap
- if $env_debug_enabled; then
- enable_debug
- elif [[ -n "$DEBUG" ]]; then
- enable_debug "Enabling DEBUG from '.bootstrap'"
- fi
- if $env_debug_enabled; then
- print_setup
- fi
- main "$@"
- }
- # Script begins here
- declare -r program_name="$0"
- bootstrap "$@"
|