xref: /openbsd-src/gnu/usr.bin/perl/hints/linux-android.sh (revision 56d68f1e19ff848c889ecfa71d3a06340ff64892)
16fb12b70Safresh1# set -x
26fb12b70Safresh1
36fb12b70Safresh1# Install the perl and its libraries anywhere:
46fb12b70Safresh1case "$userelocatableinc" in
56fb12b70Safresh1'') userelocatableinc='define' ;;
66fb12b70Safresh1esac
76fb12b70Safresh1
86fb12b70Safresh1# The Android linker has some unusual behavior: No matter what
96fb12b70Safresh1# path is passed in to dlopen(), it'll only use the path's
106fb12b70Safresh1# basename when trying to find a cached library.
116fb12b70Safresh1# Unfortunately, this is quite problematic for us, since for example,
126fb12b70Safresh1# Hash::Util and List::Util both end up creating a Util.so --
136fb12b70Safresh1# So if you load List::Util and then Hash::Util, the dlopen() for
146fb12b70Safresh1# the latter will return the handle for the former.
156fb12b70Safresh1# See the implementation for details:
166fb12b70Safresh1# https://code.google.com/p/android-source-browsing/source/browse/linker/linker.c?repo=platform--bionic&r=9ec0f03a0d0b17bbb94ac0b9fef6add28a133c3a#1231
176fb12b70Safresh1# What d_libname_unique does is inform MakeMaker that, rather than
186fb12b70Safresh1# creating Hash/Util/Util.so, it needs to make Hash/Util/Perl_Hash_Util.so
196fb12b70Safresh1d_libname_unique='define'
206fb12b70Safresh1
216fb12b70Safresh1# On Android the shell is /system/bin/sh:
226fb12b70Safresh1targetsh='/system/bin/sh'
236fb12b70Safresh1case "$usecrosscompile" in
246fb12b70Safresh1define) ;;
256fb12b70Safresh1   # If we aren't cross-compiling, then sh should also point
266fb12b70Safresh1   # to /system/bin/sh.
276fb12b70Safresh1*) sh=$targetsh ;;
286fb12b70Safresh1esac
296fb12b70Safresh1
306fb12b70Safresh1# Make sure that we look for libm
31*56d68f1eSafresh1libswanted="$libswanted m log"
326fb12b70Safresh1
33*56d68f1eSafresh1# Older Androids lack locale support and may need the following undefs
34*56d68f1eSafresh1# uncommenting. This isn't necessary from at least Android 8.1 (Oreo)
356fb12b70Safresh1# https://github.com/android/platform_bionic/blob/master/libc/CAVEATS
36*56d68f1eSafresh1#d_locconv='undef'
37*56d68f1eSafresh1#d_setlocale='undef'
38*56d68f1eSafresh1#d_setlocale_r='undef'
39*56d68f1eSafresh1#d_lc_monetary_2008='undef'
40*56d68f1eSafresh1#i_locale='undef'
41*56d68f1eSafresh1#d_newlocale='undef'
426fb12b70Safresh1
436fb12b70Safresh1# https://code.google.com/p/android-source-browsing/source/browse/libc/netbsd/net/getservent_r.c?repo=platform--bionic&r=ca6fe7bebe3cc6ed7e2db5a3ede2de0fcddf411d#95
446fb12b70Safresh1d_getservent_r='undef'
456fb12b70Safresh1
46*56d68f1eSafresh1# Bionic defines several stubs that warn (in older releases) and return NULL
476fb12b70Safresh1# https://gitorious.org/0xdroid/bionic/blobs/70b2ef0ec89a9c9d4c2d4bcab728a0e72bafb18e/libc/bionic/stubs.c
486fb12b70Safresh1# https://android.googlesource.com/platform/bionic/+/master/libc/bionic/stubs.cpp
496fb12b70Safresh1
50*56d68f1eSafresh1# These tests originally looked for 'FIX' or 'Android' warnings, as they
51*56d68f1eSafresh1# indicated stubs to avoid. At some point, Android stopped emitting
52*56d68f1eSafresh1# those warnings; the tests were adapted to check function return values
53*56d68f1eSafresh1# and hopefully now detect stubs on both older and newer Androids.
546fb12b70Safresh1
556fb12b70Safresh1# These are all stubs as well, but the core doesn't use them:
566fb12b70Safresh1# getusershell setusershell endusershell
576fb12b70Safresh1
586fb12b70Safresh1# This script UU/archname.cbu will get 'called-back' by Configure.
596fb12b70Safresh1$cat > UU/archname.cbu <<'EOCBU'
60*56d68f1eSafresh1# original egrep pattern to detect a stub warning on Android.
616fb12b70Safresh1# Right now we're checking for:
626fb12b70Safresh1# Android 2.x: FIX ME! implement FUNC
636fb12b70Safresh1# Android 4.x: FUNC is not implemented on Android
64*56d68f1eSafresh1# Android 8.x: <no warnings; tests now printf a compatible warning>
656fb12b70Safresh1android_stub='FIX|Android'
666fb12b70Safresh1
676fb12b70Safresh1$cat > try.c << 'EOM'
686fb12b70Safresh1#include <netdb.h>
69*56d68f1eSafresh1#include <stdio.h>
70*56d68f1eSafresh1int main() {
71*56d68f1eSafresh1  struct netent* test = getnetbyname("loopback");
72*56d68f1eSafresh1  if (test == NULL) {
73*56d68f1eSafresh1    printf("getnetbyname is still a stub function on Android");
74*56d68f1eSafresh1  }
75*56d68f1eSafresh1  return(0);
76*56d68f1eSafresh1}
776fb12b70Safresh1EOM
786fb12b70Safresh1$cc $ccflags try.c -o try
796fb12b70Safresh1android_warn=`$run ./try 2>&1 | $egrep "$android_stub"`
806fb12b70Safresh1if test "X$android_warn" != X; then
816fb12b70Safresh1   d_getnbyname="$undef"
826fb12b70Safresh1fi
836fb12b70Safresh1
846fb12b70Safresh1$cat > try.c << 'EOM'
856fb12b70Safresh1#include <netdb.h>
86*56d68f1eSafresh1#include <stdio.h>
87*56d68f1eSafresh1int main() {
88*56d68f1eSafresh1  struct netent* test = getnetbyaddr(127, AF_INET);
89*56d68f1eSafresh1  if (test == NULL) {
90*56d68f1eSafresh1    printf("getnetbyaddr is still a stub function on Android");
91*56d68f1eSafresh1  }
92*56d68f1eSafresh1  return(0);
93*56d68f1eSafresh1}
946fb12b70Safresh1EOM
956fb12b70Safresh1$cc $ccflags try.c -o try
966fb12b70Safresh1android_warn=`$run ./try 2>&1 | $egrep "$android_stub"`
976fb12b70Safresh1if test "X$android_warn" != X; then
986fb12b70Safresh1   d_getnbyaddr="$undef"
996fb12b70Safresh1fi
1006fb12b70Safresh1
1016fb12b70Safresh1$cat > try.c << 'EOM'
1026fb12b70Safresh1#include <stdio.h>
1036fb12b70Safresh1#include <mntent.h>
1046fb12b70Safresh1#include <unistd.h>
1056fb12b70Safresh1int main() { (void) getmntent(stdout); return(0); }
1066fb12b70Safresh1EOM
1076fb12b70Safresh1$cc $ccflags try.c -o try
1086fb12b70Safresh1android_warn=`$run ./try 2>&1 | $egrep "$android_stub"`
1096fb12b70Safresh1if test "X$android_warn" != X; then
1106fb12b70Safresh1   d_getmntent="$undef"
1116fb12b70Safresh1fi
1126fb12b70Safresh1
1136fb12b70Safresh1$cat > try.c << 'EOM'
1146fb12b70Safresh1#include <netdb.h>
115*56d68f1eSafresh1#include <stdio.h>
116*56d68f1eSafresh1int main() {
117*56d68f1eSafresh1  struct protoent* test = getprotobyname("tcp");
118*56d68f1eSafresh1  if (test == NULL) {
119*56d68f1eSafresh1    printf("getprotobyname is still a stub function on Android");
120*56d68f1eSafresh1  }
121*56d68f1eSafresh1  return(0);
122*56d68f1eSafresh1}
1236fb12b70Safresh1EOM
1246fb12b70Safresh1$cc $ccflags try.c -o try
1256fb12b70Safresh1android_warn=`$run ./try 2>&1 | $egrep "$android_stub"`
1266fb12b70Safresh1if test "X$android_warn" != X; then
1276fb12b70Safresh1   d_getpbyname="$undef"
1286fb12b70Safresh1fi
1296fb12b70Safresh1
1306fb12b70Safresh1$cat > try.c << 'EOM'
1316fb12b70Safresh1#include <netdb.h>
132*56d68f1eSafresh1#include <stdio.h>
133*56d68f1eSafresh1int main() {
134*56d68f1eSafresh1  struct protoent* test = getprotobynumber(1);
135*56d68f1eSafresh1  if (test == NULL) {
136*56d68f1eSafresh1    printf("getprotobynumber is still a stub function on Android");
137*56d68f1eSafresh1  }
138*56d68f1eSafresh1  return(0);
139*56d68f1eSafresh1}
1406fb12b70Safresh1EOM
1416fb12b70Safresh1$cc $ccflags try.c -o try
1426fb12b70Safresh1android_warn=`$run ./try 2>&1 | $egrep "$android_stub"`
1436fb12b70Safresh1if test "X$android_warn" != X; then
1446fb12b70Safresh1   d_getpbynumber="$undef"
1456fb12b70Safresh1fi
1466fb12b70Safresh1
1476fb12b70Safresh1$cat > try.c << 'EOM'
1486fb12b70Safresh1#include <sys/types.h>
1496fb12b70Safresh1#include <pwd.h>
1506fb12b70Safresh1int main() { endpwent(); return(0); }
1516fb12b70Safresh1EOM
1526fb12b70Safresh1$cc $ccflags try.c -o try
1536fb12b70Safresh1android_warn=`$run ./try 2>&1 | $egrep "$android_stub"`
1546fb12b70Safresh1if test "X$android_warn" != X; then
1556fb12b70Safresh1   d_endpwent="$undef"
1566fb12b70Safresh1fi
1576fb12b70Safresh1
1586fb12b70Safresh1$cat > try.c << 'EOM'
1596fb12b70Safresh1#include <unistd.h>
160*56d68f1eSafresh1#include <stdio.h>
161*56d68f1eSafresh1int main() {
162*56d68f1eSafresh1  char *tty = ttyname(STDIN_FILENO);
163*56d68f1eSafresh1  if (tty == NULL) {
164*56d68f1eSafresh1    printf("ttyname is still a stub function on Android");
165*56d68f1eSafresh1  }
166*56d68f1eSafresh1  return(0);
167*56d68f1eSafresh1}
1686fb12b70Safresh1EOM
1696fb12b70Safresh1$cc $ccflags try.c -o try
1706fb12b70Safresh1android_warn=`$run ./try 2>&1 | $egrep "$android_stub"`
1716fb12b70Safresh1if test "X$android_warn" != X; then
1726fb12b70Safresh1   d_ttyname="$undef"
1736fb12b70Safresh1fi
1746fb12b70Safresh1
1756fb12b70Safresh1EOCBU
1766fb12b70Safresh1
1776fb12b70Safresh1if $test "X$targetrun" = "Xadb"; then
1786fb12b70Safresh1
1796fb12b70Safresh1$rm $run $to $from $targetmkdir
1806fb12b70Safresh1
1816fb12b70Safresh1case "$src" in
1826fb12b70Safresh1    /*) run=$src/Cross/run
1836fb12b70Safresh1            targetmkdir=$src/Cross/mkdir
1846fb12b70Safresh1            to=$src/Cross/to
1856fb12b70Safresh1            from=$src/Cross/from
1866fb12b70Safresh1            ;;
1876fb12b70Safresh1    *)  pwd=`test -f ../Configure && cd ..; pwd`
1886fb12b70Safresh1            run=$pwd/Cross/run
1896fb12b70Safresh1            targetmkdir=$pwd/Cross/mkdir
1906fb12b70Safresh1            to=$pwd/Cross/to
1916fb12b70Safresh1            from=$pwd/Cross/from
1926fb12b70Safresh1               ;;
1936fb12b70Safresh1esac
1946fb12b70Safresh1
1956fb12b70Safresh1targetrun=adb-shell
1966fb12b70Safresh1targetto=adb-push
1976fb12b70Safresh1targetfrom=adb-pull
1986fb12b70Safresh1run=$run-$targetrun
1996fb12b70Safresh1to=$to-$targetto
2006fb12b70Safresh1from=$from-$targetfrom
2016fb12b70Safresh1
2026fb12b70Safresh1$cat >$run <<EOF
2036fb12b70Safresh1#!/bin/sh
2046fb12b70Safresh1doexit="echo \\\$? >$targetdir/output.status"
2056fb12b70Safresh1env=''
2066fb12b70Safresh1case "\$1" in
2076fb12b70Safresh1-cwd)
2086fb12b70Safresh1  shift
2096fb12b70Safresh1  cwd=\$1
2106fb12b70Safresh1  shift
2116fb12b70Safresh1  ;;
2126fb12b70Safresh1esac
2136fb12b70Safresh1case "\$1" in
2146fb12b70Safresh1-env)
2156fb12b70Safresh1  shift
2166fb12b70Safresh1  env=\$1
2176fb12b70Safresh1  shift
2186fb12b70Safresh1  ;;
2196fb12b70Safresh1esac
2206fb12b70Safresh1case "\$cwd" in
2216fb12b70Safresh1'') cwd=$targetdir ;;
2226fb12b70Safresh1esac
2236fb12b70Safresh1case "\$env" in
2246fb12b70Safresh1'') env="echo "
2256fb12b70Safresh1esac
2266fb12b70Safresh1exe=\$1
2276fb12b70Safresh1shift
2286fb12b70Safresh1args=\$@
2296fb12b70Safresh1$to \$exe > /dev/null 2>&1
2306fb12b70Safresh1
2316fb12b70Safresh1# send copy results to /dev/null as otherwise it outputs speed stats which gets in our way.
2326fb12b70Safresh1# sometimes there is no $?, I dunno why? we then get Cross/run-adb-shell: line 39: exit: XX: numeric argument required
2336fb12b70Safresh1adb -s $targethost shell "sh -c '(cd \$cwd && \$env ; \$exe \$args > $targetdir/output.stdout 2>$targetdir/output.stderr) ; \$doexit '" > /dev/null
2346fb12b70Safresh1
2356fb12b70Safresh1rm output.stdout output.stderr output.status 2>/dev/null
2366fb12b70Safresh1
2376fb12b70Safresh1$from output.stdout
2386fb12b70Safresh1$from output.stderr
2396fb12b70Safresh1$from output.status
2406fb12b70Safresh1
2416fb12b70Safresh1# We get back Ok\r\n on android for some reason, grrr:
2426fb12b70Safresh1$cat output.stdout | $tr -d '\r'
2436fb12b70Safresh1if test -s output.stderr; then
2446fb12b70Safresh1    $cat output.stderr | $tr -d '\r' >&2
2456fb12b70Safresh1fi
2466fb12b70Safresh1
2476fb12b70Safresh1result_status=\`$cat output.status | $tr -d '\r'\`
2486fb12b70Safresh1
2496fb12b70Safresh1rm output.stdout output.stderr output.status
2506fb12b70Safresh1
2516fb12b70Safresh1# Also, adb doesn't exit with the commands exit code, like ssh does, double-grr
2526fb12b70Safresh1exit \$result_status
2536fb12b70Safresh1
2546fb12b70Safresh1EOF
2556fb12b70Safresh1$chmod a+rx $run
2566fb12b70Safresh1
2576fb12b70Safresh1$cat >$targetmkdir <<EOF
2586fb12b70Safresh1#!/bin/sh
2596fb12b70Safresh1adb -s $targethost shell "mkdir -p \$@"
2606fb12b70Safresh1EOF
2616fb12b70Safresh1$chmod a+rx $targetmkdir
2626fb12b70Safresh1
2636fb12b70Safresh1$cat >$to <<EOF
2646fb12b70Safresh1#!/bin/sh
2656fb12b70Safresh1for f in \$@
2666fb12b70Safresh1do
2676fb12b70Safresh1  case "\$f" in
2686fb12b70Safresh1  /*)
2696fb12b70Safresh1    adb -s $targethost push \$f \$f            || exit 1
2706fb12b70Safresh1    ;;
2716fb12b70Safresh1  *)
2726fb12b70Safresh1    (adb -s $targethost push \$f $targetdir/\$f < /dev/null 2>&1) || exit 1
2736fb12b70Safresh1    ;;
2746fb12b70Safresh1  esac
2756fb12b70Safresh1done
2766fb12b70Safresh1exit 0
2776fb12b70Safresh1EOF
2786fb12b70Safresh1$chmod a+rx $to
2796fb12b70Safresh1
2806fb12b70Safresh1$cat >$from <<EOF
2816fb12b70Safresh1#!/bin/sh
2826fb12b70Safresh1for f in \$@
2836fb12b70Safresh1do
2846fb12b70Safresh1  $rm -f \$f
2856fb12b70Safresh1  (adb -s $targethost pull $targetdir/\$f . > /dev/null 2>&1) || exit 1
2866fb12b70Safresh1done
2876fb12b70Safresh1exit 0
2886fb12b70Safresh1EOF
2896fb12b70Safresh1$chmod a+rx $from
2906fb12b70Safresh1
2916fb12b70Safresh1fi # Cross-compiling with adb
2926fb12b70Safresh1
2936fb12b70Safresh1case "$usecrosscompile" in
2946fb12b70Safresh1define)
295b8851fccSafresh1# The tests for this in Configure doesn't play nicely with
296b8851fccSafresh1# cross-compiling
297b8851fccSafresh1d_procselfexe="define"
2986fb12b70Safresh1if $test "X$hostosname" = "Xdarwin"; then
2996fb12b70Safresh1  firstmakefile=GNUmakefile;
3006fb12b70Safresh1fi
3016fb12b70Safresh1
3026fb12b70Safresh1# When cross-compiling, full_csh and d_csh will get the
3036fb12b70Safresh1# host's values, which is all sorts of wrong.  So unless
3046fb12b70Safresh1# full_csh has been set on the command line, set d_csh to
3056fb12b70Safresh1# undef.
3066fb12b70Safresh1case "$full_csh" in
3076fb12b70Safresh1'') d_csh="$undef"
3086fb12b70Safresh1;;
3096fb12b70Safresh1esac
3106fb12b70Safresh1
3116fb12b70Safresh1;;
3126fb12b70Safresh1*)
3136fb12b70Safresh1ldflags="$ldflags -L/system/lib"
3146fb12b70Safresh1;;
3156fb12b70Safresh1esac
3166fb12b70Safresh1
3176fb12b70Safresh1osvers="`$run getprop ro.build.version.release`"
3186fb12b70Safresh1
3196fb12b70Safresh1# We want osname to be linux-android during Configure,
3206fb12b70Safresh1# but plain 'android' afterwards.
3216fb12b70Safresh1case "$src" in
3226fb12b70Safresh1    /*) pwd="$src";;
3236fb12b70Safresh1    *)  pwd=`test -f ../Configure && cd ..; pwd`
3246fb12b70Safresh1        ;;
3256fb12b70Safresh1esac
3266fb12b70Safresh1
327b8851fccSafresh1$cat <<'EOO' >> $pwd/config.arch
3286fb12b70Safresh1
3296fb12b70Safresh1osname='android'
3306fb12b70Safresh1eval "libpth='$libpth /system/lib /vendor/lib'"
331b8851fccSafresh1
332b8851fccSafresh1if $test "X$procselfexe" = X; then
333b8851fccSafresh1    case "$d_procselfexe" in
334b8851fccSafresh1        define) procselfexe='"/proc/self/exe"';;
335b8851fccSafresh1    esac
336b8851fccSafresh1fi
3376fb12b70Safresh1EOO
3386fb12b70Safresh1
3396fb12b70Safresh1# Android is a linux variant, so run those hints.
3406fb12b70Safresh1. ./hints/linux.sh
341