3 # Copyright (C) 2012-2013 Brian Aker
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions are
10 # * Redistributions of source code must retain the above copyright
11 # notice, this list of conditions and the following disclaimer.
13 # * Redistributions in binary form must reproduce the above
14 # copyright notice, this list of conditions and the following disclaimer
15 # in the documentation and/or other materials provided with the
18 # * The names of its contributors may not be used to endorse or
19 # promote products derived from this software without specific prior
22 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 # Environment Variables that will influence the build:
46 command_not_found_handle
()
48 warn
"$@: command not found"
54 while caller
$frame; do
65 echo "$BASH_SOURCE:$BASH_LINENO: $@" >&2
70 echo "$BASH_SOURCE:$BASH_LINENO: $@" >&2
76 echo "$BASH_SOURCE:$BASH_LINENO: $@"
77 #echo "$BASH_SOURCE:$BASH_LINENO: $@" >&1
82 local param_name
=\$
"$1"
83 local param_value
=`eval "expr \"$param_name\" "`
85 if [ -n "$param_value" ]; then
86 echo "$bash_source:$bash_lineno: assert($param_name) had value of "$param_value"" >&2
93 local param_name
=\$
"$1"
94 local param_value
=`eval "expr \"$param_name\" "`
96 if [ -z "$param_value" ]; then
97 echo "$bash_source:$bash_lineno: assert($param_name)" >&2
102 function assert_file
()
104 if [ ! -f "$1" ]; then
105 echo "$BASH_SOURCE:$BASH_LINENO: assert($1) does not exist: $2" >&2
110 function assert_no_file
()
113 echo "$BASH_SOURCE:$BASH_LINENO: assert($1) file exists: $2" >&2
118 function assert_no_directory
()
121 echo "$BASH_SOURCE:$BASH_LINENO: assert($1) directory exists: $2" >&2
126 function assert_exec_file
()
128 if [ ! -f "$1" ]; then
129 echo "$BASH_SOURCE:$BASH_LINENO: assert($1) does not exist: $2" >&2
133 if [ ! -x "$1" ]; then
134 echo "$BASH_SOURCE:$BASH_LINENO: assert($1) exists but is not executable: $2" >&2
139 function command_exists
()
141 type "$1" &> /dev
/null
;
144 function rebuild_host_os
()
146 HOST_OS
="${UNAME_MACHINE_ARCH}-${VENDOR}-${VENDOR_DISTRIBUTION}-${VENDOR_RELEASE}-${UNAME_KERNEL}-${UNAME_KERNEL_RELEASE}"
149 echo "HOST_OS=$HOST_OS"
154 # Valid values are: darwin,fedora,rhel,ubuntu
155 function set_VENDOR_DISTRIBUTION
()
157 local dist
=`echo "$1" | tr '[A-Z]' '[a-z]'`
160 VENDOR_DISTRIBUTION
='darwin'
163 VENDOR_DISTRIBUTION
='fedora'
166 VENDOR_DISTRIBUTION
='rhel'
169 VENDOR_DISTRIBUTION
='ubuntu'
172 VENDOR_DISTRIBUTION
='opensuse'
175 die
"attempt to set an invalid VENDOR_DISTRIBUTION=$dist"
180 function set_VENDOR_RELEASE
()
182 local release
=`echo "$1" | tr '[A-Z]' '[a-z]'`
183 case "$VENDOR_DISTRIBUTION" in
185 VENDOR_RELEASE
='mountain'
188 VENDOR_RELEASE
="$release"
191 VENDOR_RELEASE
="$release"
194 VENDOR_RELEASE
="$release"
197 VENDOR_RELEASE
="$release"
200 die
"attempt to set VENDOR_RELEASE without setting VENDOR_DISTRIBUTION"
203 die
"attempt to set with an invalid VENDOR_DISTRIBUTION=$VENDOR_DISTRIBUTION"
209 # Valid values are: apple, redhat, centos, canonical
210 function set_VENDOR
()
212 local vendor
=`echo "$1" | tr '[A-Z]' '[a-z]'`
231 die
"An attempt was made to set an invalid VENDOR=$_vendor"
235 set_VENDOR_DISTRIBUTION
$2
236 set_VENDOR_RELEASE
$3
239 function determine_target_platform
()
241 UNAME_MACHINE_ARCH
=`(uname -m) 2>/dev/null` || UNAME_MACHINE_ARCH
=unknown
242 UNAME_KERNEL
=`(uname -s) 2>/dev/null` || UNAME_SYSTEM
=unknown
243 UNAME_KERNEL_RELEASE
=`(uname -r) 2>/dev/null` || UNAME_KERNEL_RELEASE
=unknown
245 if [[ $
(uname
) == 'Darwin' ]]; then
246 set_VENDOR
'apple' 'darwin' 'mountain'
247 elif [[ -f '/etc/fedora-release' ]]; then
248 local fedora_version
=`cat /etc/fedora-release | awk ' { print $3 } '`
249 set_VENDOR
'redhat' 'fedora' $fedora_version
250 if [[ "x$VENDOR_RELEASE" == 'x17' ]]; then
251 AUTORECONF_REBUILD_HOST
=true
253 elif [[ -f '/etc/centos-release' ]]; then
254 local centos_version
=`cat /etc/centos-release | awk ' { print $7 } '`
255 set_VENDOR
'centos' 'rhel' $centos_version
256 elif [[ -f '/etc/SuSE-release' ]]; then
257 local suse_distribution
=`head -1 /etc/SuSE-release | awk ' { print $1 } '`
258 local suse_version
=`head -1 /etc/SuSE-release | awk ' { print $2 } '`
259 set_VENDOR
'suse' $suse_distribution $suse_version
260 elif [[ -f '/etc/redhat-release' ]]; then
261 local rhel_version
=`cat /etc/redhat-release | awk ' { print $7 } '`
262 set_VENDOR
'redhat' 'rhel' $rhel_version
263 elif [[ -f '/etc/lsb-release' ]]; then
264 local debian_DISTRIB_ID
=`cat /etc/lsb-release | grep DISTRIB_ID | awk -F= ' { print $2 } '`
265 local debian_version
=`cat /etc/lsb-release | grep DISTRIB_CODENAME | awk -F= ' { print $2 } '`
266 set_VENDOR
'canonical' $debian_DISTRIB_ID $debian_version
267 if [[ "x$VENDOR_RELEASE" == 'xprecise' ]]; then
268 AUTORECONF_REBUILD_HOST
=true
275 function run_configure
()
277 # We will run autoreconf if we are required
278 run_autoreconf_if_required
280 # We always begin at the root of our build
282 die
"Programmer error, we entered run_configure with a stacked directory"
285 if ! command_exists
"$CONFIGURE"; then
286 die
"$CONFIGURE does not exist"
290 if [[ -n "$BUILD_DIR" ]]; then
293 safe_pushd
$BUILD_DIR
296 # Arguments for configure
297 local BUILD_CONFIGURE_ARG
=
299 # 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
300 # Set ENV ASSERT in order to enable assert
302 BUILD_CONFIGURE_ARG
+=' --enable-debug --enable-assert'
303 elif [[ -n "$VCS_CHECKOUT" ]]; then
304 BUILD_CONFIGURE_ARG
+=' --enable-assert'
307 if [[ -n "$CONFIGURE_ARG" ]]; then
308 BUILD_CONFIGURE_ARG
+=" $CONFIGURE_ARG"
311 if [[ -n "$PREFIX_ARG" ]]; then
312 BUILD_CONFIGURE_ARG
+=" $PREFIX_ARG"
316 # If we are executing on OSX use CLANG, otherwise only use it if we find it in the ENV
319 CC
=clang CXX
=clang
++ $top_srcdir/configure
$BUILD_CONFIGURE_ARG || die
"Cannot execute CC=clang CXX=clang++ configure $BUILD_CONFIGURE_ARG"
323 command_exists
'gcc44' || die
"Could not locate gcc44"
324 CC
=gcc44 CXX
=gcc44
$top_srcdir/configure
$BUILD_CONFIGURE_ARG || die
"Cannot execute CC=gcc44 CXX=gcc44 configure $BUILD_CONFIGURE_ARG"
328 $CONFIGURE $BUILD_CONFIGURE_ARG
333 if [ $ret -ne 0 ]; then
334 die
"Could not execute $CONFIGURE $BUILD_CONFIGURE_ARG"
337 if [ ! -f 'Makefile' ]; then
338 die
"Programmer error, configure was run but no Makefile existed after $CONFIGURE was run"
342 function setup_gdb_command
() {
343 GDB_TMPFILE
=$
(mktemp
/tmp
/gdb.XXXXXXXXXX
)
344 echo 'set logging overwrite on' > $GDB_TMPFILE
345 echo 'set logging on' >> $GDB_TMPFILE
346 echo 'set environment LIBTEST_IN_GDB=1' >> $GDB_TMPFILE
347 echo 'run' >> $GDB_TMPFILE
348 echo 'thread apply all bt' >> $GDB_TMPFILE
349 echo 'quit' >> $GDB_TMPFILE
350 GDB_COMMAND
="gdb -f -batch -x $GDB_TMPFILE"
353 function setup_valgrind_command
() {
354 VALGRIND_PROGRAM
=`type -p valgrind`
355 if [[ -n "$VALGRIND_PROGRAM" ]]; then
356 VALGRIND_COMMAND
="$VALGRIND_PROGRAM --error-exitcode=1 --leak-check=yes --show-reachable=yes --track-fds=yes --malloc-fill=A5 --free-fill=DE"
360 function save_BUILD
()
362 if [[ -n "$OLD_CONFIGURE" ]]; then
363 die
"OLD_CONFIGURE($OLD_CONFIGURE) was set on push, programmer error!"
366 if [[ -n "$OLD_CONFIGURE_ARG" ]]; then
367 die
"OLD_CONFIGURE_ARG($OLD_CONFIGURE_ARG) was set on push, programmer error!"
370 if [[ -n "$OLD_PREFIX" ]]; then
371 die
"OLD_PREFIX($OLD_PREFIX) was set on push, programmer error!"
374 if [[ -n "$OLD_MAKE" ]]; then
375 die
"OLD_MAKE($OLD_MAKE) was set on push, programmer error!"
378 if [[ -n "$OLD_TESTS_ENVIRONMENT" ]]; then
379 die
"OLD_TESTS_ENVIRONMENT($OLD_TESTS_ENVIRONMENT) was set on push, programmer error!"
382 if [[ -n "$CONFIGURE" ]]; then
383 OLD_CONFIGURE
=$CONFIGURE
386 if [[ -n "$CONFIGURE_ARG" ]]; then
387 OLD_CONFIGURE_ARG
=$CONFIGURE_ARG
390 if [[ -n "$MAKE" ]]; then
394 if [[ -n "$TESTS_ENVIRONMENT" ]]; then
395 OLD_TESTS_ENVIRONMENT
=$TESTS_ENVIRONMENT
399 function restore_BUILD
()
401 if [[ -n "$OLD_CONFIGURE" ]]; then
402 CONFIGURE
=$OLD_CONFIGURE
405 if [[ -n "$OLD_CONFIGURE_ARG" ]]; then
406 CONFIGURE_ARG
=$OLD_CONFIGURE_ARG
409 if [[ -n "$OLD_PREFIX" ]]; then
410 CONFIGURE_ARG
=$OLD_PREFIX
413 if [[ -n "$OLD_MAKE" ]]; then
417 if [[ -n "$OLD_TESTS_ENVIRONMENT" ]]; then
418 TESTS_ENVIRONMENT
=$OLD_TESTS_ENVIRONMENT
425 OLD_TESTS_ENVIRONMENT
=
430 function push_PREFIX_ARG
()
432 if [[ -n "$OLD_PREFIX_ARG" ]]; then
433 die
"OLD_PREFIX_ARG was set on push, programmer error!"
436 if [[ -n "$PREFIX_ARG" ]]; then
437 OLD_PREFIX_ARG
=$PREFIX_ARG
441 if [[ -n "$1" ]]; then
442 PREFIX_ARG
="--prefix=$1"
446 function pop_PREFIX_ARG
()
448 if [[ -n "$OLD_PREFIX_ARG" ]]; then
449 PREFIX_ARG
=$OLD_PREFIX_ARG
456 function push_TESTS_ENVIRONMENT
()
458 if [[ -n "$OLD_TESTS_ENVIRONMENT" ]]; then
459 die
"OLD_TESTS_ENVIRONMENT was set on push, programmer error!"
462 if [[ -n "$TESTS_ENVIRONMENT" ]]; then
463 OLD_TESTS_ENVIRONMENT
=$TESTS_ENVIRONMENT
468 function pop_TESTS_ENVIRONMENT
()
471 if [[ -n "$OLD_TESTS_ENVIRONMENT" ]]; then
472 TESTS_ENVIRONMENT
=$OLD_TESTS_ENVIRONMENT
473 OLD_TESTS_ENVIRONMENT
=
477 function safe_pushd
()
479 pushd $1 &> /dev
/null
;
481 if [ -n "$BUILD_DIR" ]; then
483 echo "BUILD_DIR=$BUILD_DIR"
488 function safe_popd
()
490 local directory_to_delete
=`pwd`
492 if [ $?
-eq 0 ]; then
493 if [[ "$top_srcdir" == "$directory_to_delete" ]]; then
494 die
"We almost deleted top_srcdir($top_srcdir), programmer error"
497 rm -r -f "$directory_to_delete"
501 function make_valgrind
()
503 if [[ "$VENDOR_DISTRIBUTION" == 'darwin' ]]; then
508 # If the env VALGRIND_COMMAND is set then we assume it is valid
509 local valgrind_was_set
=false
510 if [[ -z "$VALGRIND_COMMAND" ]]; then
511 setup_valgrind_command
512 if [[ -n "$VALGRIND_COMMAND" ]]; then
513 valgrind_was_set
=true
516 valgrind_was_set
=true
519 # If valgrind_was_set is set to no we bail
520 if ! $valgrind_was_set; then
521 echo 'valgrind was not present'
525 # If we are required to run configure, do so now
526 run_configure_if_required
528 push_TESTS_ENVIRONMENT
530 # If we don't have a configure, then most likely we will be missing libtool
531 assert_file
'configure'
532 if [[ -f 'libtool' ]]; then
533 TESTS_ENVIRONMENT
="./libtool --mode=execute $VALGRIND_COMMAND"
535 TESTS_ENVIRONMENT
="$VALGRIND_COMMAND"
538 make_target
'check' ||
return 1
540 pop_TESTS_ENVIRONMENT
543 function make_install_system
()
545 local INSTALL_LOCATION
=$
(mktemp
-d /tmp
/XXXXXXXXXX
)
546 push_PREFIX_ARG
$INSTALL_LOCATION
548 if [ ! -d $INSTALL_LOCATION ] ; then
549 die
"ASSERT temp directory not found '$INSTALL_LOCATION'"
552 run_configure
#install_buid_dir
554 push_TESTS_ENVIRONMENT
556 make_target
'install'
558 make_target
'installcheck'
560 make_target
'uninstall'
562 pop_TESTS_ENVIRONMENT
565 rm -r -f $INSTALL_LOCATION
568 if [ -f 'Makefile' ]; then
569 die
"ASSERT Makefile should not exist"
575 function make_darwin_malloc
()
577 run_configure_if_required
579 old_MallocGuardEdges
=$MallocGuardEdges
581 old_MallocErrorAbort
=$MallocErrorAbort
583 old_MallocScribble
=$MallocScribble
588 MallocGuardEdges
=$old_MallocGuardEdges
589 MallocErrorAbort
=$old_MallocErrorAbort
590 MallocScribble
=$old_MallocScribble
593 function snapshot_check
()
595 if [ ! -f "$BOOTSTRAP_SNAPSHOT_CHECK" ]; then
599 if [ -n "$BOOTSTRAP_SNAPSHOT_CHECK" ]; then
600 assert_file
"$BOOTSTRAP_SNAPSHOT_CHECK" 'snapshot check failed'
604 # This will reset our environment, and make sure built files are available.
605 function make_for_snapshot
()
607 # Make sure it is clean
608 make_maintainer_clean
612 make_target
'distclean'
614 # We should have a configure, but no Makefile at the end of this exercise
615 assert_no_file
'Makefile'
616 assert_exec_file
'configure'
621 function check_mingw
()
623 command_exists
'mingw64-configure'
625 if [ "$ret" -ne 0 ]; then
629 command_exists
'mingw64-make'
631 if [ "$ret" -ne 0 ]; then
638 function check_clang
()
640 command_exists
'clang'
642 if [ "$ret" -ne 0 ]; then
649 function check_clang_analyzer
()
651 command_exists
'scan-build'
653 if [ "$ret" -ne 0 ]; then
660 function make_skeleton
()
665 if [ $ret -eq 0 ]; then
666 assert_file
'Makefile'
668 make_target
'all' 'warn'
670 if [ $ret -ne 0 ]; then
673 if [[ -n "$DISPLAY" ]]; then
674 if command_exists
'wine'; then
675 TESTS_ENVIRONMENT
='wine'
679 if [[ -n "$TESTS_ENVIRONMENT" ]]; then
680 make_target
'check' 'warn' || warn
"$MAKE check failed"
685 if $jenkins_build_environment; then
686 make_target
'clean' 'warn'
693 function make_for_mingw
()
695 if ! check_mingw
; then
699 # Make sure it is clean
700 if [ -f Makefile
-o -f configure
]; then
701 make_maintainer_clean
708 CONFIGURE
='mingw64-configure'
710 CONFIGURE_ARGS
='--enable-static --disable-shared'
720 function make_for_clang
()
722 if ! check_clang
; then
726 # Make sure it is clean
727 if [ -f Makefile
-o -f configure
]; then
728 make_maintainer_clean
748 function make_for_clang_analyzer
()
750 if ! check_clang
; then
754 if ! check_clang_analyzer
; then
755 die
'clang-analyzer was not found'
758 # Make sure it is clean
759 if [ -f Makefile
-o -f configure
]; then
760 make_maintainer_clean
769 CONFIGURE_ARGS
='--enable-debug'
774 make_target
'clean' 'warn'
776 scan-build
-o clang-html
make -j4 -k
783 # If we are locally testing, we should make sure the environment is setup correctly
784 function check_for_jenkins
()
786 if ! $jenkins_build_environment; then
787 echo "Not inside of jenkins"
789 if [ -f 'configure' ]; then
790 make_maintainer_clean
793 if $BOOTSTRAP_SNAPSHOT; then
799 function make_universe
()
806 make_for_clang_analyzer
808 if [ check_mingw
-eq 0 ]; then
816 function make_for_continuus_integration
()
818 # Setup the environment if we are local
821 # No matter then evironment, we should not have a Makefile at this point
822 assert_no_file
'Makefile'
824 # Platforms which require bootstrap should have some setup done before we hit this stage.
825 # If we are building locally, skip this step, unless we are just testing locally.
826 if $BOOTSTRAP_SNAPSHOT; then
829 # If we didn't require a snapshot, then we should not have a configure
830 assert_no_file
'configure'
835 assert_no_file
'Makefile' 'Programmer error, Makefile existed where build state should have been clean'
841 assert_exec_file
'configure'
842 assert_file
'Makefile'
846 # make rpm includes "make distcheck"
847 if [[ -f rpm.am
]]; then
849 elif [[ -d rpm
]]; then
855 assert_exec_file
'configure'
856 assert_file
'Makefile'
863 assert_exec_file
'configure'
864 assert_file
'Makefile'
870 assert_exec_file
'configure'
871 assert_file
'Makefile'
875 assert_exec_file
'configure'
876 assert_file
'Makefile'
885 make_maintainer_clean
890 # The point to this test is to test bootstrap.sh itself
891 function self_test
()
893 # We start off with a clean env
894 make_maintainer_clean
896 eval "./bootstrap.sh jenkins" || die
"failed 'jenkins'"
897 eval "./bootstrap.sh all" || die
"failed 'all'"
898 eval "./bootstrap.sh gdb" || die
"failed 'gdb'"
899 eval "./bootstrap.sh maintainer-clean" || die
"failed 'maintainer-clean'"
902 function make_install_html
()
904 run_configure_if_required
905 assert_file
'configure'
907 make_target
'install-html'
912 if command_exists
'gdb'; then
913 run_configure_if_required
915 push_TESTS_ENVIRONMENT
917 # Set ENV GDB_COMMAND
918 if [[ -z "$GDB_COMMAND" ]]; then
922 # If we don't have a configure, then most likely we will be missing libtool
923 assert_file
'configure'
924 if [[ -f 'libtool' ]]; then
925 TESTS_ENVIRONMENT
="./libtool --mode=execute $GDB_COMMAND"
927 TESTS_ENVIRONMENT
="$GDB_COMMAND"
932 if [ -f 'gdb.txt' ]; then
936 pop_TESTS_ENVIRONMENT
938 if [ -f '.gdb_history' ]; then
942 if $jenkins_build_environment; then
946 echo 'gdb was not present'
951 # $1 target to compile
952 # $2 to die, or not to die, based on contents
953 function make_target
()
956 die
"Programmer error, no target provided for make"
959 if [ ! -f 'Makefile' ]; then
960 die
"Programmer error, make was called before configure"
964 if [ -n "$TESTS_ENVIRONMENT" ]; then
966 echo "TESTS_ENVIRONMENT=$TESTS_ENVIRONMENT"
970 if [ -z "$MAKE" ]; then
971 die
"MAKE was not set"
974 # $2 represents error or warn
978 if [ $ret -ne 0 ]; then
980 warn
"Failed to execute $MAKE $1: $ret"
982 die
"Failed to execute $MAKE $1: $ret"
989 function make_distcheck
()
991 make_target
'distcheck'
996 if command_exists
'rpmbuild'; then
997 if [ -f 'rpm.am' -o -d 'rpm' ]; then
998 run_configure_if_required
1001 if $jenkins_build_environment; then
1009 function make_maintainer_clean
()
1011 run_configure_if_required
1012 make_target
'maintainer-clean' 'no_error'
1014 # Lets make sure we really cleaned up the environment
1015 assert_no_file
'Makefile'
1016 assert_no_file
'configure'
1017 assert_no_directory
'autom4te.cache'
1020 function make_check
()
1025 function make_jenkins_default
()
1031 function make_default
()
1033 run_configure_if_required
1037 function run_configure_if_required
()
1039 run_autoreconf_if_required
1041 if [ ! -f 'Makefile' ]; then
1045 assert_file
'Makefile' 'configure did not produce a Makefile'
1048 function run_autoreconf_if_required
()
1050 if [ ! -x 'configure' ]; then
1054 assert_exec_file
'configure'
1057 function run_autoreconf
()
1059 if [[ -z "$AUTORECONF" ]]; then
1060 die
"Programmer error, tried to call run_autoreconf () but AUTORECONF was not set"
1063 if test $use_libtool = 1; then
1064 assert
$BOOTSTRAP_LIBTOOLIZE
1065 run
$BOOTSTRAP_LIBTOOLIZE '--copy' '--install' '--force' || die
"Cannot execute $BOOTSTRAP_LIBTOOLIZE"
1068 run
$AUTORECONF || die
"Cannot execute $AUTORECONF"
1070 eval 'bash -n configure' || die
"autoreconf generated a malformed configure"
1079 if [ -z "$1" ]; then
1086 function parse_command_line_options
()
1088 local SHORTOPTS
=':apcmt:dvh'
1092 while getopts "$SHORTOPTS" opt
; do
1095 AUTORECONF_OPTION
=true
1096 MAKE_TARGET
='autoreconf'
1099 PRINT_SETUP_OPTION
=true
1102 CONFIGURE_OPTION
=true
1103 MAKE_TARGET
='configure'
1105 m
) # maintainer-clean
1107 MAKE_TARGET
='clean_op'
1111 TARGET_OPTION_ARG
="$OPTARG"
1112 MAKE_TARGET
="$OPTARG"
1119 echo "bootstrap.sh [options] optional_target ..."
1127 echo "Option -$OPTARG requires an argument." >&2
1131 echo "$0: error - unrecognized option $1" 1>&2
1139 if [ -n "$1" ]; then
1144 function determine_vcs
()
1146 if [[ -d '.git' ]]; then
1148 elif [[ -d '.bzr' ]]; then
1150 elif [[ -d '.svn' ]]; then
1152 elif [[ -d '.hg' ]]; then
1158 if [[ -n "$VCS_CHECKOUT" ]]; then
1163 function require_libtoolise
()
1166 grep '^[ ]*A[CM]_PROG_LIBTOOL' configure.ac
>/dev
/null \
1168 grep '^[ ]*LT_INIT' configure.ac
>/dev
/null \
1172 function autoreconf_setup
()
1174 # Set ENV MAKE in order to override "make"
1175 if [[ -z "$MAKE" ]]; then
1176 if command_exists
'gmake'; then
1177 MAKE
=`type -p gmake`
1179 if command_exists
'make'; then
1184 if [ "$VCS_CHECKOUT" ]; then
1186 MAKE
="$MAKE --warn-undefined-variables"
1195 if [[ -z "$GNU_BUILD_FLAGS" ]]; then
1196 GNU_BUILD_FLAGS
="--install --force"
1200 GNU_BUILD_FLAGS
="$GNU_BUILD_FLAGS --verbose"
1203 if [ -z "$ACLOCAL_PATH" ]; then
1204 ACLOCAL_PATH
="/usr/local/share/aclocal $ACLOCAL_PATH"
1207 if [[ -z "$WARNINGS" ]]; then
1208 if [[ -n "$VCS_CHECKOUT" ]]; then
1209 WARNINGS
="all,error"
1215 if test $use_libtool = 1; then
1216 if [[ -n "$LIBTOOLIZE" ]]; then
1217 BOOTSTRAP_LIBTOOLIZE
=`type -p $LIBTOOLIZE`
1219 if [[ -z "$BOOTSTRAP_LIBTOOLIZE" ]]; then
1220 echo "Couldn't find user supplied libtoolize, it is required"
1223 # If we are using OSX, we first check to see glibtoolize is available
1224 if [[ "$VENDOR_DISTRIBUTION" == "darwin" ]]; then
1225 BOOTSTRAP_LIBTOOLIZE
=`type -p glibtoolize`
1227 if [[ -z "$BOOTSTRAP_LIBTOOLIZE" ]]; then
1228 echo "Couldn't find glibtoolize, it is required on OSX"
1231 BOOTSTRAP_LIBTOOLIZE
=`type -p libtoolize`
1233 if [[ -z "$BOOTSTRAP_LIBTOOLIZE" ]]; then
1234 echo "Couldn't find libtoolize, it is required"
1239 LIBTOOLIZE_OPTIONS
="--verbose $BOOTSTRAP_LIBTOOLIZE_OPTIONS"
1242 LIBTOOLIZE_OPTIONS
="--debug $BOOTSTRAP_LIBTOOLIZE_OPTIONS"
1247 # Test the ENV AUTOMAKE if it exists
1248 if [[ -n "$AUTOMAKE" ]]; then
1249 run
$AUTOMAKE '--help' &> /dev
/null || die
"Failed to run AUTOMAKE:$AUTOMAKE"
1252 # Test the ENV AUTOCONF if it exists
1253 if [[ -n "$AUTOCONF" ]]; then
1254 run
$AUTOCONF '--help' &> /dev
/null || die
"Failed to run AUTOCONF:$AUTOCONF"
1257 # Test the ENV AUTOHEADER if it exists
1258 if [[ -n "$AUTOHEADER" ]]; then
1259 run
$AUTOHEADER '--help' &> /dev
/null || die
"Failed to run AUTOHEADER:$AUTOHEADER"
1262 # Test the ENV AUTOM4TE if it exists
1263 if [[ -n "$AUTOM4TE" ]]; then
1264 run
$AUTOM4TE '--help' &> /dev
/null || die
"Failed to run AUTOM4TE:$AUTOM4TE"
1267 # Test the ENV AUTOHEADER if it exists, if not we add one and add --install
1268 if [[ -z "$ACLOCAL" ]]; then
1269 ACLOCAL
="aclocal --install"
1271 run
$ACLOCAL '--help' &> /dev
/null || die
"Failed to run ACLOCAL:$ACLOCAL"
1273 if [[ -z "$AUTORECONF" ]]; then
1274 AUTORECONF
=`type -p autoreconf`
1276 if [[ -z "$AUTORECONF" ]]; then
1277 die
"Couldn't find autoreconf"
1280 if [[ -n "$GNU_BUILD_FLAGS" ]]; then
1281 AUTORECONF
="$AUTORECONF $GNU_BUILD_FLAGS"
1285 run
$AUTORECONF '--help' &> /dev
/null || die
"Failed to run AUTORECONF:$AUTORECONF"
1288 function print_setup
()
1290 saved_debug_status
=$DEBUG
1295 echo '----------------------------------------------'
1296 echo 'BOOTSTRAP ENV'
1297 echo "AUTORECONF=$AUTORECONF"
1298 echo "HOST_OS=$HOST_OS"
1301 if $AUTORECONF_OPTION; then
1305 if $CLEAN_OPTION; then
1309 if $CONFIGURE_OPTION; then
1313 if $DEBUG_OPTION; then
1317 if $PRINT_SETUP_OPTION; then
1321 if $TARGET_OPTION; then
1322 echo "--target=$TARGET_OPTION_ARG"
1325 if $VERBOSE_OPTION; then
1329 if [[ -n "$MAKE" ]]; then
1333 if [[ -n "$MAKE_TARGET" ]]; then
1334 echo "MAKE_TARGET=$MAKE_TARGET"
1337 if [[ -n "$PREFIX" ]]; then
1338 echo "PREFIX=$PREFIX"
1341 if [[ -n "$TESTS_ENVIRONMENT" ]]; then
1342 echo "TESTS_ENVIRONMENT=$TESTS_ENVIRONMENT"
1345 if [[ -n "$VCS_CHECKOUT" ]]; then
1346 echo "VCS_CHECKOUT=$VCS_CHECKOUT"
1357 if [[ -n "$WARNINGS" ]]; then
1358 echo "WARNINGS=$WARNINGS"
1360 echo '----------------------------------------------'
1362 if $saved_debug_status; then
1367 function make_clean_option
()
1369 run_configure_if_required
1371 make_maintainer_clean
1373 if [[ "$VCS_CHECKOUT" == 'git' ]]; then
1374 run
"$VCS_CHECKOUT" status
--ignored
1375 elif [[ -n "$VCS_CHECKOUT" ]]; then
1376 run
"$VCS_CHECKOUT" status
1380 function make_for_autoreconf
()
1382 if [ -f 'Makefile' ]; then
1383 make_maintainer_clean
1388 assert_no_file
'Makefile'
1391 function check_make_target
()
1445 die
"Unknown MAKE_TARGET option: $1"
1450 function bootstrap
()
1452 determine_target_platform
1456 # Set up whatever we need to do to use autoreconf later
1460 if [ -z "$MAKE_TARGET" ]; then
1461 MAKE_TARGET
="make_default"
1464 if $PRINT_SETUP_OPTION -o $DEBUG; then
1469 # Exit if all we were looking for were the currently used options
1470 if $PRINT_SETUP_OPTION; then
1475 # Use OLD_TESTS_ENVIRONMENT for tracking the state of the variable
1476 local OLD_TESTS_ENVIRONMENT
=
1478 # Set ENV PREFIX in order to set --prefix for ./configure
1479 if [[ -n "$PREFIX" ]]; then
1480 push_PREFIX_ARG
$PREFIX
1483 # We should always have a target by this point
1486 local MAKE_TARGET_ARRAY
=($MAKE_TARGET)
1488 for target
in "${MAKE_TARGET_ARRAY[@]}"
1490 # If we are running inside of Jenkins, we want to only run some of the possible tests
1491 if $jenkins_build_environment; then
1492 check_make_target
$target
1521 if ! check_clang
; then
1522 die
"clang was not found"
1525 if ! make_for_clang
; then
1526 die
"Failed to build clang: $?"
1530 if ! check_clang_analyzer
; then
1531 die
"clang-analyzer was not found"
1533 if ! check_clang
; then
1534 die
"clang was not found"
1537 if ! make_for_clang_analyzer
; then
1538 die
"Failed to build clang-analyzer: $?"
1542 if ! check_mingw
; then
1543 die
"mingw was not found"
1546 if ! make_for_mingw
; then
1547 die
"Failed to build mingw: $?"
1563 make_for_continuus_integration
1566 run_configure_if_required
1567 make_target
"$target"
1575 # Variables we export
1576 declare -x VCS_CHECKOUT
=
1578 # Variables we control globally
1582 # Options for getopt
1583 local AUTORECONF_OPTION
=false
1584 local CLEAN_OPTION
=false
1585 local CONFIGURE_OPTION
=false
1586 local DEBUG_OPTION
=false
1587 local PRINT_SETUP_OPTION
=false
1588 local TARGET_OPTION
=false
1589 local TARGET_OPTION_ARG
=
1590 local VERBOSE_OPTION
=false
1592 local OLD_CONFIGURE
=
1593 local OLD_CONFIGURE_ARG
=
1596 local OLD_TESTS_ENVIRONMENT
=
1598 # If we call autoreconf on the platform or not
1599 local AUTORECONF_REBUILD_HOST
=false
1600 local AUTORECONF_REBUILD
=false
1602 local -r top_srcdir
=`pwd`
1605 if [ -z "$CONFIGURE" ]; then
1606 CONFIGURE
="$top_srcdir/configure"
1610 # Variables for determine_target_platform () and rebuild_host_os ()
1611 # UNAME_MACHINE_ARCH= uname -m
1612 # VENDOR= apple, redhat, centos, canonical
1614 # RHEL{rhel,Tikanga,Santiago}
1615 # Ubuntu{ubuntu,Lucid,Maverick,Natty,Oneiric,Precise,Quantal}
1616 # Fedora{fedora,Verne,Beefy}
1617 # OSX{osx,lion,snow,mountain}
1618 # VENDOR_DISTRIBUTION= darwin,fedora,rhel,ubuntu
1619 # UNAME_KERNEL= Linux, Darwin,...
1620 # UNAME_KERNEL_RELEASE= Linux, Darwin,...
1621 local UNAME_MACHINE_ARCH
=unknown
1622 local VENDOR
=unknown
1623 local VENDOR_RELEASE
=unknown
1624 local VENDOR_DISTRIBUTION
=unknown
1625 local UNAME_KERNEL
=unknown
1626 local UNAME_KERNEL_RELEASE
=unknown
1629 rebuild_host_os no_output
1631 parse_command_line_options $@
1633 # If we are running under Jenkins we predetermine what tests we will run against
1634 # This MAKE_TARGET can be overridden by parse_command_line_options based MAKE_TARGET changes.
1635 # We don't want Jenkins overriding other variables, so we NULL them.
1636 if [ -z "$MAKE_TARGET" ]; then
1637 if $jenkins_build_environment; then
1638 MAKE_TARGET
='jenkins'
1650 function set_branch
()
1652 if [ -z "$BRANCH" ]; then
1653 if [ -z "$CI_PROJECT_TEAM" ]; then
1654 die
"Variable CI_PROJECT_TEAM has not been set"
1656 if [ -z "$PROJECT" ]; then
1657 die
"Variable PROJECT has not been set"
1659 if [ -z "$BUILD_TAG" ]; then
1660 die
"Variable BUILD_TAG has not been set"
1663 BRANCH
="lp:~$CI_PROJECT_TEAM/$PROJECT/$BUILD_TAG"
1667 if [ -z "$BRANCH" ]; then
1668 die
"Missing values required to build BRANCH variable."
1674 if [ -z "$VCS_CHECKOUT" ]; then
1675 die
"Merges require VCS_CHECKOUT."
1680 if [[ "$VCS_CHECKOUT" == 'bzr' ]]; then
1681 if test -n "$BRANCH_TO_MERGE"; then
1682 bzr merge
$BRANCH_TO_MERGE
1683 bzr commit
--message="Merge $BRANCH_TO_MERGE Build: $BUILD_TAG" --unchanged
1687 elif [[ -n "$VCS_CHECKOUT" ]]; then
1688 die
"Merge attempt occured, current VCS setup does not support this"
1692 function enable_debug
()
1695 local caller_loc
=`caller`
1697 echo "$caller_loc Enabling debug: $1"
1699 echo "$caller_loc Enabling debug"
1709 Usage: $program_name [OPTION]..
1711 Bootstrap this package from the checked-out sources, and optionally walk through CI run.
1718 function disable_debug
()
1724 # Script begins here
1728 env_debug_enabled
=false
1729 if [[ -n "$JENKINS_HOME" ]]; then
1730 declare -r jenkins_build_environment
=true
1732 declare -r jenkins_build_environment
=false
1742 export GNU_BUILD_FLAGS
1744 export LIBTOOLIZE_OPTIONS
1746 export TESTS_ENVIRONMENT
1752 export MallocGuardEdges
1753 export MallocErrorAbort
1754 export MallocScribble
1758 # We check for DEBUG twice, once before we source the config file, and once afterward
1759 env_debug_enabled
=false
1760 if [[ -n "$DEBUG" ]]; then
1761 env_debug_enabled
=true
1766 # Variables which only can be set by .bootstrap
1767 BOOTSTRAP_SNAPSHOT
=false
1768 BOOTSTRAP_SNAPSHOT_CHECK
=
1770 if [ -f '.bootstrap' ]; then
1774 if $env_debug_enabled; then
1777 if [[ -n "$DEBUG" ]]; then
1778 enable_debug
"Enabling DEBUG from '.bootstrap'"
1783 # We do this in order to protect the case where DEBUG
1784 if ! $env_debug_enabled; then