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