blob: cebe2cd9bab83be8686052ab03cb09b0b7a9ea4d [file] [log] [blame]
sewardj37ed97b2011-07-12 13:34:31 +00001
sewardjfb9c9622011-09-27 11:54:01 +00002How to cross-compile for Android. These notes were last updated on
sewardj0a64a7a2012-02-17 15:13:55 +0000317 Feb 2012, for Valgrind SVN revision 12390/2257.
sewardj37ed97b2011-07-12 13:34:31 +00004
philippeeeb07332012-07-04 21:59:29 +00005This is known to work at least for :
philippe5d5dd8e2012-08-05 00:08:25 +00006ARM:
philippeeeb07332012-07-04 21:59:29 +00007 Android 4.0.3 running on a (rooted, AOSP build) Nexus S.
8 Android 4.0.3 running on Motorola Xoom.
philippe5d5dd8e2012-08-05 00:08:25 +00009 Android 4.0.3 running on android arm emulator.
philippe77c11852012-07-18 23:01:02 +000010 Android 4.1 running on android emulator.
sewardjca456c72012-08-05 13:44:15 +000011 Android 2.3.4 on Nexus S worked at some time in the past.
philippe77c11852012-07-18 23:01:02 +000012
philippe5d5dd8e2012-08-05 00:08:25 +000013x86:
philippe5d5dd8e2012-08-05 00:08:25 +000014 Android 4.0.3 running on android x86 emulator.
15
dejanj9c6b05d2013-12-27 09:06:55 +000016mips32:
17 Android 4.1.2 running on android mips emulator.
18 Android 4.2.2 running on android mips emulator.
19 Android 4.3 running on android mips emulator.
20 Android 4.0.4 running on BROADCOM bcm7425
21
sewardjca456c72012-08-05 13:44:15 +000022On android-arm, GDBserver might insert breaks at wrong addresses.
philippe77c11852012-07-18 23:01:02 +000023Feedback on this welcome.
philippeeeb07332012-07-04 21:59:29 +000024
25Other configurations and toolchains might work, but haven't been tested.
sewardj0a64a7a2012-02-17 15:13:55 +000026Feedback is welcome.
sewardj37ed97b2011-07-12 13:34:31 +000027
philippeeeb07332012-07-04 21:59:29 +000028
sewardj0a64a7a2012-02-17 15:13:55 +000029You need the android-ndk-r6 native development kit. r6b and r7
30give a non-completely-working build; see
31http://code.google.com/p/android/issues/detail?id=23203
philippeeeb07332012-07-04 21:59:29 +000032For the android emulator, the versions needed and how to
33install them are described in README.android_emulator.
sewardj0a64a7a2012-02-17 15:13:55 +000034
sewardjda0b9402014-05-13 09:29:33 +000035You can get android-ndk-r6 from
36http://dl.google.com/android/ndk/android-ndk-r6-linux-x86.tar.bz2
sewardj0a64a7a2012-02-17 15:13:55 +000037Install it somewhere. Doesn't matter where. Then do this:
sewardj37ed97b2011-07-12 13:34:31 +000038
sewardj37ed97b2011-07-12 13:34:31 +000039
sewardjfb9c9622011-09-27 11:54:01 +000040# Modify this (obviously). Note, this "export" command is only done
41# so as to reduce the amount of typing required. None of the commands
42# below read it as part of their operation.
sewardj37ed97b2011-07-12 13:34:31 +000043#
sewardja0b4dbc2011-09-10 11:28:51 +000044export NDKROOT=/path/to/android-ndk-r6
sewardj37ed97b2011-07-12 13:34:31 +000045
sewardja0b4dbc2011-09-10 11:28:51 +000046
sewardjfb9c9622011-09-27 11:54:01 +000047# Modify this too. Tell the build system which Android hardware you
48# are building for. It needs to know this so it can compile in
49# support for the right Android-hw-specific ioctls. (sigh.) As with
50# NDKROOT above, this is merely to avoid repeated typing; none of the
51# commands read it.
sewardja0b4dbc2011-09-10 11:28:51 +000052#
sewardj1b3a7a42011-10-26 15:10:49 +000053# Currently the supported values are: nexus_s pandaboard
54# So choose one of the below:
sewardjfb9c9622011-09-27 11:54:01 +000055#
sewardj0a64a7a2012-02-17 15:13:55 +000056export HWKIND=nexus_s # Samsung Nexus S; also Xoom (for now)
philippe5d5dd8e2012-08-05 00:08:25 +000057export HWKIND=generic # A generic Android device. eg, Pandaboard
philippeeeb07332012-07-04 21:59:29 +000058export HWKIND=emulator # Android emulator
sewardja0b4dbc2011-09-10 11:28:51 +000059
60# Then cd to the root of your Valgrind source tree.
61#
62cd /path/to/valgrind/source/tree
63
64
sewardjfb9c9622011-09-27 11:54:01 +000065# After this point, you don't need to modify anything; just copy and
66# paste the commands below.
67
68
69# Set up toolchain paths.
70#
sewardjca456c72012-08-05 13:44:15 +000071# For ARM
sewardjfb9c9622011-09-27 11:54:01 +000072export AR=$NDKROOT/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-ar
73export LD=$NDKROOT/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-ld
74export CC=$NDKROOT/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc
75
sewardjca456c72012-08-05 13:44:15 +000076# For x86
philippe5d5dd8e2012-08-05 00:08:25 +000077export AR=$NDKROOT/toolchains/x86-4.4.3/prebuilt/linux-x86/bin/i686-android-linux-ar
78export LD=$NDKROOT/toolchains/x86-4.4.3/prebuilt/linux-x86/bin/i686-android-linux-ld
79export CC=$NDKROOT/toolchains/x86-4.4.3/prebuilt/linux-x86/bin/i686-android-linux-gcc
80
dejanj9c6b05d2013-12-27 09:06:55 +000081# For MIPS32
82export AR=$NDKROOT/toolchains/mipsel-linux-android-4.8/prebuilt/linux-x86_64/bin/mipsel-linux-android-ar
83export LD=$NDKROOT/toolchains/mipsel-linux-android-4.8/prebuilt/linux-x86_64/bin/mipsel-linux-android-ld
84export CC=$NDKROOT/toolchains/mipsel-linux-android-4.8/prebuilt/linux-x86_64/bin/mipsel-linux-android-gcc
sewardjfb9c9622011-09-27 11:54:01 +000085
sewardja0b4dbc2011-09-10 11:28:51 +000086# Do configuration stuff. Don't mess with the --prefix in the
87# configure command below, even if you think it's wrong.
sewardjfb9c9622011-09-27 11:54:01 +000088# You may need to set the --with-tmpdir path to something
sewardj1b3a7a42011-10-26 15:10:49 +000089# different if /sdcard doesn't work on the device -- this is
sewardjfb9c9622011-09-27 11:54:01 +000090# a known cause of difficulties.
sewardja0b4dbc2011-09-10 11:28:51 +000091
philippe7d9b41b2012-09-11 19:53:01 +000092# The below re-generates configure, Makefiles, ...
93# This is not needed if you start from a release tarball.
sewardj37ed97b2011-07-12 13:34:31 +000094./autogen.sh
95
philippe5d5dd8e2012-08-05 00:08:25 +000096# for ARM
sewardjfb9c9622011-09-27 11:54:01 +000097CPPFLAGS="--sysroot=$NDKROOT/platforms/android-3/arch-arm -DANDROID_HARDWARE_$HWKIND" \
sewardja0b4dbc2011-09-10 11:28:51 +000098 CFLAGS="--sysroot=$NDKROOT/platforms/android-3/arch-arm" \
sewardj37ed97b2011-07-12 13:34:31 +000099 ./configure --prefix=/data/local/Inst \
100 --host=armv7-unknown-linux --target=armv7-unknown-linux \
sewardja0b4dbc2011-09-10 11:28:51 +0000101 --with-tmpdir=/sdcard
philippeeeb07332012-07-04 21:59:29 +0000102# note: on android emulator, android-14 platform was also tested and works.
103# It is not clear what this platform nr really is.
sewardj37ed97b2011-07-12 13:34:31 +0000104
philippe5d5dd8e2012-08-05 00:08:25 +0000105# for x86
106CPPFLAGS="--sysroot=$NDKROOT/platforms/android-9/arch-x86 -DANDROID_HARDWARE_$HWKIND" \
107 CFLAGS="--sysroot=$NDKROOT/platforms/android-9/arch-x86 -fno-pic" \
108 ./configure --prefix=/data/local/Inst \
109 --host=i686-android-linux --target=i686-android-linux \
110 --with-tmpdir=/sdcard
111
dejanj9c6b05d2013-12-27 09:06:55 +0000112# for MIPS32
113CPPFLAGS="--sysroot=$NDKROOT/platforms/android-18/arch-mips -DANDROID_HARDWARE_$HWKIND" \
114 CFLAGS="--sysroot=$NDKROOT/platforms/android-18/arch-mips" \
115 ./configure --prefix=/data/local/Inst \
116 --host=mipsel-linux-android --target=mipsel-linux-android \
117 --with-tmpdir=/sdcard
118
sewardj37ed97b2011-07-12 13:34:31 +0000119# At the end of the configure run, a few lines of details
120# are printed. Make sure that you see these two lines:
sewardjca456c72012-08-05 13:44:15 +0000121#
philippe5d5dd8e2012-08-05 00:08:25 +0000122# For ARM:
sewardj37ed97b2011-07-12 13:34:31 +0000123# Platform variant: android
124# Primary -DVGPV string: -DVGPV_arm_linux_android=1
sewardjca456c72012-08-05 13:44:15 +0000125#
philippe5d5dd8e2012-08-05 00:08:25 +0000126# For x86:
127# Platform variant: android
128# Primary -DVGPV string: -DVGPV_x86_linux_android=1
sewardj37ed97b2011-07-12 13:34:31 +0000129#
dejanj9c6b05d2013-12-27 09:06:55 +0000130# For mips32:
131# Platform variant: android
132# Primary -DVGPV string: -DVGPV_mips32_linux_android=1
133#
sewardj37ed97b2011-07-12 13:34:31 +0000134# If you see anything else at this point, something is wrong, and
135# either the build will fail, or will succeed but you'll get something
136# which won't work.
137
138
139# Build, and park the install tree in `pwd`/Inst
sewardja0b4dbc2011-09-10 11:28:51 +0000140#
141make -j2
142make -j2 install DESTDIR=`pwd`/Inst
sewardj37ed97b2011-07-12 13:34:31 +0000143
144
145# To get the install tree onto the device:
146# (I don't know why it's not "adb push Inst /data/local", but this
147# formulation does appear to put the result in /data/local/Inst.)
148#
149adb push Inst /
150
151# To run (on the device)
sewardja0b4dbc2011-09-10 11:28:51 +0000152/data/local/Inst/bin/valgrind [the usual args etc]
153
154
155# Once you're up and running, a handy modify-V-rebuild-reinstall
156# command line (on the host, of course) is
157#
158mq -j2 && mq -j2 install DESTDIR=`pwd`/Inst && adb push Inst /
159#
160# where 'mq' is an alias for 'make --quiet'.
161
162
163# One common cause of runs failing at startup is the inability of
164# Valgrind to find a suitable temporary directory. On the device,
165# there doesn't seem to be any one location which we always have
166# permission to write to. The instructions above use /sdcard. If
167# that doesn't work for you, and you're Valgrinding one specific
168# application which is already installed, you could try using its
169# temporary directory, in /data/data, for example
170# /data/data/org.mozilla.firefox_beta.
171#
172# Using /system/bin/logcat on the device is helpful for diagnosing
173# these kinds of problems.