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