develooper 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
Brian Fraser
September 4, 2013 17:22
Re: Question on porting perl 5.16 to Android (no /bin/sh)
Message ID:
On Wed, Sep 4, 2013 at 1:50 PM, Ben Greear <> 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:

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
Also, for the time being, perhaps considering using 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

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
| tr '[A-Z]' '[a-z]'`-x86_64/bin:$PATH"
$ $ANDROID_NDK/build/tools/
--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'}"
$ 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 Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at | Group listing | About