Update
[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 bootstrap() {
285 determine_target_platform
286
287 if [ -d .git ]; then
288 AUTORECONF_FLAGS="--install --force --verbose -Wall -Werror"
289 VCS_CHECKOUT=git
290 elif [ -d .bzr ]; then
291 AUTORECONF_FLAGS="--install --force --verbose -Wall -Werror"
292 VCS_CHECKOUT=bzr
293 elif [ -d .svn ]; then
294 AUTORECONF_FLAGS="--install --force --verbose -Wall -Werror"
295 VCS_CHECKOUT=svn
296 elif [ -d .hg ]; then
297 AUTORECONF_FLAGS="--install --force --verbose -Wall -Werror"
298 VCS_CHECKOUT=hg
299 else
300 AUTORECONF_FLAGS="--install --force --verbose -Wall"
301 fi
302
303 if [ -z "$LIBTOOLIZE_FLAGS" ]; then
304 LIBTOOLIZE_FLAGS="--force --verbose"
305 fi
306
307 if [ "$PLATFORM" = "darwin" ]; then
308 LIBTOOLIZE=glibtoolize
309 elif [ -z "$LIBTOOLIZE" ]; then
310 LIBTOOLIZE=libtoolize
311 fi
312
313 AUTORECONF=autoreconf
314
315 # Set ENV DEBUG in order to enable debugging
316 if [ -n "$DEBUG" ]; then
317 DEBUG_ARG="--enable-debug"
318 fi
319
320 # Set ENV ASSERT in order to enable assert
321 if [ -n "$ASSERT" ]; then
322 ASSERT_ARG="--enable-assert"
323 fi
324
325 # Set ENV MAKE in order to override "make"
326 if [ -z "$MAKE" ]; then
327 MAKE="make"
328 fi
329
330 # Set ENV MAKE_J in order to override "-j2"
331 if [ -z "$MAKE_J" ]; then
332 MAKE_J="-j2"
333 fi
334
335 # Set ENV PREFIX in order to set --prefix for ./configure
336 if [ -n "$PREFIX" ]; then
337 PREFIX_ARG="--prefix=$PREFIX"
338 fi
339
340 if [ -f Makefile ]; then
341 $MAKE $MAKE_J maintainer-clean
342 fi
343
344 run $LIBTOOLIZE $LIBTOOLIZE_FLAGS || die "Cannot execute $LIBTOOLIZE $LIBTOOLIZE_FLAGS"
345 run $AUTORECONF $AUTORECONF_FLAGS || die "Cannot execute $AUTORECONF $AUTORECONF_FLAGS"
346
347 configure_target_platform
348
349 # Backwards compatibility
350 if [ -n "$VALGRIND" ]; then
351 MAKE_TARGET="valgrind"
352 fi
353
354 # Setup LIBTOOL_COMMAND if we need it
355 if [[ -f libtool ]]; then
356 LIBTOOL_COMMAND="./libtool --mode=execute"
357 fi
358
359 if [ -f docs/conf.py ]; then
360 if command_exists sphinx-build; then
361 make_target "man"
362 fi
363 fi
364
365 # If we are running under Jenkins we predetermine what tests we will run against
366 if [[ -n "$JENKINS_HOME" ]]; then
367 make_target_platform
368 elif [ "$MAKE_TARGET" == "gdb" ]; then
369 make_gdb
370 elif [ "$MAKE_TARGET" == "valgrind" ]; then
371 make_valgrind
372 elif [ "$MAKE_TARGET" == "jenkins" ]; then
373 # Set ENV MAKE_TARGET in order to override default of "all"
374 make_target_platform
375 elif [ -z "$MAKE_TARGET" ]; then
376 make_local
377 else
378 make_target $MAKE_TARGET
379 fi
380 }
381
382 export -n VCS_CHECKOUT
383 export -n PLATFORM
384 export -n TARGET_PLATFORM
385 VCS_CHECKOUT=
386 PLATFORM=unknown
387 TARGET_PLATFORM=unknown
388
389 bootstrap