Front page | perl.perl5.porters |
Postings from September 2013
Re: Question on porting perl 5.16 to Android (no /bin/sh)
Thread Previous
|
Thread Next
From:
Brian Fraser
Date:
September 4, 2013 17:22
Subject:
Re: Question on porting perl 5.16 to Android (no /bin/sh)
Message ID:
CA+nL+naa4RT5k5gx207nMLvsRNW-mB7DJXWO9v7NEwj1TTgivA@mail.gmail.com
On Wed, Sep 4, 2013 at 1:50 PM, Ben Greear <greearb@candelatech.com> wrote:
> I used the perldroid project to cross-compile perl 5.16 for android (ARM)
> using
> the latest Android NDK stand-alone toolchain. After hacking on perldroid
> to
> fix a few things I got a mostly-working perl binary & libraries.
>
> One problem remains however. If I have perl code that does something like
> this,
> it will not work:
>
> my @foo = `ls run_*.PID 2>/dev/null`;
>
> I think this might be because Android has no /bin/sh. Instead, it puts
> the shell
> at /system/bin/sh.
>
> Maybe lacking /bin/sh perl uses some interal minimal fake shell and thus
> fails to handle
> more advanced system calls?
>
> Anyone know if perl can be configured to use a different shell by default,
> or where
> the code is that could be changed to use /system/bin/sh?
>
> Thanks,
> Ben
>
Rather than using perldroid, try using castaway's branch here:
https://github.com/castaway/perl/tree/jrobinson/configure-for-cross
Which solves that and several other issues with perl on android, such as
making 'system "echo", "foo"' work, even though "echo" is a shell builtin
in Android, or being able to use both List::Util and Hash::Util in the same
program, which fails on perldroid due to some limitations in the android
linker.
Also, for the time being, perhaps considering using
https://github.com/Hugmeir/utf8mess/tree/configure-for-cross instead, at
least until that's merged into the main branch, if you want to run a
successful 'make test' after building, to ensure that your perl is working
properly.
With that branch, building perl on android is pretty simple:
# Change these two accordingly
$ export ANDROID_NDK=$HOME/Downloads/android-ndk-r8e
$ export ANDROID_SDK=`echo $HOME/Downloads/adt-bundle-*`
$ export
PATH="$ANDROID_SDK/sdk/platform-tools:$ANDROID_NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/`uname
| tr '[A-Z]' '[a-z]'`-x86_64/bin:$PATH"
$ $ANDROID_NDK/build/tools/make-standalone-toolchain.sh
--platform=android-9 --install-dir=/tmp/my-toolchain --system=`uname | tr
'[A-Z]' '[a-z]'`-x86_64 --toolchain=arm-linux-androideabi-4.4.3
# Turn on the emulator, obviously optional:
$ $ANDROID_SDK/sdk/tools/android avd &
$ adb devices
# Grab the device name, then
$ export DEVICE=emulator-5554
# if you have a rooted device/emulator:
$ export TARGETDIR=/mnt/asec/perl
$ adb -s $DEVICE shell "echo sh -c '\"mkdir $TARGETDIR\"' | su --"
# else
# You might have a /data that is writeable by the 'shell' user,
# which is what adb logs in as. if you do, you could
# put all of perl and the test files there, but for most phones
# you'll run out of space first.
# WARNING! You'll have to remove the test files from
# the target dir once you are done! Unlike /mnt/asec,
# /data/local/tmp may not get automatically garbage
# collected once you shut off the phone
$ export TARGETDIR=/data/local/tmp/perl
$ adb -s $DEVICE shell "mkdir $TARGETDIR"
$ adb -s $DEVICE pull /system/lib /tmp/tmpandroidlib
$ ./Configure -des -Dusedevel -DDEBUGGING -Dusecrosscompile
-Dcc=arm-linux-androideabi-gcc -Dtargethost=$DEVICE
-Dsysroot=/tmp/my-toolchain/sysroot -Dtargetdir=$TARGETDIR
$ perl -i -wlnpe "s{^libpth=\K.+}{'/tmp/tmpandroidlib'}" config.sh
$ make -j30
$ make test
$ make DESTDIR=/tmp/android-perl install
Then copy the perl installed into /tmp/android-perl to your device
Thread Previous
|
Thread Next