1# set -x
2
3# Install the perl and its libraries anywhere:
4case "$userelocatableinc" in
5'') userelocatableinc='define' ;;
6esac
7
8# The Android linker has some unusual behavior: No matter what
9# path is passed in to dlopen(), it'll only use the path's
10# basename when trying to find a cached library.
11# Unfortunately, this is quite problematic for us, since for example,
12# Hash::Util and List::Util both end up creating a Util.so --
13# So if you load List::Util and then Hash::Util, the dlopen() for
14# the latter will return the handle for the former.
15# See the implementation for details:
16# https://code.google.com/p/android-source-browsing/source/browse/linker/linker.c?repo=platform--bionic&r=9ec0f03a0d0b17bbb94ac0b9fef6add28a133c3a#1231
17# What d_libname_unique does is inform MakeMaker that, rather than
18# creating Hash/Util/Util.so, it needs to make Hash/Util/Perl_Hash_Util.so
19d_libname_unique='define'
20
21# On Android the shell is /system/bin/sh:
22targetsh='/system/bin/sh'
23case "$usecrosscompile" in
24define) ;;
25   # If we aren't cross-compiling, then sh should also point
26   # to /system/bin/sh.
27*) sh=$targetsh ;;
28esac
29
30# Make sure that we look for libm
31libswanted="$libswanted m"
32
33# Down with locales!
34# https://github.com/android/platform_bionic/blob/master/libc/CAVEATS
35d_locconv='undef'
36d_setlocale='undef'
37d_setlocale_r='undef'
38d_lc_monetary_2008='undef'
39i_locale='undef'
40
41# https://code.google.com/p/android-source-browsing/source/browse/libc/netbsd/net/getservent_r.c?repo=platform--bionic&r=ca6fe7bebe3cc6ed7e2db5a3ede2de0fcddf411d#95
42d_getservent_r='undef'
43
44# Bionic defines several stubs that just warn and return NULL
45# https://gitorious.org/0xdroid/bionic/blobs/70b2ef0ec89a9c9d4c2d4bcab728a0e72bafb18e/libc/bionic/stubs.c
46# https://android.googlesource.com/platform/bionic/+/master/libc/bionic/stubs.cpp
47
48# If they warn with 'FIX' or 'Android', assume they are the stubs
49# we want to avoid.
50
51# These are all stubs as well, but the core doesn't use them:
52# getusershell setusershell endusershell
53
54# This script UU/archname.cbu will get 'called-back' by Configure.
55$cat > UU/archname.cbu <<'EOCBU'
56# egrep pattern to detect a stub warning on Android.
57# Right now we're checking for:
58# Android 2.x: FIX ME! implement FUNC
59# Android 4.x: FUNC is not implemented on Android
60android_stub='FIX|Android'
61
62$cat > try.c << 'EOM'
63#include <netdb.h>
64int main() { (void) getnetbyname("foo"); return(0); }
65EOM
66$cc $ccflags try.c -o try
67android_warn=`$run ./try 2>&1 | $egrep "$android_stub"`
68if test "X$android_warn" != X; then
69   d_getnbyname="$undef"
70fi
71
72$cat > try.c << 'EOM'
73#include <netdb.h>
74int main() { (void) getnetbyaddr((uint32_t)1, AF_INET); return(0); }
75EOM
76$cc $ccflags try.c -o try
77android_warn=`$run ./try 2>&1 | $egrep "$android_stub"`
78if test "X$android_warn" != X; then
79   d_getnbyaddr="$undef"
80fi
81
82$cat > try.c << 'EOM'
83#include <stdio.h>
84#include <mntent.h>
85#include <unistd.h>
86int main() { (void) getmntent(stdout); return(0); }
87EOM
88$cc $ccflags try.c -o try
89android_warn=`$run ./try 2>&1 | $egrep "$android_stub"`
90if test "X$android_warn" != X; then
91   d_getmntent="$undef"
92fi
93
94$cat > try.c << 'EOM'
95#include <netdb.h>
96int main() { (void) getprotobyname("foo"); return(0); }
97EOM
98$cc $ccflags try.c -o try
99android_warn=`$run ./try 2>&1 | $egrep "$android_stub"`
100if test "X$android_warn" != X; then
101   d_getpbyname="$undef"
102fi
103
104$cat > try.c << 'EOM'
105#include <netdb.h>
106int main() { (void) getprotobynumber(1); return(0); }
107EOM
108$cc $ccflags try.c -o try
109android_warn=`$run ./try 2>&1 | $egrep "$android_stub"`
110if test "X$android_warn" != X; then
111   d_getpbynumber="$undef"
112fi
113
114$cat > try.c << 'EOM'
115#include <sys/types.h>
116#include <pwd.h>
117int main() { endpwent(); return(0); }
118EOM
119$cc $ccflags try.c -o try
120android_warn=`$run ./try 2>&1 | $egrep "$android_stub"`
121if test "X$android_warn" != X; then
122   d_endpwent="$undef"
123fi
124
125$cat > try.c << 'EOM'
126#include <unistd.h>
127int main() { (void) ttyname(STDIN_FILENO); return(0); }
128EOM
129$cc $ccflags try.c -o try
130android_warn=`$run ./try 2>&1 | $egrep "$android_stub"`
131if test "X$android_warn" != X; then
132   d_ttyname="$undef"
133fi
134
135EOCBU
136
137if $test "X$targetrun" = "Xadb"; then
138
139$rm $run $to $from $targetmkdir
140
141case "$src" in
142    /*) run=$src/Cross/run
143            targetmkdir=$src/Cross/mkdir
144            to=$src/Cross/to
145            from=$src/Cross/from
146            ;;
147    *)  pwd=`test -f ../Configure && cd ..; pwd`
148            run=$pwd/Cross/run
149            targetmkdir=$pwd/Cross/mkdir
150            to=$pwd/Cross/to
151            from=$pwd/Cross/from
152               ;;
153esac
154
155targetrun=adb-shell
156targetto=adb-push
157targetfrom=adb-pull
158run=$run-$targetrun
159to=$to-$targetto
160from=$from-$targetfrom
161
162$cat >$run <<EOF
163#!/bin/sh
164doexit="echo \\\$? >$targetdir/output.status"
165env=''
166case "\$1" in
167-cwd)
168  shift
169  cwd=\$1
170  shift
171  ;;
172esac
173case "\$1" in
174-env)
175  shift
176  env=\$1
177  shift
178  ;;
179esac
180case "\$cwd" in
181'') cwd=$targetdir ;;
182esac
183case "\$env" in
184'') env="echo "
185esac
186exe=\$1
187shift
188args=\$@
189$to \$exe > /dev/null 2>&1
190
191# send copy results to /dev/null as otherwise it outputs speed stats which gets in our way.
192# sometimes there is no $?, I dunno why? we then get Cross/run-adb-shell: line 39: exit: XX: numeric argument required
193adb -s $targethost shell "sh -c '(cd \$cwd && \$env ; \$exe \$args > $targetdir/output.stdout 2>$targetdir/output.stderr) ; \$doexit '" > /dev/null
194
195rm output.stdout output.stderr output.status 2>/dev/null
196
197$from output.stdout
198$from output.stderr
199$from output.status
200
201# We get back Ok\r\n on android for some reason, grrr:
202$cat output.stdout | $tr -d '\r'
203if test -s output.stderr; then
204    $cat output.stderr | $tr -d '\r' >&2
205fi
206
207result_status=\`$cat output.status | $tr -d '\r'\`
208
209rm output.stdout output.stderr output.status
210
211# Also, adb doesn't exit with the commands exit code, like ssh does, double-grr
212exit \$result_status
213
214EOF
215$chmod a+rx $run
216
217$cat >$targetmkdir <<EOF
218#!/bin/sh
219adb -s $targethost shell "mkdir -p \$@"
220EOF
221$chmod a+rx $targetmkdir
222
223$cat >$to <<EOF
224#!/bin/sh
225for f in \$@
226do
227  case "\$f" in
228  /*)
229    adb -s $targethost push \$f \$f            || exit 1
230    ;;
231  *)
232    (adb -s $targethost push \$f $targetdir/\$f < /dev/null 2>&1) || exit 1
233    ;;
234  esac
235done
236exit 0
237EOF
238$chmod a+rx $to
239
240$cat >$from <<EOF
241#!/bin/sh
242for f in \$@
243do
244  $rm -f \$f
245  (adb -s $targethost pull $targetdir/\$f . > /dev/null 2>&1) || exit 1
246done
247exit 0
248EOF
249$chmod a+rx $from
250
251fi # Cross-compiling with adb
252
253case "$usecrosscompile" in
254define)
255# The tests for this in Configure doesn't play nicely with
256# cross-compiling
257d_procselfexe="define"
258if $test "X$hostosname" = "Xdarwin"; then
259  firstmakefile=GNUmakefile;
260fi
261
262# When cross-compiling, full_csh and d_csh will get the
263# host's values, which is all sorts of wrong.  So unless
264# full_csh has been set on the command line, set d_csh to
265# undef.
266case "$full_csh" in
267'') d_csh="$undef"
268;;
269esac
270
271;;
272*)
273ldflags="$ldflags -L/system/lib"
274;;
275esac
276
277osvers="`$run getprop ro.build.version.release`"
278
279# We want osname to be linux-android during Configure,
280# but plain 'android' afterwards.
281case "$src" in
282    /*) pwd="$src";;
283    *)  pwd=`test -f ../Configure && cd ..; pwd`
284        ;;
285esac
286
287$cat <<'EOO' >> $pwd/config.arch
288
289osname='android'
290eval "libpth='$libpth /system/lib /vendor/lib'"
291
292if $test "X$procselfexe" = X; then
293    case "$d_procselfexe" in
294        define) procselfexe='"/proc/self/exe"';;
295    esac
296fi
297EOO
298
299# Android is a linux variant, so run those hints.
300. ./hints/linux.sh
301