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