Table of Contents

Installation of Perl on Android

NOTE: This is work in progress

These are the steps I've done to install Perl on Google Android emulator platform. Some of the steps I've done come from the French magazine “Gnu Linux Magazine France #112”. If you can get one and understand French you can refer to it to have a better explanation of some of these steps.

My system is an up to date Ubuntu Intrepid (8.10). I've added some packages from the Ubuntu repositories, like git-core. I don't remember the list (and some were already installed before) so if you follow the steps I've put on this page and miss one package, install it and report that fact to me please.

Feel free to report whatever you want to me on my mail.

Update: I noticed that by doing this, all the Android platform is slowed down… I don't know why for the moment… Anyway, I opened a Google code site to host my project that goes far beyond this experiment (not available for the moment, see this page).

Installation of SDKs and tools

Install Sun's Java 6 SDK

Not useful for the moment but maybe for later.

Just do:

sudo apt-get install sun-java6-jdk

Install the Android SDK

Then you need, of course, to install the Android SDK to get the environment and the emulator. For this, follow the instructions on the Android SDK page.

These can be summed up by:

wget -nd http://dl.google.com/android/android-sdk-linux_x86-1.0_r2.zip
unzip android-sdk-linux_x86-1.0_r2.zip

Add the tools directory in your path:

PATH=~/android-sdk-linux_x86-1.0_r2/tools:$PATH

You may want to do this in your .bashrc.

Installation of ScratchBox

I use Scratchbox v1.0.12 for the moment.

wget -nd http://www.scratchbox.org/download/files/sbox-releases/stable/deb/scratchbox-libs_1.0.12_i386.deb
wget -nd http://www.scratchbox.org/download/files/sbox-releases/stable/deb/scratchbox-core_1.0.12_i386.deb
wget -nd http://www.scratchbox.org/download/files/sbox-releases/stable/deb/scratchbox-devkit-cputransp_1.0.8_i386.deb
wget -nd http://www.scratchbox.org/download/files/sbox-releases/stable/deb/scratchbox-toolchain-arm-linux-2007q1-21_1.0.7_i386.deb
sudo dpkg -i scratchbox-libs_1.0.12_i386.deb scratchbox-core_1.0.12_i386.deb scratchbox-devkit-cputransp_1.0.8_i386.deb scratchbox-toolchain-arm-linux-2007q1-21_1.0.7_i386.deb

Log into ScratchBox

You need first to declare your current user in Scratchbox. I am mid (nice to meet you 8-) ) so I do:

sudo /scratchbox/sbin/sbox_adduser mid

Then you need to add your user to the sbox group, if not already done. Edit /etc/group to do so. Verify that you are in the sbox group with groups. You may need to restart your graphical interface.

Then log into scratchbox:

/scratchbox/login

If you get the following message:

Host kernel has vdso support (which is uncompatible with SB)
You can fix this with either: 
  echo 0 > /proc/sys/vm/vdso_enabled
or
  add 'vdso=0' to the kernel parameters

just do what it says:

sudo bash -c "echo 0 > /proc/sys/vm/vdso_enabled"

and reissue the /scratchbox/login procedure.

Before going further, set the compilation environment:

sb-menu

A text menu will appear. Choose Setup a target then Create a new target. Give android as target name and arm-linux-2007q1-21 as compiler. In the next menu, select cputransp, then qemu-arm-0.8.2-sb2. To the question “Do you wish to extract a rootstrap on the target?”, answer “No”. Answer “Yes” to the next question: “Do you wish to install files to the target?”.

This environment setting is done only once.

Keep this terminal open and open another one (to avoid scratchbox logins and logouts).

Download and install busybox on Android emulator

Download and compile busybox

This is not necessary but simplify work on the emulator.

Do this in a normal terminal, not logged into scratchbox:

cd /scratchbox/users/mid/home/mid
wget -nd http://busybox.net/downloads/busybox-1.10.1.tar.bz2
tar xjvf busybox-1.10.1.tar.bz2
cd busybox-1.10.1
make menuconfig

(change both occurences of mid in the first line with your logname)

In the Busybox Settings/Build Options, select build a static binary.

Then, from the previous terminal, the one logged into scratchbox:

cd busybox-1.10.1
make

Install busybox on the emulator

To install the freshly compiled executable in the emulator, we need to extract the ramdisk from the Android SDK and create a new one. Do this in a normal terminal:

mkdir androidrd; cd androidrd
cp ~/android-sdk-linux_x86-1.0_r2/tools/lib/images/ramdisk.img .
gunzip -S.img ramdisk.img
cpio -i -F ramdisk
cpio -t -F ramdisk >ramdisk_list

Now we are going to install the busybox executable and the applets:

mkdir bin; cd bin
cp /scratchbox/users/mid/home/mid/busybox-1.10.1/busybox .
awk -F\" '/applet_names/,/;/ { if ($2) printf("ln -s busybox %s\n", $2) }' /scratchbox/users/mid/home/mid/busybox-1.10.1/include/applet_tables.h >../create_bb_links.sh
. ../create_bb_links.sh

The last 2 commands extracts the busybox applets and create the symlinks.

Next, we have to rebuild the ramdisk:

find bin >>ramdisk_list
cat ramdisk_list | cpio -o -H newc -O mydisk
gzip -S.img mydisk

Test of busybox on emulator

Start the emulator with the command:

emulator -ramdisk ~/androidrd/mydisk.img &

Wait for it to be up and running.

Then, to log on:

adb forward tcp:4444 tcp:23
adb shell telnetd &
telnet localhost 4444

You should then be on the emulator. Then setup a little things and test busybox:

PATH=/bin:$PATH
ash

and feel free to inspect and test things…

Close the emulator window when you're done.

Installation of Perl

Now the interesting part: the installation of the perl executable and its core modules.

This installation won't use the Android bionic C library because it is too limited. I prefer to upload the toolchain libs on the emulator.

Download perl from git and install it in ScratchBox

Use a normal terminal first to issue the following commands:

cd /scratchbox/users/mid/home/mid
git clone git://perl5.git.perl.org/perl.git perl

then, in the scratchbox terminal:

cd perl

As we are using a develoment version (5.11, odd minor number), we won't be able to use the -d flag of Configure unless we edit this script to change line 2170 to dflt='y'.

Then, do this:

./Configure -des -Dprefix=/

Wait for this command to end then type:

cp -p `which pwd` /usr/bin/
make

perl won't build correctly if you don't copy the pwd executable to /usr/bin. Don't worry it's the /usr/bin of your specific scratchbox environment.

After some time, the compilation is over.

FIXME: You would like to try make test but don't. For the moment some tests eat up 100% CPU and never end.

Now, do this:

make install

This will install perl in the scratchbox environment.

Install perl and dependencies in emulator

Now we have to move everything we built into the emulator. In a normal terminal, type:

cd ~/androidrd
cp -p /scratchbox/users/mid/targets/android/bin/* bin/
mkdir lib
cp -rp /scratchbox/users/mid/targets/android/lib/perl5 lib/

Before rebuilding the ramdisk, let's copy the necessary libraries:

cp -p /scratchbox/users/mid/targets/android/lib/ld-* lib/
cp -p /scratchbox/users/mid/targets/android/lib/libc* lib/
cp -p /scratchbox/users/mid/targets/android/lib/libdl* lib/
cp -p /scratchbox/users/mid/targets/android/lib/libgcc* lib/
cp -p /scratchbox/users/mid/targets/android/lib/libm* lib/
cp -p /scratchbox/users/mid/targets/android/lib/libnsl* lib/
cp -p /scratchbox/users/mid/targets/android/lib/libutil* lib/

Now, we rebuild the ramdisk. We have to extract again the initial content of the ramdisk because we don't want to add twice busybox. So do:

cpio -t -F ramdisk >ramdisk_list
find bin lib >>ramdisk_list
rm -f mydisk.img
cat ramdisk_list | cpio -o -H newc -O mydisk
gzip -S.img mydisk

Enjoy!

Start the emulator again, connect to it, and then try:

perl -V

You should see:

Summary of my perl5 (revision 5 version 11 subversion 0) configuration:
  Commit id: 
  Platform:
    osname=linux, osvers=2.6.27-11-generic, archname=arm-linux
    uname='linux shut 2.6.27-11-generic #1 smp thu jan 15 11:03:58 utc 2009 arm gnulinux '
    config_args='-des -Dprefix=/'
    hint=recommended, useposix=true, d_sigaction=define
    useithreads=undef, usemultiplicity=undef
    useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
    use64bitint=undef, use64bitall=undef, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='cc', ccflags =' -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
    optimize='-O2',
    cppflags=''
    ccversion='', gccversion='4.2.0 20070413 (prerelease)', gccosandvers=''
    intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=8
    ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
    alignbytes=8, prototype=define
  Linker and Libraries:
    ld='cc', ldflags =' -L/usr/local/lib'
    libpth=/usr/local/lib /lib /usr/lib
    libs=-lnsl -ldl -lm -lcrypt -lutil -lc
    perllibs=-lnsl -ldl -lm -lcrypt -lutil -lc
    libc=/lib/libc-2.5.so, so=so, useshrplib=false, libperl=libperl.a
    gnulibc_version='2.5'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
    cccdlflags='-fPIC', lddlflags='-shared -O2 -L/usr/local/lib'


Characteristics of this binary (from libperl): 
  Compile-time options: PERL_DONT_CREATE_GVSV PERL_MALLOC_WRAP
                        USE_LARGE_FILES USE_PERLIO
  Built under linux
  Compiled at Jan 22 2009 20:52:18
  @INC:
    //lib/perl5/5.11.0/arm-linux
    //lib/perl5/5.11.0
    //lib/perl5/site_perl/5.11.0/arm-linux
    //lib/perl5/site_perl/5.11.0
    .

A lot of things should be perfectible. But anyway, I have a running perl on my emulator! :-)

Next steps

The next steps I'm currently working on are, in that order:

  1. See if it is possible to have a perl android application.
  2. See if it is possible to have bindings to the android framework.