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
Ben Greear
September 4, 2013 18:17
Re: Question on porting perl 5.16 to Android (no /bin/sh)
Message ID:
On 09/04/2013 10:21 AM, Brian Fraser wrote:
> 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 linker.
> 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 properly.
> With that branch, building perl on android is pretty simple:

I took a look at the jrobinson stuff yesterday, but I'd rather not use
an emulator, and I want the end result to be a foo/perl/lib and foo/perl/bin
(or similar) directory structure that I can copy over to my phone via
sftp or some other external means.

I also have a stand-alone toolchain set up already, so it seems I can skip
some of these steps.

I'll try based on your instructions below and see what I can see.

For your instructions below, is there a particular place on the
droid file system at which perl is expecting to be installed?  I
can fiddle with @INC if needed, but easier if I don't have to.


> # 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/ --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

Ben Greear <>
Candela Technologies Inc

Thread Previous | Thread Next Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at | Group listing | About