Merge lp:~tangent-org/libmemcached/1.0-build Build: jenkins-Libmemcached-1.0-57
[awesomized/libmemcached] / bootstrap.sh
1 #!/bin/bash
2 #
3 # Copyright (C) 2012 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 die() { echo "$@"; exit 1; }
35
36 command_exists () {
37 type "$1" &> /dev/null ;
38 }
39
40 determine_target_platform () {
41 if [ $(uname) = "Darwin" ]; then
42 PLATFORM="darwin"
43 elif [[ -f "/etc/fedora-release" ]]; then
44 PLATFORM="fedora"
45 elif [[ -f "/etc/lsb-release" ]]; then
46 debian_version=`cat /etc/lsb-release | grep DISTRIB_CODENAME | awk -F= ' { print $2 } '`
47 case $debian_version in
48 precise)
49 PLATFORM="precise"
50 ;;
51 *)
52 ;;
53 esac
54 fi
55
56 PLATFORM_VERSION=`uname -r`
57
58 if [ "$PLATFORM" == "unknown" ]; then
59 PLATFORM=`uname -s`
60 fi
61
62 TARGET_PLATFORM="$PLATFORM-$PLATFORM_VERSION"
63 }
64
65 configure_target_platform () {
66 # If we are executing on OSX use CLANG, otherwise only use it if we find it in the ENV
67 case $TARGET_PLATFORM in
68 darwin-*)
69 CC=clang CXX=clang++ ./configure $DEBUG_ARG $ASSERT_ARG $PREFIX_ARG || die "Cannot execute CC=clang CXX=clang++ configure $DEBUG_ARG $ASSERT_ARG $PREFIX_ARG"
70 ;;
71 *)
72 ./configure $DEBUG_ARG $ASSERT_ARG $PREFIX_ARG || die "Cannot execute configure $DEBUG_ARG $ASSERT_ARG $PREFIX_ARG"
73 ;;
74 esac
75 }
76
77 setup_gdb_command () {
78 GDB_TMPFILE=$(mktemp /tmp/gdb.XXXXXXXXXX)
79 echo "set logging on" > $GDB_TMPFILE
80 echo "set logging overwrite on" >> $GDB_TMPFILE
81 echo "set environment LIBTEST_IN_GDB=1" >> $GDB_TMPFILE
82 echo "run" >> $GDB_TMPFILE
83 echo "thread apply all bt" >> $GDB_TMPFILE
84 echo "quit" >> $GDB_TMPFILE
85 GDB_COMMAND="gdb -f -batch -x $GDB_TMPFILE"
86 }
87
88 setup_valgrind_command () {
89 VALGRIND_COMMAND="valgrind --error-exitcode=1 --leak-check=yes --show-reachable=yes --track-fds=yes --malloc-fill=A5 --free-fill=DE"
90 }
91
92 make_valgrind () {
93 if [ "$PLATFORM" = "darwin" ]; then
94 make_darwin_malloc
95 else
96 if command_exists valgrind; then
97
98 if [ -n "$TESTS_ENVIRONMENT" ]; then
99 OLD_TESTS_ENVIRONMENT=$TESTS_ENVIRONMENT
100 export -n TESTS_ENVIRONMENT
101 fi
102
103 # Set ENV VALGRIND_COMMAND
104 if [ -z "$VALGRIND_COMMAND" ]; then
105 setup_valgrind_command
106 fi
107
108 if [[ -f libtool ]]; then
109 TESTS_ENVIRONMENT="$LIBTOOL_COMMAND $VALGRIND_COMMAND"
110 else
111 TESTS_ENVIRONMENT="$VALGRIND_COMMAND"
112 fi
113 export TESTS_ENVIRONMENT
114
115 export TESTS_ENVIRONMENT
116 make_target check
117 export -n TESTS_ENVIRONMENT
118
119 if [ -n "$OLD_TESTS_ENVIRONMENT" ]; then
120 TESTS_ENVIRONMENT=$OLD_TESTS_ENVIRONMENT
121 export TESTS_ENVIRONMENT
122 fi
123
124 fi
125 fi
126 }
127
128 make_install_system () {
129 make_distclean
130
131 INSTALL_LOCATION=$(mktemp -d /tmp/XXXXXXXXXX)
132 PREFIX_ARG="--prefix=$INSTALL_LOCATION"
133
134 configure_target_platform
135
136 if [ -n "$TESTS_ENVIRONMENT" ]; then
137 OLD_TESTS_ENVIRONMENT=$TESTS_ENVIRONMENT
138 export -n TESTS_ENVIRONMENT
139 fi
140
141 make_target all
142
143 make_target "install"
144
145 make_target "installcheck"
146
147 make_target "uninstall"
148
149 export -n TESTS_ENVIRONMENT
150
151 if [ -n "$OLD_TESTS_ENVIRONMENT" ]; then
152 TESTS_ENVIRONMENT=$OLD_TESTS_ENVIRONMENT
153 export TESTS_ENVIRONMENT
154 fi
155
156 rm -r -f $INSTALL_LOCATION
157 }
158
159 make_darwin_malloc () {
160 MallocGuardEdges=1
161 MallocErrorAbort=1
162 MallocScribble=1
163 export MallocGuardEdges MallocErrorAbort MallocScribble
164 make_check
165 export -n MallocGuardEdges MallocErrorAbort MallocScribble
166 }
167
168 make_local () {
169 case $TARGET_PLATFORM in
170 darwin-*)
171 make_distcheck
172 make_valgrind
173 ;;
174 *)
175 make_target_platform
176 ;;
177 esac
178 }
179
180 make_target_platform () {
181 case $TARGET_PLATFORM in
182 fedora-*)
183 # make rpm includes "make distcheck"
184 if [ -f rpm.am ]; then
185 make_rpm
186 else
187 make_distcheck
188 fi
189 ;;
190 precise-*)
191 make_distcheck
192 make_valgrind
193 make_gdb
194 ;;
195 unknown-*)
196 make_all
197 ;;
198 *)
199 make_all
200 ;;
201 esac
202
203 make_install_system
204
205 make_distclean
206 }
207
208 make_gdb () {
209 if command_exists gdb; then
210
211 if [ -n "$TESTS_ENVIRONMENT" ]; then
212 OLD_TESTS_ENVIRONMENT=$TESTS_ENVIRONMENT
213 export -n TESTS_ENVIRONMENT
214 fi
215
216 # Set ENV GDB_COMMAND
217 if [ -z "$GDB_COMMAND" ]; then
218 setup_gdb_command
219 fi
220
221 if [[ -f libtool ]]; then
222 TESTS_ENVIRONMENT="$LIBTOOL_COMMAND $GDB_COMMAND"
223 else
224 TESTS_ENVIRONMENT="$GDB_COMMAND"
225 fi
226
227 export TESTS_ENVIRONMENT
228 make_target check
229 export -n TESTS_ENVIRONMENT
230
231 MAKE_TARGET=
232 if [[ -f gdb.txt ]]; then
233 rm -f gdb.txt
234 fi
235
236 if [ -n "$OLD_TESTS_ENVIRONMENT" ]; then
237 TESTS_ENVIRONMENT=$OLD_TESTS_ENVIRONMENT
238 export TESTS_ENVIRONMENT
239 fi
240 fi
241 }
242
243 make_target () {
244 if [ -n "$MAKE_TARGET" ]; then
245 OLD_MAKE_TARGET=$MAKE_TARGET
246 fi
247
248 MAKE_TARGET=$1
249 run $MAKE $MAKE_J $MAKE_TARGET || die "Cannot execute $MAKE $MAKE_TARGET"
250
251 if [ -n "$MAKE_TARGET" ]; then
252 MAKE_TARGET=$OLD_MAKE_TARGET
253 fi
254 }
255
256 make_distcheck () {
257 make_target distcheck
258 }
259
260 make_rpm () {
261 make_target "rpm"
262 }
263
264 make_distclean () {
265 make_target distclean
266 }
267
268 make_check () {
269 make_target check
270 }
271
272 make_all () {
273 make_target all
274 }
275
276 run() {
277 if [ -n "$TESTS_ENVIRONMENT" ]; then
278 echo "TESTS_ENVIRONMENT=$TESTS_ENVIRONMENT"
279 fi
280 echo "\`$@' $ARGS"
281 $@ $ARGS
282 }
283
284 parse_command_line_options() {
285
286 if ! options=$(getopt -o c --long configure -n 'bootstrap' -- "$@"); then
287 exit 1
288 fi
289
290 eval set -- "$options"
291
292 while [ $# -gt 0 ]; do
293 case $1 in
294 -c | --configure )
295 CONFIGURE_OPTION="yes" ; shift;;
296 -- )
297 shift; break;;
298 -* )
299 echo "$0: error - unrecognized option $1" 1>&2; exit 1;;
300 *)
301 break;;
302 esac
303 done
304 }
305
306
307
308 bootstrap() {
309 parse_command_line_options $@
310 determine_target_platform
311
312 DEFAULT_DEV_AUTORECONF_FLAGS="--install --force --verbose -Wall -Werror"
313 DEFAULT_AUTORECONF_FLAGS="--install --force --verbose -Wall"
314
315 if [ -d .git ]; then
316 AUTORECONF_FLAGS=$DEFAULT_DEV_AUTORECONF_FLAGS
317 VCS_CHECKOUT=git
318 elif [ -d .bzr ]; then
319 AUTORECONF_FLAGS=$DEFAULT_DEV_AUTORECONF_FLAGS
320 VCS_CHECKOUT=bzr
321 elif [ -d .svn ]; then
322 AUTORECONF_FLAGS=$DEFAULT_DEV_AUTORECONF_FLAGS
323 VCS_CHECKOUT=svn
324 elif [ -d .hg ]; then
325 AUTORECONF_FLAGS=$DEFAULT_DEV_AUTORECONF_FLAGS
326 VCS_CHECKOUT=hg
327 else
328 AUTORECONF_FLAGS=$DEFAULT_AUTORECONF_FLAGS
329 fi
330
331 if [ -z "$LIBTOOLIZE_FLAGS" ]; then
332 LIBTOOLIZE_FLAGS="--force --verbose --install"
333 fi
334
335 if [ "$PLATFORM" = "darwin" ]; then
336 LIBTOOLIZE=glibtoolize
337 elif [ -z "$LIBTOOLIZE" ]; then
338 LIBTOOLIZE=libtoolize
339 fi
340
341 AUTORECONF=autoreconf
342
343 # Set ENV DEBUG in order to enable debugging
344 if [ -n "$DEBUG" ]; then
345 DEBUG_ARG="--enable-debug"
346 fi
347
348 # Set ENV ASSERT in order to enable assert
349 if [ -n "$ASSERT" ]; then
350 ASSERT_ARG="--enable-assert"
351 fi
352
353 # Set ENV MAKE in order to override "make"
354 if [ -z "$MAKE" ]; then
355 MAKE="make"
356 fi
357
358 # Set ENV MAKE_J in order to override "-j2"
359 if [ -z "$MAKE_J" ]; then
360 MAKE_J="-j2"
361 fi
362
363 # Set ENV PREFIX in order to set --prefix for ./configure
364 if [ -n "$PREFIX" ]; then
365 PREFIX_ARG="--prefix=$PREFIX"
366 fi
367
368 if [ -f Makefile ]; then
369 $MAKE $MAKE_J maintainer-clean
370 fi
371
372 run $LIBTOOLIZE $LIBTOOLIZE_FLAGS || die "Cannot execute $LIBTOOLIZE $LIBTOOLIZE_FLAGS"
373 run $AUTORECONF $AUTORECONF_FLAGS || die "Cannot execute $AUTORECONF $AUTORECONF_FLAGS"
374
375 configure_target_platform
376
377 if [ "$CONFIGURE_OPTION" == "yes" ]; then
378 exit
379 fi
380
381 # Backwards compatibility
382 if [ -n "$VALGRIND" ]; then
383 MAKE_TARGET="valgrind"
384 fi
385
386 # Setup LIBTOOL_COMMAND if we need it
387 if [[ -f libtool ]]; then
388 LIBTOOL_COMMAND="./libtool --mode=execute"
389 fi
390
391 if [ -f docs/conf.py ]; then
392 if command_exists sphinx-build; then
393 make_target "man"
394 fi
395 fi
396
397 # If we are running under Jenkins we predetermine what tests we will run against
398 if [[ -n "$JENKINS_HOME" ]]; then
399 make_target_platform
400 elif [ "$MAKE_TARGET" == "gdb" ]; then
401 make_gdb
402 elif [ "$MAKE_TARGET" == "valgrind" ]; then
403 make_valgrind
404 elif [ "$MAKE_TARGET" == "jenkins" ]; then
405 # Set ENV MAKE_TARGET in order to override default of "all"
406 make_target_platform
407 elif [ -z "$MAKE_TARGET" ]; then
408 make_local
409 else
410 make_target $MAKE_TARGET
411 fi
412 }
413
414 export -n VCS_CHECKOUT
415 export -n PLATFORM
416 export -n TARGET_PLATFORM
417 CONFIGURE_OPTION=no
418 VCS_CHECKOUT=
419 PLATFORM=unknown
420 TARGET_PLATFORM=unknown
421
422 bootstrap $@