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