buildlib: supply -fPIC or -fpic if supported
[blocksruntime.git] / buildlib
blob5106ebe56a4b79eb4211748212b906086105c816
1 #!/bin/sh
3 case "$1" in -h|-H|-help|--help)
4 cat <<EOT
5 Usage: ${0##*/} [-shared]
6 -shared also attempt to build a shared library
7 Env: CC explicit "cc" compiler to use
8 AR explicit "ar" to use
9 RANLIB explicit "ranlib" to use
10 CFLAGS explicit compiler options to use
11 FPIC explicit -fPIC/-fpic (or none) option to use
12 EOT
13 exit 0
14 esac
16 set -e
18 LIB=libBlocksRuntime.a
19 SRC=BlocksRuntime
21 shared=
22 [ z"$1" != z"-shared" -a z"$1" != z"--shared" ] || shared=1
24 if [ -n "$shared" ]; then
25 UNAME_S="$(uname -s 2>/dev/null)" || :
26 case "$UNAME_S" in
27 Darwin)
28 SHLIB="${LIB%.a}.dylib"
29 SHOPT="-dynamiclib -Wl,-all_load"
30 SHOPT2=
33 SHLIB="${LIB%.a}.so"
34 SHOPT="-shared -Wl,-whole-archive"
35 SHOPT2="-Wl,-no-whole-archive"
37 esac
40 if [ -z "$CC" ]; then
41 if command -v gcc > /dev/null; then
42 CC=gcc
43 elif command -v clang > /dev/null; then
44 CC=clang
45 elif command -v cc > /dev/null; then
46 CC=cc
47 else
48 echo "Could not guess name of compiler, please set CC" >&2
49 exit 2
53 echo "CC=$CC"
54 : ${AR:=ar}
55 echo "AR=$AR"
56 : ${RANLIB:=ranlib}
57 echo "RANLIB=$RANLIB"
59 if [ "${CFLAGS+set}" != "set" ]; then
60 case "$CC" in
61 *gcc*|*clang*)
62 CFLAGS=-O2
65 CFLAGS=-O
67 esac
70 has_cc_opt()
72 "$CC" "$1" -o /tmp/cc.$$ -c -x c /dev/null >/dev/null 2>&1 &&
73 rm -f /tmp/cc.$$
75 if [ "${FPIC+set}" != "set" ]; then
76 if has_cc_opt "-fPIC"; then
77 FPIC="-fPIC"
78 elif has_cc_opt "-fpic"; then
79 FPIC="-fpic"
82 [ -z "$FPIC" ] || echo "FPIC=$FPIC"
84 echo "CFLAGS=$CFLAGS"
86 echo "LIB=$LIB"
87 [ -z "$shared" ] || echo "SHLIB=$SHLIB"
88 [ -z "$shared" ] || echo "SHOPT=$SHOPT"
89 [ -z "$shared" ] || [ -z "$SHOPT2" ] || echo "SHOPT2=$SHOPT2"
90 echo "SRC=$SRC"
93 PS4= && set -ex
94 ! test -e $LIB || rm $LIB
95 ) || exit
96 [ -z "$shared" ] ||
98 PS4= && set -ex
99 ! test -e $SHLIB || rm $SHLIB
100 ) || exit
102 PS4= && set -ex
103 "$CC" -c $FPIC $CFLAGS -o $SRC/data.o $SRC/data.c &&
104 "$CC" -c $FPIC $CFLAGS -o $SRC/runtime.o -I . $SRC/runtime.c &&
105 "$AR" cr $LIB $SRC/data.o $SRC/runtime.o &&
106 "$RANLIB" $LIB
107 ) || exit
108 [ -z "$shared" ] ||
110 PS4= && set -ex
111 "$CC" $FPIC $CFLAGS -o "$SHLIB" $SHOPT $LIB $SHOPT2
112 ) || exit