Fix two valgrind finds.
[awesomized/libmemcached] / bootstrap.sh
1 #!/bin/bash
2 #
3 # Copyright (C) 2012-2013 Brian Aker
4 # All rights reserved.
5 #
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions are
8 # met:
9 #
10 # * Redistributions of source code must retain the above copyright
11 # notice, this list of conditions and the following disclaimer.
12 #
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
16 # distribution.
17 #
18 # * The names of its contributors may not be used to endorse or
19 # promote products derived from this software without specific prior
20 # written permission.
21 #
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.
33
34
35 # Environment Variables that will influence the build:
36 # AUTOMAKE
37 # AUTORECONF
38 # LIBTOOLIZE
39 # MAKE
40 # PREFIX
41 # TESTS_ENVIRONMENT
42 # VERBOSE
43 # WARNINGS
44 #
45
46 command_not_found_handle ()
47 {
48 warn "$@: command not found"
49
50 #if $DEBUG; then
51 echo ""
52 echo "Stack trace:"
53 local frame=0
54 while caller $frame; do
55 ((frame++));
56 done
57 echo ""
58 #fi
59
60 return 127
61 }
62
63 function error ()
64 {
65 echo "$BASH_SOURCE:$BASH_LINENO: $@" >&2
66 }
67
68 function die ()
69 {
70 echo "$BASH_SOURCE:$BASH_LINENO: $@" >&2
71 exit 1;
72 }
73
74 function warn ()
75 {
76 echo "$BASH_SOURCE:$BASH_LINENO: $@"
77 #echo "$BASH_SOURCE:$BASH_LINENO: $@" >&1
78 }
79
80 function nassert ()
81 {
82 local param_name=\$"$1"
83 local param_value=`eval "expr \"$param_name\" "`
84
85 if [ -n "$param_value" ]; then
86 echo "$bash_source:$bash_lineno: assert($param_name) had value of "$param_value"" >&2
87 exit 1
88 fi
89 }
90
91 function assert ()
92 {
93 local param_name=\$"$1"
94 local param_value=`eval "expr \"$param_name\" "`
95
96 if [ -z "$param_value" ]; then
97 echo "$bash_source:$bash_lineno: assert($param_name)" >&2
98 exit 1
99 fi
100 }
101
102 function assert_file ()
103 {
104 if [ ! -f "$1" ]; then
105 echo "$BASH_SOURCE:$BASH_LINENO: assert($1) does not exist: $2" >&2
106 exit 1;
107 fi
108 }
109
110 function assert_no_file ()
111 {
112 if [ -f "$1" ]; then
113 echo "$BASH_SOURCE:$BASH_LINENO: assert($1) file exists: $2" >&2
114 exit 1;
115 fi
116 }
117
118 function assert_no_directory ()
119 {
120 if [ -d "$1" ]; then
121 echo "$BASH_SOURCE:$BASH_LINENO: assert($1) directory exists: $2" >&2
122 exit 1;
123 fi
124 }
125
126 function assert_exec_file ()
127 {
128 if [ ! -f "$1" ]; then
129 echo "$BASH_SOURCE:$BASH_LINENO: assert($1) does not exist: $2" >&2
130 exit 1;
131 fi
132
133 if [ ! -x "$1" ]; then
134 echo "$BASH_SOURCE:$BASH_LINENO: assert($1) exists but is not executable: $2" >&2
135 exit 1;
136 fi
137 }
138
139 function command_exists ()
140 {
141 type "$1" &> /dev/null ;
142 }
143
144 function rebuild_host_os ()
145 {
146 HOST_OS="${UNAME_MACHINE_ARCH}-${VENDOR}-${VENDOR_DISTRIBUTION}-${VENDOR_RELEASE}-${UNAME_KERNEL}-${UNAME_KERNEL_RELEASE}"
147 if [ -z "$1" ]; then
148 if $VERBOSE; then
149 echo "HOST_OS=$HOST_OS"
150 fi
151 fi
152 }
153
154 # Validate the distribution name, or toss an erro
155 # values: darwin,fedora,rhel,ubuntu,debian,opensuse
156 function set_VENDOR_DISTRIBUTION ()
157 {
158 local dist=`echo "$1" | tr '[A-Z]' '[a-z]'`
159 case "$dist" in
160 darwin)
161 VENDOR_DISTRIBUTION='darwin'
162 ;;
163 fedora)
164 VENDOR_DISTRIBUTION='fedora'
165 ;;
166 rhel)
167 VENDOR_DISTRIBUTION='rhel'
168 ;;
169 debian)
170 VENDOR_DISTRIBUTION='debian'
171 ;;
172 ubuntu)
173 VENDOR_DISTRIBUTION='ubuntu'
174 ;;
175 suse)
176 VENDOR_DISTRIBUTION='opensuse'
177 ;;
178 opensuse)
179 VENDOR_DISTRIBUTION='opensuse'
180 ;;
181 *)
182 die "attempt to set an invalid VENDOR_DISTRIBUTION=$dist"
183 ;;
184 esac
185 }
186
187 # Validate a Vendor's release name/number
188 function set_VENDOR_RELEASE ()
189 {
190 local release=`echo "$1" | tr '[A-Z]' '[a-z]'`
191
192 if $DEBUG; then
193 echo "VENDOR_DISTRIBUTION:$VENDOR_DISTRIBUTION"
194 echo "VENDOR_RELEASE:$release"
195 fi
196
197 case $VENDOR_DISTRIBUTION in
198 darwin)
199 case $release in
200 10.6*)
201 VENDOR_RELEASE='snow_leopard'
202 ;;
203 10.7*)
204 VENDOR_RELEASE='mountain'
205 ;;
206 mountain)
207 VENDOR_RELEASE='mountain'
208 ;;
209 10.8.*)
210 echo "mountain_lion"
211 VENDOR_RELEASE='mountain_lion'
212 ;;
213 *)
214 echo $VENDOR_RELEASE
215 VENDOR_RELEASE='unknown'
216 ;;
217 esac
218 ;;
219 fedora)
220 VENDOR_RELEASE="$release"
221 if [[ "x$VENDOR_RELEASE" == '18' ]]; then
222 VENDOR_RELEASE='sphericalcow'
223 fi
224 ;;
225 rhel)
226 VENDOR_RELEASE="$release"
227 ;;
228 debian)
229 VENDOR_RELEASE="$release"
230 ;;
231 ubuntu)
232 VENDOR_RELEASE="$release"
233 if [[ "x$VENDOR_RELEASE" == 'x12.04' ]]; then
234 VENDOR_RELEASE="precise"
235 elif [[ "x$VENDOR_RELEASE" == 'x12.10' ]]; then
236 VENDOR_RELEASE="quantal"
237 elif [[ "x$VENDOR_RELEASE" == 'x13.04' ]]; then
238 VENDOR_RELEASE="raring"
239 fi
240 ;;
241 opensuse)
242 VENDOR_RELEASE="$release"
243 ;;
244 unknown)
245 die "attempt to set VENDOR_RELEASE without setting VENDOR_DISTRIBUTION"
246 ;;
247 *)
248 die "attempt to set with an invalid VENDOR_DISTRIBUTION=$VENDOR_DISTRIBUTION"
249 ;;
250 esac
251 }
252
253
254 # Valid values are: apple, redhat, centos, canonical, oracle, suse
255 function set_VENDOR ()
256 {
257 local vendor=`echo "$1" | tr '[A-Z]' '[a-z]'`
258
259 case $vendor in
260 apple)
261 VENDOR='apple'
262 ;;
263 redhat)
264 VENDOR='redhat'
265 ;;
266 fedora)
267 VENDOR='redhat'
268 ;;
269 redhat-release-server-*)
270 VENDOR='redhat'
271 ;;
272 enterprise-release-*)
273 VENDOR='oracle'
274 ;;
275 centos)
276 VENDOR='centos'
277 ;;
278 canonical)
279 VENDOR='canonical'
280 ;;
281 ubuntu)
282 VENDOR='canonical'
283 ;;
284 debian)
285 VENDOR='debian'
286 ;;
287 opensuse)
288 VENDOR='suse'
289 ;;
290 suse)
291 VENDOR='suse'
292 ;;
293 *)
294 die "An attempt was made to set an invalid VENDOR=$_vendor"
295 ;;
296 esac
297
298 set_VENDOR_DISTRIBUTION $2
299 set_VENDOR_RELEASE $3
300
301 # Set which vendor/versions we trust for autoreconf
302 case $VENDOR_DISTRIBUTION in
303 fedora)
304 if [[ "x$VENDOR_RELEASE" == 'x18' ]]; then
305 AUTORECONF_REBUILD_HOST=true
306 elif [[ "x$VENDOR_RELEASE" == 'xsphericalcow' ]]; then
307 AUTORECONF_REBUILD_HOST=true
308 elif [[ "x$VENDOR_RELEASE" == 'x19' ]]; then
309 AUTORECONF_REBUILD_HOST=true
310 fi
311 ;;
312 canonical)
313 if [[ "x$VENDOR_RELEASE" == 'xprecise' ]]; then
314 AUTORECONF_REBUILD_HOST=true
315 elif [[ "x$VENDOR_RELEASE" == 'xquantal' ]]; then
316 AUTORECONF_REBUILD_HOST=true
317 fi
318 ;;
319 esac
320
321 }
322
323 function determine_target_platform ()
324 {
325 UNAME_MACHINE_ARCH=`(uname -m) 2>/dev/null` || UNAME_MACHINE_ARCH=unknown
326 UNAME_KERNEL=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
327 UNAME_KERNEL_RELEASE=`(uname -r) 2>/dev/null` || UNAME_KERNEL_RELEASE=unknown
328
329 if [[ -x '/usr/bin/sw_vers' ]]; then
330 local _VERSION=`/usr/bin/sw_vers -productVersion`
331 set_VENDOR 'apple' 'darwin' $_VERSION
332 elif [[ $(uname) == 'Darwin' ]]; then
333 set_VENDOR 'apple' 'darwin' 'mountain'
334 elif [[ -f '/etc/fedora-release' ]]; then
335 local fedora_version=`cat /etc/fedora-release | awk ' { print $3 } '`
336 set_VENDOR 'redhat' 'fedora' $fedora_version
337 elif [[ -f '/etc/centos-release' ]]; then
338 local centos_version=`cat /etc/centos-release | awk ' { print $7 } '`
339 set_VENDOR 'centos' 'rhel' $centos_version
340 elif [[ -f '/etc/SuSE-release' ]]; then
341 local suse_distribution=`head -1 /etc/SuSE-release | awk ' { print $1 } '`
342 local suse_version=`head -1 /etc/SuSE-release | awk ' { print $2 } '`
343 set_VENDOR 'suse' $suse_distribution $suse_version
344 elif [[ -f '/etc/redhat-release' ]]; then
345 local rhel_version=`cat /etc/redhat-release | awk ' { print $7 } '`
346 local _vendor=`rpm -qf /etc/redhat-release`
347 set_VENDOR $_vendor 'rhel' $rhel_version
348 elif [[ -f '/etc/os-release' ]]; then
349 source '/etc/os-release'
350 set_VENDOR $ID $ID $VERSION_ID
351 elif [[ -x '/usr/bin/lsb_release' ]]; then
352 local _ID=`/usr/bin/lsb_release -s -i`
353 local _VERSION=`/usr/bin/lsb_release -s -r`
354 set_VENDOR $_ID $_ID $_VERSION_ID
355 elif [[ -f '/etc/lsb-release' ]]; then
356 source '/etc/lsb-release'
357 set_VENDOR 'canonical' $DISTRIB_ID $DISTRIB_CODENAME
358 fi
359
360 rebuild_host_os
361 }
362
363 function run_configure ()
364 {
365 # We will run autoreconf if we are required
366 run_autoreconf_if_required
367
368 # We always begin at the root of our build
369 if [ ! popd ]; then
370 die "Programmer error, we entered run_configure with a stacked directory"
371 fi
372
373 if ! command_exists "$CONFIGURE"; then
374 die "$CONFIGURE does not exist"
375 fi
376
377 local BUILD_DIR="$1"
378 if [[ -n "$BUILD_DIR" ]]; then
379 rm -r -f $BUILD_DIR
380 mkdir -p $BUILD_DIR
381 safe_pushd $BUILD_DIR
382 fi
383
384 # Arguments for configure
385 local BUILD_CONFIGURE_ARG=
386
387 # 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
388 # Set ENV ASSERT in order to enable assert.
389 # If we are doing a valgrind run, we always compile with assert disabled
390 if $valgrind_run; then
391 BUILD_CONFIGURE_ARG+= " CXXFLAGS=-DNDEBUG "
392 BUILD_CONFIGURE_ARG+= " CFLAGS=-DNDEBUG "
393 else
394 if $DEBUG; then
395 BUILD_CONFIGURE_ARG+=' --enable-debug --enable-assert'
396 elif [[ -n "$VCS_CHECKOUT" ]]; then
397 BUILD_CONFIGURE_ARG+=' --enable-assert'
398 fi
399 fi
400
401 if [[ -n "$CONFIGURE_ARG" ]]; then
402 BUILD_CONFIGURE_ARG+=" $CONFIGURE_ARG"
403 fi
404
405 if [[ -n "$PREFIX_ARG" ]]; then
406 BUILD_CONFIGURE_ARG+=" $PREFIX_ARG"
407 fi
408
409 ret=1;
410 # If we are executing on OSX use CLANG, otherwise only use it if we find it in the ENV
411 case $HOST_OS in
412 *-darwin-*)
413 CC=clang CXX=clang++ $top_srcdir/configure $BUILD_CONFIGURE_ARG || die "Cannot execute CC=clang CXX=clang++ configure $BUILD_CONFIGURE_ARG"
414 ret=$?
415 ;;
416 rhel-5*)
417 command_exists 'gcc44' || die "Could not locate gcc44"
418 CC=gcc44 CXX=gcc44 $top_srcdir/configure $BUILD_CONFIGURE_ARG || die "Cannot execute CC=gcc44 CXX=gcc44 configure $BUILD_CONFIGURE_ARG"
419 ret=$?
420 ;;
421 *)
422 $CONFIGURE $BUILD_CONFIGURE_ARG
423 ret=$?
424 ;;
425 esac
426
427 if [ $ret -ne 0 ]; then
428 die "Could not execute $CONFIGURE $BUILD_CONFIGURE_ARG"
429 fi
430
431 if [ ! -f 'Makefile' ]; then
432 die "Programmer error, configure was run but no Makefile existed after $CONFIGURE was run"
433 fi
434 }
435
436 function setup_gdb_command () {
437 GDB_TMPFILE=$(mktemp /tmp/gdb.XXXXXXXXXX)
438 echo 'set logging overwrite on' > $GDB_TMPFILE
439 echo 'set logging on' >> $GDB_TMPFILE
440 echo 'set environment LIBTEST_IN_GDB=1' >> $GDB_TMPFILE
441 echo 'run' >> $GDB_TMPFILE
442 echo 'thread apply all bt' >> $GDB_TMPFILE
443 echo 'quit' >> $GDB_TMPFILE
444 GDB_COMMAND="gdb -f -batch -x $GDB_TMPFILE"
445 }
446
447 function setup_valgrind_command () {
448 VALGRIND_PROGRAM=`type -p valgrind`
449 if [[ -n "$VALGRIND_PROGRAM" ]]; then
450 VALGRIND_COMMAND="$VALGRIND_PROGRAM --error-exitcode=1 --leak-check=yes --malloc-fill=A5 --free-fill=DE --xml=yes --xml-file=\"valgrind-%p.xml\""
451 fi
452 }
453
454 function save_BUILD ()
455 {
456 if [[ -n "$OLD_CONFIGURE" ]]; then
457 die "OLD_CONFIGURE($OLD_CONFIGURE) was set on push, programmer error!"
458 fi
459
460 if [[ -n "$OLD_CONFIGURE_ARG" ]]; then
461 die "OLD_CONFIGURE_ARG($OLD_CONFIGURE_ARG) was set on push, programmer error!"
462 fi
463
464 if [[ -n "$OLD_PREFIX" ]]; then
465 die "OLD_PREFIX($OLD_PREFIX) was set on push, programmer error!"
466 fi
467
468 if [[ -n "$OLD_MAKE" ]]; then
469 die "OLD_MAKE($OLD_MAKE) was set on push, programmer error!"
470 fi
471
472 if [[ -n "$OLD_TESTS_ENVIRONMENT" ]]; then
473 die "OLD_TESTS_ENVIRONMENT($OLD_TESTS_ENVIRONMENT) was set on push, programmer error!"
474 fi
475
476 if [[ -n "$CONFIGURE" ]]; then
477 OLD_CONFIGURE=$CONFIGURE
478 fi
479
480 if [[ -n "$CONFIGURE_ARG" ]]; then
481 OLD_CONFIGURE_ARG=$CONFIGURE_ARG
482 fi
483
484 if [[ -n "$MAKE" ]]; then
485 OLD_MAKE=$MAKE
486 fi
487
488 if [[ -n "$TESTS_ENVIRONMENT" ]]; then
489 OLD_TESTS_ENVIRONMENT=$TESTS_ENVIRONMENT
490 fi
491 }
492
493 function restore_BUILD ()
494 {
495 if [[ -n "$OLD_CONFIGURE" ]]; then
496 CONFIGURE=$OLD_CONFIGURE
497 fi
498
499 if [[ -n "$OLD_CONFIGURE_ARG" ]]; then
500 CONFIGURE_ARG=$OLD_CONFIGURE_ARG
501 fi
502
503 if [[ -n "$OLD_PREFIX" ]]; then
504 PREFIX_ARG=$OLD_PREFIX
505 fi
506
507 if [[ -n "$OLD_MAKE" ]]; then
508 MAKE=$OLD_MAKE
509 fi
510
511 if [[ -n "$OLD_TESTS_ENVIRONMENT" ]]; then
512 TESTS_ENVIRONMENT=$OLD_TESTS_ENVIRONMENT
513 fi
514
515 OLD_CONFIGURE=
516 OLD_CONFIGURE_ARG=
517 OLD_PREFIX=
518 OLD_MAKE=
519 OLD_TESTS_ENVIRONMENT=
520
521 export -n CC CXX
522 }
523
524 function safe_pushd ()
525 {
526 pushd $1 &> /dev/null ;
527
528 if [ -n "$BUILD_DIR" ]; then
529 if $VERBOSE; then
530 echo "BUILD_DIR=$BUILD_DIR"
531 fi
532 fi
533 }
534
535 function safe_popd ()
536 {
537 local directory_to_delete=`pwd`
538 popd &> /dev/null ;
539 if [ $? -eq 0 ]; then
540 if [[ "$top_srcdir" == "$directory_to_delete" ]]; then
541 die "We almost deleted top_srcdir($top_srcdir), programmer error"
542 fi
543
544 rm -r -f "$directory_to_delete"
545 fi
546 }
547
548 function make_valgrind ()
549 {
550 # If the env VALGRIND_COMMAND is set then we assume it is valid
551 local valgrind_was_set=false
552 if [[ -z "$VALGRIND_COMMAND" ]]; then
553 setup_valgrind_command
554 if [[ -n "$VALGRIND_COMMAND" ]]; then
555 valgrind_was_set=true
556 fi
557 else
558 valgrind_was_set=true
559 fi
560
561 # If valgrind_was_set is set to no we bail
562 if ! $valgrind_was_set; then
563 echo 'valgrind was not present'
564 return 1
565 fi
566
567 save_BUILD
568
569 valgrind_run=true
570
571 # If we are required to run configure, do so now
572 run_configure
573
574 # If we don't have a configure, then most likely we will be missing libtool
575 assert_file 'configure'
576 if [[ -f 'libtool' ]]; then
577 TESTS_ENVIRONMENT="./libtool --mode=execute $VALGRIND_COMMAND"
578 else
579 TESTS_ENVIRONMENT="$VALGRIND_COMMAND"
580 fi
581
582 make_target 'all'
583 make_target 'check'
584 ret=$?
585
586 # If we aren't going to error, we will clean up our environment
587 if [ "$ret" -eq 0 ]; then
588 make 'distclean'
589 fi
590
591 valgrind_run=false
592
593 restore_BUILD
594
595 if [ "$ret" -ne 0 ]; then
596 return 1
597 fi
598 }
599
600 function make_install_system ()
601 {
602 local INSTALL_LOCATION=$(mktemp -d /tmp/XXXXXXXXXX)
603
604 save_BUILD
605 PREFIX_ARG="--prefix=$INSTALL_LOCATION"
606
607 if [ ! -d $INSTALL_LOCATION ] ; then
608 die "ASSERT temp directory not found '$INSTALL_LOCATION'"
609 fi
610
611 run_configure #install_buid_dir
612
613 make_target 'install'
614
615 make_target 'installcheck'
616
617 make_target 'uninstall'
618
619 rm -r -f $INSTALL_LOCATION
620 make 'distclean'
621
622 if [ -f 'Makefile' ]; then
623 die "ASSERT Makefile should not exist"
624 fi
625
626 restore_BUILD
627 safe_popd
628 }
629
630 function make_darwin_malloc ()
631 {
632 run_configure_if_required
633
634 old_MallocGuardEdges=$MallocGuardEdges
635 MallocGuardEdges=1
636 old_MallocErrorAbort=$MallocErrorAbort
637 MallocErrorAbort=1
638 old_MallocScribble=$MallocScribble
639 MallocScribble=1
640
641 make_check
642
643 MallocGuardEdges=$old_MallocGuardEdges
644 MallocErrorAbort=$old_MallocErrorAbort
645 MallocScribble=$old_MallocScribble
646 }
647
648 # This will reset our environment, and make sure built files are available.
649 function make_for_snapshot ()
650 {
651 # Lets make sure we have a clean environment
652 assert_no_file 'Makefile'
653 assert_no_file 'configure'
654 assert_no_directory 'autom4te.cache'
655
656 run_configure
657 make_target 'all'
658 make_target 'distclean'
659
660 # We should have a configure, but no Makefile at the end of this exercise
661 assert_no_file 'Makefile'
662 assert_exec_file 'configure'
663 }
664
665 function check_mingw ()
666 {
667 command_exists 'mingw64-configure'
668 ret=$?
669 if [ "$ret" -ne 0 ]; then
670 return 1
671 fi
672
673 command_exists 'mingw64-make'
674 ret=$?
675 if [ "$ret" -ne 0 ]; then
676 return 1
677 fi
678
679 return 0
680 }
681
682 function check_clang ()
683 {
684 command_exists 'clang'
685 ret=$?
686 if [ "$ret" -ne 0 ]; then
687 return 1
688 fi
689
690 return 0
691 }
692
693 function check_clang_analyzer ()
694 {
695 command_exists 'scan-build'
696 ret=$?
697 if [ "$ret" -ne 0 ]; then
698 return 1
699 fi
700
701 return 0
702 }
703
704 function make_skeleton ()
705 {
706 run_configure
707 ret=$?
708
709 if [ $ret -eq 0 ]; then
710 assert_file 'Makefile'
711
712 make_target 'all' 'warn'
713 ret=$?
714 if [ $ret -ne 0 ]; then
715 warn "$MAKE failed"
716 else
717 if [[ -n "$DISPLAY" ]]; then
718 if command_exists 'wine'; then
719 TESTS_ENVIRONMENT='wine'
720 fi
721 fi
722
723 if [[ -n "$TESTS_ENVIRONMENT" ]]; then
724 make_target 'check' 'warn' || warn "$MAKE check failed"
725 ret=$?
726 fi
727 fi
728
729 if $jenkins_build_environment; then
730 make_target 'clean' 'warn'
731 fi
732 fi
733
734 return $ret
735 }
736
737 function make_for_mingw ()
738 {
739 if ! check_mingw; then
740 return 1
741 fi
742
743 # Make sure it is clean
744 if [ -f Makefile -o -f configure ]; then
745 make_maintainer_clean
746 fi
747
748 run_autoreconf
749
750 save_BUILD
751
752 CONFIGURE='mingw64-configure'
753 MAKE='mingw64-make'
754 CONFIGURE_ARGS='--enable-static --disable-shared'
755
756 make_skeleton
757 ret=$?
758
759 restore_BUILD
760
761 return $ret
762 }
763
764 function make_for_clang ()
765 {
766 if ! check_clang; then
767 return 1
768 fi
769
770 # Make sure it is clean
771 if [ -f Makefile -o -f configure ]; then
772 make_maintainer_clean
773 fi
774
775 run_autoreconf
776
777 save_BUILD
778
779 CC=clang CXX=clang++
780 export CC CXX
781
782 make_skeleton
783 ret=$?
784
785 make_target 'check'
786
787 restore_BUILD
788
789 return $ret
790 }
791
792 function make_for_clang_analyzer ()
793 {
794 if ! check_clang; then
795 return 1
796 fi
797
798 if ! check_clang_analyzer; then
799 die 'clang-analyzer was not found'
800 fi
801
802 # Make sure it is clean
803 if [ -f Makefile -o -f configure ]; then
804 make_maintainer_clean
805 fi
806
807 run_autoreconf
808
809 save_BUILD
810
811 CC=clang CXX=clang++
812 export CC CXX
813 CONFIGURE_ARGS='--enable-debug'
814
815 make_skeleton
816 ret=$?
817
818 make_target 'clean' 'warn'
819
820 scan-build -o clang-html make -j4 -k
821
822 restore_BUILD
823
824 return $ret
825 }
826
827 # If we are locally testing, we should make sure the environment is setup correctly
828 function check_for_jenkins ()
829 {
830 if ! $jenkins_build_environment; then
831 echo "Not inside of jenkins, simulating environment"
832
833 if [ -f 'configure' ]; then
834 make_maintainer_clean
835 fi
836
837 if $BOOTSTRAP_SNAPSHOT; then
838 make_for_snapshot
839 fi
840 fi
841 }
842
843 function make_universe ()
844 {
845 make_for_snapshot
846 make_valgrind
847 make_gdb
848 make_rpm
849 make_for_clang
850 make_for_clang_analyzer
851
852 if [ check_mingw -eq 0 ]; then
853 make_for_mingw
854 fi
855
856 make_distcheck
857 make_install_system
858 }
859
860 function check_snapshot ()
861 {
862 if [ -n "$BOOTSTRAP_SNAPSHOT_CHECK" ]; then
863 assert_file "$BOOTSTRAP_SNAPSHOT_CHECK" 'snapshot check failed'
864 fi
865 }
866
867 function make_for_continuus_integration ()
868 {
869 # Setup the environment if we are local
870 check_for_jenkins
871
872 # No matter then evironment, we should not have a Makefile at this point
873 assert_no_file 'Makefile'
874
875 # Platforms which require bootstrap should have some setup done before we hit this stage.
876 # If we are building locally, skip this step, unless we are just testing locally.
877 if $BOOTSTRAP_SNAPSHOT; then
878 if $BOOTSTRAP_SNAPSHOT; then
879 assert_file 'configure'
880 fi
881
882 check_snapshot
883 else
884 # If we didn't require a snapshot, then we should not have a configure
885 assert_no_file 'configure'
886
887 run_autoreconf
888 fi
889
890 assert_no_file 'Makefile' 'Programmer error, Makefile existed where build state should have been clean'
891
892 case $HOST_OS in
893 *-fedora-*)
894 run_configure
895
896 assert_exec_file 'configure'
897 assert_file 'Makefile'
898
899 make_target 'all'
900
901 # make rpm includes "make distcheck"
902 if [[ -f rpm.am ]]; then
903 make_rpm
904 elif [[ -d rpm ]]; then
905 make_rpm
906 fi
907 ;;
908 *)
909 make_jenkins_default
910 ;;
911 esac
912
913 make_maintainer_clean
914
915 safe_popd
916 }
917
918 # The point to this test is to test bootstrap.sh itself
919 function self_test ()
920 {
921 # We start off with a clean env
922 make_maintainer_clean
923
924 eval "./bootstrap.sh jenkins" || die "failed 'jenkins'"
925 eval "./bootstrap.sh all" || die "failed 'all'"
926 eval "./bootstrap.sh gdb" || die "failed 'gdb'"
927 eval "./bootstrap.sh maintainer-clean" || die "failed 'maintainer-clean'"
928 }
929
930 function make_install_html ()
931 {
932 run_configure_if_required
933 assert_file 'configure'
934
935 make_target 'install-html'
936 }
937
938 function make_gdb ()
939 {
940 save_BUILD
941
942 if command_exists 'gdb'; then
943 run_configure_if_required
944
945 # Set ENV GDB_COMMAND
946 if [[ -z "$GDB_COMMAND" ]]; then
947 setup_gdb_command
948 fi
949
950 # If we don't have a configure, then most likely we will be missing libtool
951 assert_file 'configure'
952 if [[ -f 'libtool' ]]; then
953 TESTS_ENVIRONMENT="./libtool --mode=execute $GDB_COMMAND"
954 else
955 TESTS_ENVIRONMENT="$GDB_COMMAND"
956 fi
957
958 make_target 'check'
959
960 if [ -f 'gdb.txt' ]; then
961 rm 'gdb.txt'
962 fi
963
964 if [ -f '.gdb_history' ]; then
965 rm '.gdb_history'
966 fi
967
968 if $jenkins_build_environment; then
969 make_target 'clean'
970 fi
971 else
972 echo 'gdb was not present'
973 return 1
974 fi
975
976 restore_BUILD
977 }
978
979 # $1 target to compile
980 # $2 to die, or not to die, based on contents
981 function make_target ()
982 {
983 if [ -z "$1" ]; then
984 die "Programmer error, no target provided for make"
985 fi
986
987 if [ ! -f 'Makefile' ]; then
988 die "Programmer error, make was called before configure"
989 run_configure
990 fi
991
992 if [ -n "$TESTS_ENVIRONMENT" ]; then
993 if $VERBOSE; then
994 echo "TESTS_ENVIRONMENT=$TESTS_ENVIRONMENT"
995 fi
996 fi
997
998 if [ -z "$MAKE" ]; then
999 die "MAKE was not set"
1000 fi
1001
1002 # $2 represents error or warn
1003 run $MAKE $1
1004 ret=$?
1005
1006 if [ $ret -ne 0 ]; then
1007 if [ -n "$2" ]; then
1008 warn "Failed to execute $MAKE $1: $ret"
1009 else
1010 die "Failed to execute $MAKE $1: $ret"
1011 fi
1012 fi
1013
1014 return $ret
1015 }
1016
1017 function make_distcheck ()
1018 {
1019 make_target 'distcheck'
1020 }
1021
1022 function make_rpm ()
1023 {
1024 if command_exists 'rpmbuild'; then
1025 if [ -f 'rpm.am' -o -d 'rpm' ]; then
1026 run_configure_if_required
1027 make_target 'rpm'
1028
1029 if $jenkins_build_environment; then
1030 make_target 'clean'
1031 fi
1032
1033 fi
1034 fi
1035 }
1036
1037 function make_maintainer_clean ()
1038 {
1039 run_configure_if_required
1040 make_target 'maintainer-clean' 'no_error'
1041
1042 # Lets make sure we really cleaned up the environment
1043 assert_no_file 'Makefile'
1044 assert_no_file 'configure'
1045 assert_no_directory 'autom4te.cache'
1046 }
1047
1048 function make_check ()
1049 {
1050 make_target 'check'
1051 }
1052
1053 function make_jenkins_default ()
1054 {
1055 run_configure
1056 make_target 'all'
1057 }
1058
1059 function make_default ()
1060 {
1061 run_configure_if_required
1062 make_target 'all'
1063 }
1064
1065 function run_configure_if_required ()
1066 {
1067 run_autoreconf_if_required
1068
1069 if [ ! -f 'Makefile' ]; then
1070 run_configure
1071 fi
1072
1073 assert_file 'Makefile' 'configure did not produce a Makefile'
1074 }
1075
1076 function run_make_maintainer_clean_if_possible ()
1077 {
1078 if [ -f 'Makefile' ]; then
1079 make_maintainer_clean
1080 fi
1081 }
1082
1083 function run_autoreconf_if_required ()
1084 {
1085 if [ ! -x 'configure' ]; then
1086 run_autoreconf
1087 fi
1088
1089 assert_exec_file 'configure'
1090 bash -n configure
1091 }
1092
1093 function run_autoreconf ()
1094 {
1095 if [[ -z "$AUTORECONF" ]]; then
1096 die "Programmer error, tried to call run_autoreconf () but AUTORECONF was not set"
1097 fi
1098
1099 if test $use_libtool = 1; then
1100 assert $BOOTSTRAP_LIBTOOLIZE
1101 run $BOOTSTRAP_LIBTOOLIZE '--copy' '--install' '--force' || die "Cannot execute $BOOTSTRAP_LIBTOOLIZE"
1102 fi
1103
1104 run $AUTORECONF $AUTORECONF_ARGS || die "Cannot execute $AUTORECONF"
1105
1106 eval 'bash -n configure' || die "autoreconf generated a malformed configure"
1107 }
1108
1109 function run ()
1110 {
1111 if $VERBOSE; then
1112 echo "\`$@' $ARGS"
1113 fi
1114
1115 if [ -z "$1" ]; then
1116 return 127;
1117 fi
1118
1119 eval $@ $ARGS
1120 }
1121
1122 function parse_command_line_options ()
1123 {
1124 local SHORTOPTS=':apcmt:dvh'
1125
1126 nassert MAKE_TARGET
1127
1128 while getopts "$SHORTOPTS" opt; do
1129 case $opt in
1130 a) #--autoreconf
1131 AUTORECONF_OPTION=true
1132 MAKE_TARGET='autoreconf'
1133 ;;
1134 p) #--print-env
1135 PRINT_SETUP_OPTION=true
1136 ;;
1137 c) # --configure
1138 CONFIGURE_OPTION=true
1139 MAKE_TARGET='configure'
1140 ;;
1141 m) # maintainer-clean
1142 CLEAN_OPTION=true
1143 MAKE_TARGET='clean_op'
1144 ;;
1145 t) # target
1146 TARGET_OPTION=true
1147 TARGET_OPTION_ARG="$OPTARG"
1148 MAKE_TARGET="$OPTARG"
1149 ;;
1150 d) # debug
1151 DEBUG_OPTION=true
1152 enable_debug
1153 ;;
1154 h) # help
1155 echo "bootstrap.sh [options] optional_target ..."
1156 echo " -a # Just run autoreconf";
1157 echo " -p # Print ENV";
1158 echo " -c # Just run configure";
1159 echo " -m # Just run maintainer-clean";
1160 echo " -t # Make target";
1161 echo " -d # Enable debug";
1162 echo " -h # Show help";
1163 echo " -v # Be more verbose in output";
1164 exit
1165 ;;
1166 v) # verbose
1167 VERBOSE_OPTION=true
1168 VERBOSE=true
1169 ;;
1170 :)
1171 echo "Option -$OPTARG requires an argument." >&2
1172 exit 1
1173 ;;
1174 *)
1175 echo "$0: error - unrecognized option $1" 1>&2
1176 exit 1
1177 ;;
1178 esac
1179 done
1180
1181 shift $((OPTIND-1))
1182
1183 if [ -n "$1" ]; then
1184 MAKE_TARGET="$@"
1185 fi
1186 }
1187
1188 function determine_vcs ()
1189 {
1190 if [[ -d '.git' ]]; then
1191 VCS_CHECKOUT=git
1192 elif [[ -d '.bzr' ]]; then
1193 VCS_CHECKOUT=bzr
1194 elif [[ -d '.svn' ]]; then
1195 VCS_CHECKOUT=svn
1196 elif [[ -d '.hg' ]]; then
1197 VCS_CHECKOUT=hg
1198 else
1199 VCS_CHECKOUT=
1200 fi
1201
1202 if [[ -n "$VCS_CHECKOUT" ]]; then
1203 VERBOSE=true
1204 fi
1205 }
1206
1207 function require_libtoolise ()
1208 {
1209 use_libtool=0
1210 grep '^[ ]*A[CM]_PROG_LIBTOOL' configure.ac >/dev/null \
1211 && use_libtool=1
1212 grep '^[ ]*LT_INIT' configure.ac >/dev/null \
1213 && use_libtool=1
1214 }
1215
1216 function autoreconf_setup ()
1217 {
1218 # Set ENV MAKE in order to override "make"
1219 if [[ -z "$MAKE" ]]; then
1220 if command_exists 'gmake'; then
1221 MAKE=`type -p gmake`
1222 else
1223 if command_exists 'make'; then
1224 MAKE=`type -p make`
1225 fi
1226 fi
1227
1228 if [ "$VCS_CHECKOUT" ]; then
1229 if $DEBUG; then
1230 MAKE="$MAKE --warn-undefined-variables"
1231 fi
1232 fi
1233
1234 if $DEBUG; then
1235 MAKE="$MAKE -d"
1236 fi
1237 fi
1238
1239 if [[ -z "$GNU_BUILD_FLAGS" ]]; then
1240 GNU_BUILD_FLAGS="--install --force"
1241 fi
1242
1243 if $VERBOSE; then
1244 GNU_BUILD_FLAGS="$GNU_BUILD_FLAGS --verbose"
1245 fi
1246
1247 if [ -z "$ACLOCAL_PATH" ]; then
1248 ACLOCAL_PATH="/usr/local/share/aclocal $ACLOCAL_PATH"
1249 fi
1250
1251 if [[ -z "$WARNINGS" ]]; then
1252 if [[ -n "$VCS_CHECKOUT" ]]; then
1253 WARNINGS="all,error"
1254 else
1255 WARNINGS="all"
1256 fi
1257 fi
1258
1259 if test $use_libtool = 1; then
1260 if [[ -n "$LIBTOOLIZE" ]]; then
1261 BOOTSTRAP_LIBTOOLIZE=`type -p $LIBTOOLIZE`
1262
1263 if [[ -z "$BOOTSTRAP_LIBTOOLIZE" ]]; then
1264 echo "Couldn't find user supplied libtoolize, it is required"
1265 return 1
1266 fi
1267 else
1268 # If we are using OSX, we first check to see glibtoolize is available
1269 if [[ "$VENDOR_DISTRIBUTION" == "darwin" ]]; then
1270 BOOTSTRAP_LIBTOOLIZE=`type -p glibtoolize`
1271
1272 if [[ -z "$BOOTSTRAP_LIBTOOLIZE" ]]; then
1273 echo "Couldn't find glibtoolize, it is required on OSX"
1274 return 1
1275 fi
1276 else
1277 BOOTSTRAP_LIBTOOLIZE=`type -p libtoolize`
1278
1279 if [[ -z "$BOOTSTRAP_LIBTOOLIZE" ]]; then
1280 echo "Couldn't find libtoolize, it is required"
1281 return 1
1282 fi
1283 fi
1284 fi
1285
1286 if $VERBOSE; then
1287 LIBTOOLIZE_OPTIONS="--verbose $BOOTSTRAP_LIBTOOLIZE_OPTIONS"
1288 fi
1289
1290 if $DEBUG; then
1291 LIBTOOLIZE_OPTIONS="--debug $BOOTSTRAP_LIBTOOLIZE_OPTIONS"
1292 fi
1293
1294 # Here we set LIBTOOLIZE to true since we are going to invoke it via BOOTSTRAP_LIBTOOLIZE
1295 LIBTOOLIZE=true
1296 fi
1297
1298 # Test the ENV AUTOMAKE if it exists
1299 if [[ -n "$AUTOMAKE" ]]; then
1300 run $AUTOMAKE '--help' &> /dev/null || die "Failed to run AUTOMAKE:$AUTOMAKE"
1301 fi
1302
1303 # Test the ENV AUTOCONF if it exists
1304 if [[ -n "$AUTOCONF" ]]; then
1305 run $AUTOCONF '--help' &> /dev/null || die "Failed to run AUTOCONF:$AUTOCONF"
1306 fi
1307
1308 # Test the ENV AUTOHEADER if it exists
1309 if [[ -n "$AUTOHEADER" ]]; then
1310 run $AUTOHEADER '--help' &> /dev/null || die "Failed to run AUTOHEADER:$AUTOHEADER"
1311 fi
1312
1313 # Test the ENV AUTOM4TE if it exists
1314 if [[ -n "$AUTOM4TE" ]]; then
1315 run $AUTOM4TE '--help' &> /dev/null || die "Failed to run AUTOM4TE:$AUTOM4TE"
1316 fi
1317
1318 # Test the ENV AUTOHEADER if it exists, if not we add one and add --install
1319 if [[ -z "$ACLOCAL" ]]; then
1320 ACLOCAL="aclocal --install"
1321 fi
1322 run $ACLOCAL '--help' &> /dev/null || die "Failed to run ACLOCAL:$ACLOCAL"
1323
1324 if [[ -z "$AUTORECONF" ]]; then
1325 AUTORECONF=`type -p autoreconf`
1326
1327 if [[ -z "$AUTORECONF" ]]; then
1328 die "Couldn't find autoreconf"
1329 fi
1330
1331 if [[ -n "$GNU_BUILD_FLAGS" ]]; then
1332 AUTORECONF_ARGS="$GNU_BUILD_FLAGS"
1333 fi
1334 fi
1335
1336 run $AUTORECONF '--help' &> /dev/null || die "Failed to run AUTORECONF:$AUTORECONF"
1337 }
1338
1339 function print_setup ()
1340 {
1341 saved_debug_status=$DEBUG
1342 if $DEBUG; then
1343 disable_debug
1344 fi
1345
1346 echo '----------------------------------------------'
1347 echo 'BOOTSTRAP ENV'
1348 echo "AUTORECONF=$AUTORECONF"
1349 echo "HOST_OS=$HOST_OS"
1350 echo "VENDOR=$VENDOR"
1351 echo "VENDOR_DISTRIBUTION=$VENDOR_DISTRIBUTION"
1352 echo "VENDOR_RELEASE=$VENDOR_RELEASE"
1353
1354 echo "getopt()"
1355 if $AUTORECONF_OPTION; then
1356 echo "--autoreconf"
1357 fi
1358
1359 if $CLEAN_OPTION; then
1360 echo "--clean"
1361 fi
1362
1363 if $CONFIGURE_OPTION; then
1364 echo "--configure"
1365 fi
1366
1367 if $DEBUG_OPTION; then
1368 echo "--debug"
1369 fi
1370
1371 if $PRINT_SETUP_OPTION; then
1372 echo "--print-env"
1373 fi
1374
1375 if $TARGET_OPTION; then
1376 echo "--target=$TARGET_OPTION_ARG"
1377 fi
1378
1379 if $VERBOSE_OPTION; then
1380 echo "--verbose"
1381 fi
1382
1383 if [[ -n "$MAKE" ]]; then
1384 echo "MAKE=$MAKE"
1385 fi
1386
1387 if [[ -n "$MAKE_TARGET" ]]; then
1388 echo "MAKE_TARGET=$MAKE_TARGET"
1389 fi
1390
1391 if [[ -n "$PREFIX" ]]; then
1392 echo "PREFIX=$PREFIX"
1393 fi
1394
1395 if [[ -n "$TESTS_ENVIRONMENT" ]]; then
1396 echo "TESTS_ENVIRONMENT=$TESTS_ENVIRONMENT"
1397 fi
1398
1399 if [[ -n "$VCS_CHECKOUT" ]]; then
1400 echo "VCS_CHECKOUT=$VCS_CHECKOUT"
1401 fi
1402
1403 if $VERBOSE; then
1404 echo "VERBOSE=true"
1405 fi
1406
1407 if $DEBUG; then
1408 echo "DEBUG=true"
1409 fi
1410
1411 if [[ -n "$WARNINGS" ]]; then
1412 echo "WARNINGS=$WARNINGS"
1413 fi
1414 echo '----------------------------------------------'
1415
1416 if $saved_debug_status; then
1417 enable_debug
1418 fi
1419 }
1420
1421 function make_clean_option ()
1422 {
1423 run_configure_if_required
1424
1425 make_maintainer_clean
1426
1427 if [[ "$VCS_CHECKOUT" == 'git' ]]; then
1428 run "$VCS_CHECKOUT" status --ignored
1429 elif [[ -n "$VCS_CHECKOUT" ]]; then
1430 run "$VCS_CHECKOUT" status
1431 fi
1432 }
1433
1434 function make_for_autoreconf ()
1435 {
1436 if [ -f 'Makefile' ]; then
1437 make_maintainer_clean
1438 fi
1439
1440 run_autoreconf
1441
1442 assert_no_file 'Makefile'
1443 }
1444
1445 function check_make_target()
1446 {
1447 case $1 in
1448 'self')
1449 ;;
1450 'rpm')
1451 ;;
1452 'gdb')
1453 ;;
1454 'clean_op')
1455 ;;
1456 'autoreconf')
1457 ;;
1458 'install-system')
1459 ;;
1460 'configure')
1461 ;;
1462 'distcheck')
1463 ;;
1464 'check')
1465 ;;
1466 'snapshot')
1467 ;;
1468 'mingw')
1469 ;;
1470 'universe')
1471 ;;
1472 'valgrind')
1473 ;;
1474 'jenkins')
1475 ;;
1476 'distclean')
1477 ;;
1478 'maintainer-clean')
1479 ;;
1480 'install')
1481 ;;
1482 'all')
1483 ;;
1484 'make_default')
1485 ;;
1486 'clang')
1487 ;;
1488 'clang-analyzer')
1489 ;;
1490 test-*)
1491 ;;
1492 valgrind-*)
1493 ;;
1494 gdb-*)
1495 ;;
1496 'dist')
1497 ;;
1498 *)
1499 echo "Matched default"
1500 return 1
1501 ;;
1502 esac
1503
1504 return 0
1505 }
1506
1507 function bootstrap ()
1508 {
1509 determine_target_platform
1510
1511 determine_vcs
1512
1513 # Set up whatever we need to do to use autoreconf later
1514 require_libtoolise
1515 if ! autoreconf_setup; then
1516 return 1
1517 fi
1518
1519 if [ -z "$MAKE_TARGET" ]; then
1520 MAKE_TARGET="make_default"
1521 fi
1522
1523 if $PRINT_SETUP_OPTION -o $DEBUG; then
1524 echo
1525 print_setup
1526 echo
1527
1528 # Exit if all we were looking for were the currently used options
1529 if $PRINT_SETUP_OPTION; then
1530 exit
1531 fi
1532 fi
1533
1534 # Use OLD_TESTS_ENVIRONMENT for tracking the state of the variable
1535 local OLD_TESTS_ENVIRONMENT=
1536
1537 # Set ENV PREFIX in order to set --prefix for ./configure
1538 if [[ -n "$PREFIX" ]]; then
1539 PREFIX_ARG="--prefix=$PREFIX"
1540 fi
1541
1542 # We should always have a target by this point
1543 assert MAKE_TARGET
1544
1545 local MAKE_TARGET_ARRAY=($MAKE_TARGET)
1546
1547 for target in "${MAKE_TARGET_ARRAY[@]}"
1548 do
1549 # If we are running inside of Jenkins, we want to only run some of the possible tests
1550 if $jenkins_build_environment; then
1551 check_make_target $target
1552 ret=$?
1553 if [ $ret -ne 0 ]; then
1554 die "Unknown MAKE_TARGET option: $target"
1555 fi
1556 fi
1557
1558 local snapshot_run=false
1559 local valgrind_run=false
1560
1561 case $target in
1562 'self')
1563 self_test
1564 ;;
1565 'gdb')
1566 make_gdb
1567 ;;
1568 'install-html')
1569 make_install_html
1570 ;;
1571 'clean_op')
1572 make_clean_option
1573 ;;
1574 'autoreconf')
1575 make_for_autoreconf
1576 ;;
1577 'install-system')
1578 make_install_system
1579 ;;
1580 'configure')
1581 run_configure
1582 ;;
1583 'make_default')
1584 make_default
1585 ;;
1586 'clang')
1587 if ! check_clang; then
1588 die "clang was not found"
1589 fi
1590
1591 if ! make_for_clang; then
1592 die "Failed to build clang: $?"
1593 fi
1594 ;;
1595 'clang-analyzer')
1596 if ! check_clang_analyzer; then
1597 die "clang-analyzer was not found"
1598 fi
1599 if ! check_clang; then
1600 die "clang was not found"
1601 fi
1602
1603 if ! make_for_clang_analyzer; then
1604 die "Failed to build clang-analyzer: $?"
1605 fi
1606 ;;
1607 'mingw')
1608 if ! check_mingw; then
1609 die "mingw was not found"
1610 fi
1611
1612 if ! make_for_mingw; then
1613 die "Failed to build mingw: $?"
1614 fi
1615 ;;
1616 'snapshot')
1617 make_for_snapshot
1618 snapshot_run=true
1619 check_snapshot
1620 ;;
1621 'rpm')
1622 make_rpm
1623 ;;
1624 'darwin_malloc')
1625 make_darwin_malloc
1626 ;;
1627 'valgrind')
1628 make_maintainer_clean
1629 make_valgrind
1630 ;;
1631 'universe')
1632 make_universe
1633 ;;
1634 'jenkins')
1635 make_for_continuus_integration
1636 ;;
1637 *)
1638 run_configure_if_required
1639 make_target "$target"
1640 ;;
1641 esac
1642
1643 if $jenkins_build_environment; then
1644 if ! $snapshot_run; then
1645 run_make_maintainer_clean_if_possible
1646 fi
1647 fi
1648
1649 done
1650 }
1651
1652 function main ()
1653 {
1654 # Variables we export
1655 declare -x VCS_CHECKOUT=
1656
1657 # Variables we control globally
1658 local MAKE_TARGET=
1659 local CONFIGURE=
1660
1661 # Options for getopt
1662 local AUTORECONF_OPTION=false
1663 local CLEAN_OPTION=false
1664 local CONFIGURE_OPTION=false
1665 local DEBUG_OPTION=false
1666 local PRINT_SETUP_OPTION=false
1667 local TARGET_OPTION=false
1668 local TARGET_OPTION_ARG=
1669 local VERBOSE_OPTION=false
1670
1671 local OLD_CONFIGURE=
1672 local OLD_CONFIGURE_ARG=
1673 local OLD_PREFIX=
1674 local OLD_MAKE=
1675 local OLD_TESTS_ENVIRONMENT=
1676
1677 # If we call autoreconf on the platform or not
1678 local AUTORECONF_REBUILD_HOST=false
1679 local AUTORECONF_REBUILD=false
1680
1681 local -r top_srcdir=`pwd`
1682
1683 # Default configure
1684 if [ -z "$CONFIGURE" ]; then
1685 CONFIGURE="$top_srcdir/configure"
1686 fi
1687
1688
1689 # Variables for determine_target_platform () and rebuild_host_os ()
1690 # UNAME_MACHINE_ARCH= uname -m
1691 # VENDOR= apple, redhat, centos, canonical
1692 # VENDOR_RELEASE=
1693 # RHEL{rhel,Tikanga,Santiago}
1694 # Ubuntu{ubuntu,Lucid,Maverick,Natty,Oneiric,Precise,Quantal}
1695 # Fedora{fedora,Verne,Beefy}
1696 # OSX{osx,lion,snow,mountain}
1697 # VENDOR_DISTRIBUTION= darwin,fedora,rhel,ubuntu
1698 # UNAME_KERNEL= Linux, Darwin,...
1699 # UNAME_KERNEL_RELEASE= Linux, Darwin,...
1700 local UNAME_MACHINE_ARCH=unknown
1701 local VENDOR=unknown
1702 local VENDOR_RELEASE=unknown
1703 local VENDOR_DISTRIBUTION=unknown
1704 local UNAME_KERNEL=unknown
1705 local UNAME_KERNEL_RELEASE=unknown
1706 local HOST_OS=
1707
1708 rebuild_host_os no_output
1709
1710 parse_command_line_options $@
1711
1712 # If we are running under Jenkins we predetermine what tests we will run against
1713 # This MAKE_TARGET can be overridden by parse_command_line_options based MAKE_TARGET changes.
1714 # We don't want Jenkins overriding other variables, so we NULL them.
1715 if [ -z "$MAKE_TARGET" ]; then
1716 if $jenkins_build_environment; then
1717 if [[ -n "$LABEL" ]]; then
1718 check_make_target $LABEL
1719 if [ $? -eq 0 ]; then
1720 MAKE_TARGET="$LABEL"
1721 fi
1722 fi
1723
1724 if [ -z "$MAKE_TARGET" ]; then
1725 MAKE_TARGET='jenkins'
1726 fi
1727 fi
1728 fi
1729
1730 bootstrap
1731
1732 jobs -l
1733 wait
1734
1735 exit 0
1736 }
1737
1738 function set_branch ()
1739 {
1740 if [ -z "$BRANCH" ]; then
1741 if [ -z "$CI_PROJECT_TEAM" ]; then
1742 die "Variable CI_PROJECT_TEAM has not been set"
1743 fi
1744 if [ -z "$PROJECT" ]; then
1745 die "Variable PROJECT has not been set"
1746 fi
1747 if [ -z "$BUILD_TAG" ]; then
1748 die "Variable BUILD_TAG has not been set"
1749 fi
1750
1751 BRANCH="lp:~$CI_PROJECT_TEAM/$PROJECT/$BUILD_TAG"
1752 export BRANCH
1753 fi
1754
1755 if [ -z "$BRANCH" ]; then
1756 die "Missing values required to build BRANCH variable."
1757 fi
1758 }
1759
1760 function merge ()
1761 {
1762 if [ -z "$VCS_CHECKOUT" ]; then
1763 die "Merges require VCS_CHECKOUT."
1764 fi
1765
1766 set_branch
1767
1768 if [[ "$VCS_CHECKOUT" == 'bzr' ]]; then
1769 if test -n "$BRANCH_TO_MERGE"; then
1770 bzr merge $BRANCH_TO_MERGE
1771 bzr commit --message="Merge $BRANCH_TO_MERGE Build: $BUILD_TAG" --unchanged
1772 fi
1773
1774 bzr push "$BRANCH"
1775 elif [[ -n "$VCS_CHECKOUT" ]]; then
1776 die "Merge attempt occured, current VCS setup does not support this"
1777 fi
1778 }
1779
1780 function enable_debug ()
1781 {
1782 if ! $DEBUG; then
1783 local caller_loc=`caller`
1784 if [ -n $1 ]; then
1785 echo "$caller_loc Enabling debug: $1"
1786 else
1787 echo "$caller_loc Enabling debug"
1788 fi
1789 set -x
1790 DEBUG=true
1791 fi
1792 }
1793
1794 function usage ()
1795 {
1796 cat << EOF
1797 Usage: $program_name [OPTION]..
1798
1799 Bootstrap this package from the checked-out sources, and optionally walk through CI run.
1800
1801 Options:
1802
1803 EOF
1804 }
1805
1806 function disable_debug ()
1807 {
1808 set +x
1809 DEBUG=true
1810 }
1811
1812 # Script begins here
1813
1814 program_name=$0
1815
1816 env_debug_enabled=false
1817 if [[ -n "$JENKINS_HOME" ]]; then
1818 declare -r jenkins_build_environment=true
1819 else
1820 declare -r jenkins_build_environment=false
1821 fi
1822
1823 export ACLOCAL
1824 export AUTOCONF
1825 export AUTOHEADER
1826 export AUTOM4TE
1827 export AUTOMAKE
1828 export AUTORECONF
1829 export CONFIGURE_ARG
1830 export DEBUG
1831 export GNU_BUILD_FLAGS
1832 export LIBTOOLIZE
1833 export LIBTOOLIZE_OPTIONS
1834 export MAKE
1835 export PREFIX_ARG
1836 export TESTS_ENVIRONMENT
1837 export VERBOSE
1838 export WARNINGS
1839
1840 case $OSTYPE in
1841 darwin*)
1842 export MallocGuardEdges
1843 export MallocErrorAbort
1844 export MallocScribble
1845 ;;
1846 esac
1847
1848 # We check for DEBUG twice, once before we source the config file, and once afterward
1849 env_debug_enabled=false
1850 if [[ -n "$DEBUG" ]]; then
1851 env_debug_enabled=true
1852 enable_debug
1853 print_setup
1854 fi
1855
1856 # Variables which only can be set by .bootstrap
1857 BOOTSTRAP_SNAPSHOT=false
1858 BOOTSTRAP_SNAPSHOT_CHECK=
1859
1860 if [ -f '.bootstrap' ]; then
1861 source '.bootstrap'
1862 fi
1863
1864 if $env_debug_enabled; then
1865 enable_debug
1866 else
1867 if [[ -n "$DEBUG" ]]; then
1868 enable_debug "Enabling DEBUG from '.bootstrap'"
1869 print_setup
1870 fi
1871 fi
1872
1873 # We do this in order to protect the case where DEBUG
1874 if ! $env_debug_enabled; then
1875 DEBUG=false
1876 fi
1877
1878 main $@