SlideShare una empresa de Scribd logo
1 de 17
Cross-compilation native pour
android avec les autotools ou
cmake
Thierry GAYET
http://www.nextinnovation.org

Lorsque l'on cross-compile un package pour une architecture
donnée, ils peuvent être basés soit sur autotools, cmake, ou autre.
Cela peut être plus ou moins compliqué suivant le système de
génération requis.

1. Introduction au NDK de google Android
Le NDK (aka Native Development Kit) est un ensemble d'outils comprenant une chaîne de crosscompilation pour plusieurs architectures (ARM, X86, MIPS). Il permet de cross-compiler
nativement des packages développés en langage C et/ou C++.
Il est mis en libre téléchargement par google. Nous allons le télécharger et nous en servir pour les
cross-compilation suivantes.
Il est disponibles pour linux pour l'architecture x86 32 et 64 bits :
•

http://dl.google.com/android/ndk/android-ndk-r9c-linux-x86.tar.bz2

•

http://dl.google.com/android/ndk/android-ndk-r9c-linux-x86_64.tar.bz2

Le support c++ pour la STL est aussi disponible avec les symboles de débug :
•

http://dl.google.com/android/ndk/android-ndk-r9c-cxx-stl-libs-with-debugging-info.zip

L'installation sera effectué dans le répertoire /opt pour l'exemple :
$ cd /tmp
$ wget http://dl.google.com/android/ndk/android-ndk-r9c-linux-x86_64.tar.bz2
$ tar jxf android-ndk-r9c-linux-x86_64.tar.bz2
$ sudo $ tar jxf android-ndk-r9c-linux-x86_64.tar.bz2 -C /opt

Le NDK fournit une chaînes de compilation croisée (compilateurs, éditeurs de liens, etc...) pouvant
générer des binaires pour une architecture native.
Sont fournit les d'en-têtes du système pour API natives stables qui sont garantis pour être pris en
charge dans toutes les versions de la plate-forme :
•

headers libc bionic ;

•

headers libm (bibliothèque de mathématiques) ;

•

headers pour les interface JNI avec le java ;

•

headers libz (bibliothèque de compression Zlib) ;

•

headers liblog (bibliothèque de traces) ;

•

headers OpenGL ES 1.1 et OpenGL ES 2.0 (bibliothèques graphiques 3D) ;

•

headers libjnigraphics (accès au buffer de pixel) à partir d'Android 2.2 et supérieur ;

•

Un ensemble minimal d'entêtes pour le support du langage C et C++ ;

•

headers OpenSL ES (bibliothèques audio natives) ;
API Android natives ;

•

Le NDK, peut nécessité plusieurs dépendances :
•

SDK Android (>= 1.5) complet avec ses dépendances ;

•

Linux (32 or 64-bit ; Ubuntu 8.04, ou autre distribution Linux GLibc 2.7 ou supérieur) ;

•

GNU Make 3.81 ou supérieur ;

•

GNU Awk or Nawk ou supérieur

Une fois installé, l'arborescence suivante peut être observée :
Répertoire

Description

<ndk>/build

Outils nécessaires aux builds

<ndk>/docs

Documentation sur la partie native

<ndk>/platforms

Répertoire plate-forme Android par niveau d'API

<ndk>/prebuilt

Librairie(s) statiques et dynamique pré-ébuildées

<ndk>/samples

Exemple de code c/c++ natif

<ndk>/sources

Divers codes sources

<ndk>/tests

Tests unitaires du NDK

<ndk>/toolchains

Chaînes de cross-compilation

Pour ceux que cela intéresse, le NDK peut être suivi depuis les repo GIT officiel :
git clone https://android.googlesource.com/platform/ndk.git ndk
git clone https://android.googlesource.com/platform/development.git development

2. Configuration de l'environement
La décompression effectuée, nous pouvons définir le chemin du NDK dans notre fichier ~/.bashrc.
Pour ce faire ajoutons la ligne suivante :
export NDK_HOME="${FORMATION_HOME}/tools/android-ndk-r9c"

Pour une utilisation dans un shell il faudra resourcer le script :
$ source ~/.bashrc

Pour une utilisation directe en standalone de la toolchaine, il faut d'abord procéder à son
investigation.
Commençons par les différentes toolchain fournis dans le NDK :
$ ls -al ${NDK_HOME}/toolchains/
total 52
drwxr-xr-x 13 124982 5000 4096 déc. 4 05:09 .
drwxr-xr-x 10 124982 5000 4096 déc. 4 05:09 ..
drwxr-xr-x 3 124982 5000 4096 déc. 4 05:09 arm-linux-androideabi-4.6
drwxr-xr-x 3 124982 5000 4096 déc. 4 05:09 arm-linux-androideabi-4.8
drwxr-xr-x 2 124982 5000 4096 déc. 4 05:08 arm-linux-androideabi-clang3.3
drwxr-xr-x 3 124982 5000 4096 déc. 4 05:09 llvm-3.3
drwxr-xr-x 3 124982 5000 4096 déc. 4 05:09 mipsel-linux-android-4.6
drwxr-xr-x 3 124982 5000 4096 déc. 4 05:09 mipsel-linux-android-4.8
drwxr-xr-x 2 124982 5000 4096 déc. 4 05:08 mipsel-linux-android-clang3.3
drwxr-xr-x 3 124982 5000 4096 déc. 4 05:09 renderscript
drwxr-xr-x 3 124982 5000 4096 déc. 4 05:09 x86-4.6
drwxr-xr-x 3 124982 5000 4096 déc. 4 05:09 x86-4.8
drwxr-xr-x 2 124982 5000 4096 déc. 4 05:08 x86-clang3.3
Pour connaître les architectures cibles et hôte, consultons le répertoire prebuilt :
$ ls -al ${NDK_HOME}/prebuilt/
drwxr-xr-x 3 tgayet tgayet 4096 juil. 11 20:00 android-arm
drwxr-xr-x 3 tgayet tgayet 4096 juil. 11 20:00 android-mips
drwxr-xr-x 3 tgayet tgayet 4096 juil. 11 20:00 android-x86
drwxr-xr-x 4 tgayet tgayet 4096 juil. 11 20:00 common
drwxr-xr-x 6 tgayet tgayet 4096 juil. 10 21:55 linux-x86_64 (ou linux_x86 sur x86-32)
→ Android-* donne les architectures cibles : arm, mips ou x86.
→ linux-x86_64 donne l'architecture hôte de la machine servant aux développement.
Pour le support d'API android consultons le répertoire platforms :
$ ls -al ${NDK_HOME}/platforms/
drwxr-xr-x 5 tgayet tgayet 4096 juil. 11 04:36 android-14
drwxr-xr-x 5 tgayet tgayet 4096 juil. 11 04:36 android-18
drwxr-xr-x 3 tgayet tgayet 4096 juil. 11 04:36 android-3
drwxr-xr-x 3 tgayet tgayet 4096 juil. 11 04:36 android-4
drwxr-xr-x 3 tgayet tgayet 4096 juil. 11 04:36 android-5
drwxr-xr-x 3 tgayet tgayet 4096 juil. 11 04:36 android-8
drwxr-xr-x 5 tgayet tgayet 4096 juil. 11 04:36 android-9
→ android* donne la version d'API d'Android supporté.
La toolchain peut être utilisée séparément en exportant les outils nécessaires :
SYSROOT="${NDK_HOME}/platforms/android-<level>/arch-<arch>/"
CC="${NDK_HOME}/toolchains/<name>/prebuilt/<system>/bin/<prefix>gcc 
--sysroot=$SYSROOT"

Exemple :
$ export SYSROOT="${NDK_HOME}/platforms/android-8/arch-arm"
$ export CC="${NDK_HOME}/toolchains/arm-linux-androideabi-4.8/prebuilt/linuxx86_64/bin/arm-linux-androideabi-gcc –sysroot=$SYSROOT"
Vérifions la version de GNU/Gcc de la toolchain :
$ $CC --version
arm-linux-androideabi-gcc (GCC) 4.8
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE.
Il sera ensuite possible d'intégrer la règle de compilation suivante dans les Makefiles :
.c.o:
@echo "n---" $@ "---"
$(CC) $(CFLAGS) -c -o $@ $<

3. Limitations
La libc Bionic est une version BSD de la librairie GNU C glibc ou eglibc utilisé habituellement sous
linux. Elle a été initialement développé par Google pour son système d'exploitation Android en
incluant des optimisation pour la mobilité.
Elle a plusieurs caractéristiques majeures spécifiques au noyau Linux, et son développement se
poursuit indépendamment du code source d'Android. Son code est accessible sur le github
suivant : https://github.com/android/platform_bionic
Les ingénieurs d'Android ont décidé de développer une libc propre à la plateforme Android car
ils avaient besoin d'une libc légère (la libc sera chargé dans chaque processus) et rapide (les
appareils mobiles ne disposent de CPU puissant).
La Bionic libc a été écrit pour supporter les CPU ARM, bien que le support x86 est présent. Il n'y
pas de support pour les autres architecture CPU tel que PowerPC ou MIPS. Néanmoins, pour le
marché des appareils mobiles, seulement l'architecture ARM est importante.
Parmi les limitations, il y a une restriction au niveau des locales qui sont absente.
Cette libc est sous licence BSD, elle reprend une grande partie du code des glibc issue
d'OpenBSD, FreeBSD et NetBSD.
Caractéristique importante :
 Elle pèse environ 200Ko soit la moitié de la glibc ;
 L'implémentation des pthreads (POSIX thread) a été complètement réécrit pour supporter
les threads de la machine virtuelle Dalvik. De ce fait la Bionic libc ne supporte les threads
POSIX ;
 Les exceptions C++ et les "wide char" ne sont pas supportés ;
 Il n'y a pas eu de "Standard Template Library" (STI) avant la r9c ; il est désormais possible
de
télécharger
http://dl.google.com/android/ndk/android-ndk-r9c-cxx-stl-libs-with-

debugging-info.zip
Tableau des associations rattachant une architecture à une version d'API android :

Architecture

Plateforme Goole/Android

ARM, ARM-NEON

Android 1.5 (API Level 3) ou supérieur

x86

Android 2.3 (API Level 9) ou supérieur

MIPS

Android 2.3 (API Level 9) ou supérieur

4. Infos de génération pour la librairie XML expat
Avant de cross-compiler la librairie expat, allons regarder la référence dans LFS (aka Linux From
Scratch) qui détaille ce qu'il faut pour (cross)compiler un package.
Pour
librairie
expat,
tout
est
décris
http://www.linuxfromscratch.org/blfs/view/svn/general/expat.html

à

l'adresse

Les étapes sont :
•

Téléchargement :
URL (http) : http://downloads.sourceforge.net/expat/expat-2.1.0.tar.gz

•

Extraction :
tar zxvf expat-2.1.0.tar.gz && cd expat-2.1.0/

•

Configuration :
./configure --prefix=/usr –disable-static

•

Compilation :
make

•

Installation :

suivante :
make install &&
install -v -m755 -d /usr/share/doc/expat-2.1.0 &&
install -v -m644 doc/*.{html,png,css} /usr/share/doc/expat-2.1.0

5. Cross-compilation d'un package à base d'autotools
Pour l'exemple, je vais cross-compiler la librairie expat.
Je vais commencer par la récupérer les sources du package via le bash script suivant :
#!/bin/bash
echo "--> Récupération du package ${PACKAGE_NAME} - v${PACKAGE_VERSION} "
# --- Téléchargement du package --if [ "${PACKAGE_PROTOCOL}" != "" ] && [ "${PACKAGE_URL}" != "" ] && [ "${PACKAGE_NAME}" !
= "" ] && [ "${PACKAGE_VERSION}" != "" ] && [ "${PACKAGE_EXTENSION}" != "" ]; then
echo -n "
--> Téléchargement du package ... "
wget ${PACKAGE_PROTOCOL}://${PACKAGE_URL}/${PACKAGE_NAME}-${PACKAGE_VERSION}.$
{PACKAGE_EXTENSION} > /dev/null 2>&1
if [ -e "${PACKAGE_NAME}-${PACKAGE_VERSION}.${PACKAGE_EXTENSION}" ]; then
echo "OK"
else
echo "NOK ... arrêt !!"
exit
fi
else
echo " --> [ERROR] Package mal référencé ; Téléchargement impossible. "
echo " Exemple de description du package définissant la librairie expat : "
echo "
export PACKAGE_PROTOCOL=http "
echo "
export PACKAGE_URL=downloads.sourceforge.net/expat "
echo "
export PACKAGE_VERSION=2.1.0 "
echo "
export PACKAGE_NAME=expat "
echo "
export PACKAGE_EXTENSION=tar.gz "
echo "
export PACKAGE_CMD_EXTRACTION=tar zxvf "
exit
fi
# --- Extraction du package --if [ "${PACKAGE_CMD_EXTRACTION}" != "" ] && [ "${PACKAGE_NAME}" != "" ] && [ "$
{PACKAGE_VERSION}" != "" ] && [ "${PACKAGE_EXTENSION}" != "" ]; then
echo -n "
--> Extraction du package ... "
${PACKAGE_CMD_EXTRACTION} ${PACKAGE_NAME}-${PACKAGE_VERSION}.${PACKAGE_EXTENSION}
> /dev/null 2>&1
if [ -d "${PACKAGE_NAME}-${PACKAGE_VERSION}" ]; then
echo "OK"
else
echo "NOK ... arrêt !!"
exit
fi
else
echo " --> [ERROR] Impossible de trouver l'outils d'extraction $
{PACKAGE_CMD_EXTRACTION}
"
echo "
ou bien le package ${PACKAGE_NAME}-${PACKAGE_VERSION}.$
{PACKAGE_EXTENSION} "
exit
fi
# --- Déférencement des variables des registres pour nettoyer l'environement --echo -n "
--> Nettoyage de l'environement ... "
LIST_ENV="PACKAGE_PROTOCOL PACKAGE_URL PACKAGE_VERSION PACKAGE_NAME PACKAGE_EXTENSION
PACKAGE_CMD_EXTRACTION"
for VAR in `echo ${LIST_ENV}`
do
if [ "${VAR}" != "" ]; then
unset ${VAR}
fi
done
if [ "`env | grep PACKAGE`" == "" ]; then
echo "OK"
else
echo "NOK ... arrêt !!"
exit
fi
# Done.
echo "<-- Done."

Après définition des informations du package, le téléchargement et l'extraction du package s'effectue de la
façon suivante :
$ PACKAGE_PROTOCOL="http" PACKAGE_URL="downloads.sourceforge.net/expat"
PACKAGE_VERSION="2.1.0" PACKAGE_NAME="expat" PACKAGE_EXTENSION="tar.gz"
PACKAGE_CMD_EXTRACTION="tar zxvf" ./getPackage.sh
--> Récupération du package expat - v2.1.0
--> Téléchargement du package ...
--> Extraction du package ...
--> Nettoyage de l'environement ...
<-- Done.
Une fois effectué, si aucune erreur n'est apparue, voilà ce que l'on doit avoir, à savoir le répertoire contenant
les sources et l'archive :
$ ls -al | grep expat-2.1.0
drwxrwxr-x 13 tgayet tgayet 4096 mars 24 2012 expat-2.1.0
-rw-rw-r-- 1 tgayet tgayet 562616 mars 24 2012 expat-2.1.0.tar.gz
$ cd expat-2.1.0/
$ ls -al
total 980
drwxrwxr-x 13 tgayet tgayet 4096 mars 24 2012 .
drwxrwxr-x 3 tgayet tgayet 4096 janv. 21 13:26 ..
-rw-rw-r-- 1 tgayet tgayet 304569 mars 24 2012 aclocal.m4
drwxrwxr-x 3 tgayet tgayet 4096 mars 24 2012 amiga
drwxrwxr-x 2 tgayet tgayet 4096 mars 24 2012 bcb5
-rw-rw-r-- 1 tgayet tgayet 11379 mars 24 2012 Changes
-rwxrwxr-x 1 tgayet tgayet 3299 mars 5 2012 CMakeLists.txt
-rwxrwxr-x 1 tgayet tgayet 1768 mars 5 2012 CMake.README
-rwxrwxr-x 1 tgayet tgayet 565580 mars 24 2012 configure
-rwxrwxr-x 1 tgayet tgayet 1512 mars 5 2012 ConfigureChecks.cmake
-rw-rw-r-- 1 tgayet tgayet 4652 mars 4 2012 configure.in
drwxrwxr-x 2 tgayet tgayet 4096 mars 24 2012 conftools
-rw-rw-r-- 1 tgayet tgayet 1208 déc. 29 2005 COPYING
drwxrwxr-x 2 tgayet tgayet 4096 mars 24 2012 doc
drwxrwxr-x 2 tgayet tgayet 4096 mars 24 2012 examples
-rwxrwxr-x 1 tgayet tgayet 2735 mars 5 2012 expat_config.h.cmake
-rw-rw-r-- 1 tgayet tgayet 2728 mars 24 2012 expat_config.h.in
-rwxrwxr-x 1 tgayet tgayet 1990 sept. 30 2004 expat.dsw
-rw-rw-r-- 1 tgayet tgayet

231 janv. 19 2009 expat.pc.in

drwxrwxr-x 2 tgayet tgayet 4096 mars 24 2012 lib
drwxrwxr-x 2 tgayet tgayet 4096 mars 24 2012 m4
-rw-rw-r-- 1 tgayet tgayet 7036 mars 18 2012 Makefile.in
-rw-rw-r-- 1 tgayet tgayet 2518 mars 5 2012 MANIFEST
-rw-rw-r-- 1 tgayet tgayet 5790 mars 11 2012 README
drwxrwxr-x 3 tgayet tgayet 4096 mars 24 2012 tests
drwxrwxr-x 2 tgayet tgayet 4096 mars 24 2012 vms
drwxrwxr-x 2 tgayet tgayet 4096 mars 24 2012 win32
drwxrwxr-x 2 tgayet tgayet 4096 mars 24 2012 xmlwf
On vérifie que le package supporte bien le support autotools avec la présence des fichiers « configure.in,
configure, Makefile.in, expat.pc.in ».
Ecrivons maintenant un script qui définera l’environnement pour le script autotools. Au final le script nommé
« build.sh » exécutera le script « configure » :
#!/bin/bash
# – Définition des chemins --export ANDROID_NDK=/opt/android-ndk-r9c/
export DEV_PREFIX=${ANDROID_NDK}/platforms/android-8/arch-arm/
export CROSS_COMPILE=arm-linux-androideabi
export ANDROID_PREFIX=${ANDROID_NDK}/toolchains/arm-linux-androideabi4.8/prebuilt/linux-x86_64
export SYSROOT=${ANDROID_NDK}/platforms/android-8/arch-arm
export CROSS_PATH=${ANDROID_PREFIX}/bin/${CROSS_COMPILE}
export PREFIX=${DEV_PREFIX}/usr
# – déclaration des outils de la toolchain -export CPP=${CROSS_PATH}-cpp
export AR=${CROSS_PATH}-ar
export AS=${CROSS_PATH}-as
export NM=${CROSS_PATH}-nm
export CC=${CROSS_PATH}-gcc
export LD=${CROSS_PATH}-ld
export RANLIB=${CROSS_PATH}-ranlib
export PKG_CONFIG_PATH=${PREFIX}/lib/pkgconfig
export CFLAGS="${CFLAGS} --sysroot=${SYSROOT} -I${SYSROOT}/usr/include -I$
{ANDROID_PREFIX}/include -I${DEV_PREFIX}/android/bionic"
export CPPFLAGS="${CFLAGS}"
export LDFLAGS="${LDFLAGS} -L${SYSROOT}/usr/lib -L${ANDROID_PREFIX}/lib"
./configure --host=${CROSS_COMPILE} --with-sysroot=${SYSROOT} --prefix=${PREFIX} "$@"

Enfin le :
./build.sh
configure: WARNING: if you wanted to set the --build type, don't use --host.
If a cross compiler is detected then cross compile mode will be used
checking build system type... x86_64-unknown-linux-gnu
checking host system type... arm-unknown-linux-androideabi
configure: WARNING: Libtool does not cope well with whitespace in `pwd`
checking how to print strings... printf
checking for arm-linux-androideabi-gcc... /opt/android-ndk-r9//toolchains/arm-linux-androideabi4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... yes
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/armlinux-androideabi-gcc accepts -g... yes
checking for /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linuxandroideabi-gcc option to accept ISO C89... none needed
checking for a sed that does not truncate output... /bin/sed
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking for fgrep... /bin/grep -F
checking for ld used by /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linuxx86_64/bin/arm-linux-androideabi-gcc... /opt/android-ndk-r9//toolchains/arm-linux-androideabi4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ld
checking if the linker (/opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/armlinux-androideabi-ld) is GNU ld... yes
checking for BSD- or MS-compatible name lister (nm)... /opt/android-ndk-r9//toolchains/arm-linuxandroideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-nm
checking the name lister (/opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linuxx86_64/bin/arm-linux-androideabi-nm) interface... BSD nm
checking whether ln -s works... yes
checking the maximum length of command line arguments... 1572864
checking whether the shell understands some XSI constructs... yes
checking whether the shell understands "+="... yes
checking how to convert x86_64-unknown-linux-gnu file names to arm-unknown-linux-androideabi format...
func_convert_file_noop
checking how to convert x86_64-unknown-linux-gnu file names to toolchain format... func_convert_file_noop
checking for /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linuxandroideabi-ld option to reload object files... -r
checking for arm-linux-androideabi-objdump... objdump
checking how to recognize dependent libraries... pass_all
checking for arm-linux-androideabi-dlltool... dlltool
checking how to associate runtime and link libraries... printf %sn
checking for arm-linux-androideabi-ar... /opt/android-ndk-r9//toolchains/arm-linux-androideabi4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar
checking for archiver @FILE support... @
checking for arm-linux-androideabi-strip... no
checking for strip... strip
configure: WARNING: using cross tools not prefixed with host triplet
checking for arm-linux-androideabi-ranlib... /opt/android-ndk-r9//toolchains/arm-linux-androideabi4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ranlib
checking for gawk... gawk
checking command to parse /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linuxx86_64/bin/arm-linux-androideabi-nm output from /opt/android-ndk-r9//toolchains/arm-linux-androideabi4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc object... ok
checking for sysroot... /opt/android-ndk-r9//platforms/android-8/arch-arm
checking for arm-linux-androideabi-mt... no
checking for mt... mt
checking if mt is a manifest tool... no
checking how to run the C preprocessor... /opt/android-ndk-r9//toolchains/arm-linux-androideabi4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-cpp
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking for dlfcn.h... yes
checking for objdir... .libs
checking if /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linuxandroideabi-gcc supports -fno-rtti -fno-exceptions... no
checking for /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linuxandroideabi-gcc option to produce PIC... -fPIC -DPIC
checking if /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linuxandroideabi-gcc PIC flag -fPIC -DPIC works... yes
checking if /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linuxandroideabi-gcc static flag -static works... yes
checking if /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linuxandroideabi-gcc supports -c -o file.o... yes
checking if /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linuxandroideabi-gcc supports -c -o file.o... (cached) yes
checking whether the /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/armlinux-androideabi-gcc linker (/opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linuxx86_64/bin/arm-linux-androideabi-ld) supports shared libraries... yes
checking whether -lc should be explicitly linked in... no
checking dynamic linker characteristics... GNU/Linux ld.so
checking how to hardcode library paths into programs... immediate
checking whether stripping libraries is possible... yes
checking if libtool supports shared libraries... yes
checking whether to build shared libraries... yes
checking whether to build static libraries... yes
checking for arm-linux-androideabi-gcc... (cached) /opt/android-ndk-r9//toolchains/arm-linux-androideabi4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
checking whether we are using the GNU C compiler... (cached) yes
checking whether /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/armlinux-androideabi-gcc accepts -g... (cached) yes
checking for /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linuxandroideabi-gcc option to accept ISO C89... (cached) none needed
checking for arm-linux-androideabi-g++... no
checking for arm-linux-androideabi-c++... no
checking for arm-linux-androideabi-gpp... no
checking for arm-linux-androideabi-aCC... no
checking for arm-linux-androideabi-CC... no
checking for arm-linux-androideabi-cxx... no
checking for arm-linux-androideabi-cc++... no
checking for arm-linux-androideabi-cl.exe... no
checking for arm-linux-androideabi-FCC... no
checking for arm-linux-androideabi-KCC... no
checking for arm-linux-androideabi-RCC... no
checking for arm-linux-androideabi-xlC_r... no
checking for arm-linux-androideabi-xlC... no
checking for g++... g++
checking whether we are using the GNU C++ compiler... yes
checking whether g++ accepts -g... yes
checking how to run the C++ preprocessor... g++ -E
checking for ld used by g++... /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linuxx86_64/bin/arm-linux-androideabi-ld
checking if the linker (/opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/armlinux-androideabi-ld) is GNU ld... yes
checking whether the g++ linker (/opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linuxx86_64/bin/arm-linux-androideabi-ld) supports shared libraries... yes
checking for g++ option to produce PIC... -fPIC -DPIC
checking if g++ PIC flag -fPIC -DPIC works... yes
checking if g++ static flag -static works... no
checking if g++ supports -c -o file.o... yes
checking if g++ supports -c -o file.o... (cached) yes
checking whether the g++ linker (/opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linuxx86_64/bin/arm-linux-androideabi-ld) supports shared libraries... yes
checking dynamic linker characteristics... (cached) GNU/Linux ld.so
checking how to hardcode library paths into programs... immediate
checking for a BSD-compatible install... /usr/bin/install -c
checking whether /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/armlinux-androideabi-gcc accepts -fexceptions... yes
checking for ANSI C header files... (cached) yes
checking whether byte ordering is bigendian... cross-compiling...
unknown
checking to probe for byte ordering... little endian probe OK,
guessing bigendian ...
no
checking for an ANSI C-conforming const... yes
checking for size_t... yes
checking for memmove... yes
checking for bcopy... yes
checking fcntl.h usability... yes
checking fcntl.h presence... yes
checking for fcntl.h... yes
checking for unistd.h... (cached) yes
checking for off_t... yes
checking for stdlib.h... (cached) yes
checking for unistd.h... (cached) yes
checking for sys/param.h... yes
checking for getpagesize... no
checking for working mmap... no
checking for /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linuxandroideabi-gcc option to accept ISO C99... -std=gnu99
checking for /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linuxandroideabi-gcc -std=gnu99 option to accept ISO Standard C... (cached) -std=gnu99
checking for an ANSI C99-conforming __func__... yes
configure: creating ./config.status
config.status: creating Makefile
config.status: WARNING: 'Makefile.in' seems to ignore the --datarootdir setting
config.status: creating expat.pc
config.status: creating expat_config.h
config.status: executing libtool commands
Lançons la compilation :
$ make
/bin/bash ./libtool --silent --mode=compile /opt/android-ndk-r9//toolchains/arm-linux-androideabi4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc -std=gnu99 -I./lib -I. --sysroot=/opt/android-ndkr9//platforms/android-8/arch-arm -I/opt/android-ndk-r9//platforms/android-8/arch-arm/usr/include
-I/opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/include -I/opt/android-ndkr9//platforms/android-8/arch-arm//android/bionic -Wall -Wmissing-prototypes -Wstrict-prototypes -fexceptions
--sysroot=/opt/android-ndk-r9//platforms/android-8/arch-arm -I/opt/android-ndk-r9//platforms/android-8/archarm/usr/include -I/opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/include
-I/opt/android-ndk-r9//platforms/android-8/arch-arm//android/bionic -DHAVE_EXPAT_CONFIG_H -o
lib/xmlparse.lo -c lib/xmlparse.c
/bin/bash ./libtool --silent --mode=compile /opt/android-ndk-r9//toolchains/arm-linux-androideabi4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc -std=gnu99 -I./lib -I. --sysroot=/opt/android-ndkr9//platforms/android-8/arch-arm -I/opt/android-ndk-r9//platforms/android-8/arch-arm/usr/include
-I/opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/include -I/opt/android-ndkr9//platforms/android-8/arch-arm//android/bionic -Wall -Wmissing-prototypes -Wstrict-prototypes -fexceptions
--sysroot=/opt/android-ndk-r9//platforms/android-8/arch-arm -I/opt/android-ndk-r9//platforms/android-8/archarm/usr/include -I/opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/include
-I/opt/android-ndk-r9//platforms/android-8/arch-arm//android/bionic -DHAVE_EXPAT_CONFIG_H -o
lib/xmltok.lo -c lib/xmltok.c
/bin/bash ./libtool --silent --mode=compile /opt/android-ndk-r9//toolchains/arm-linux-androideabi4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc -std=gnu99 -I./lib -I. --sysroot=/opt/android-ndkr9//platforms/android-8/arch-arm -I/opt/android-ndk-r9//platforms/android-8/arch-arm/usr/include
-I/opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/include -I/opt/android-ndkr9//platforms/android-8/arch-arm//android/bionic -Wall -Wmissing-prototypes -Wstrict-prototypes -fexceptions
--sysroot=/opt/android-ndk-r9//platforms/android-8/arch-arm -I/opt/android-ndk-r9//platforms/android-8/archarm/usr/include -I/opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/include
-I/opt/android-ndk-r9//platforms/android-8/arch-arm//android/bionic -DHAVE_EXPAT_CONFIG_H -o
lib/xmlrole.lo -c lib/xmlrole.c
/bin/bash ./libtool --silent --mode=link /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linuxx86_64/bin/arm-linux-androideabi-gcc -std=gnu99 -I./lib -I. --sysroot=/opt/android-ndk-r9//platforms/android8/arch-arm -I/opt/android-ndk-r9//platforms/android-8/arch-arm/usr/include -I/opt/android-ndkr9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/include -I/opt/android-ndk-
r9//platforms/android-8/arch-arm//android/bionic -Wall -Wmissing-prototypes -Wstrict-prototypes -fexceptions
--sysroot=/opt/android-ndk-r9//platforms/android-8/arch-arm -I/opt/android-ndk-r9//platforms/android-8/archarm/usr/include -I/opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/include
-I/opt/android-ndk-r9//platforms/android-8/arch-arm//android/bionic -DHAVE_EXPAT_CONFIG_H -noundefined -version-info 7:0:6 -rpath /opt/android-ndk-r9//platforms/android-8/arch-arm//usr/lib -L/opt/androidndk-r9//platforms/android-8/arch-arm/usr/lib -L/opt/android-ndk-r9//toolchains/arm-linux-androideabi4.8/prebuilt/linux-x86_64/lib -o libexpat.la lib/xmlparse.lo lib/xmltok.lo lib/xmlrole.lo
/opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
-std=gnu99 -I./lib -I. --sysroot=/opt/android-ndk-r9//platforms/android-8/arch-arm -I/opt/android-ndkr9//platforms/android-8/arch-arm/usr/include -I/opt/android-ndk-r9//toolchains/arm-linux-androideabi4.8/prebuilt/linux-x86_64/include -I/opt/android-ndk-r9//platforms/android-8/arch-arm//android/bionic -Wall
-Wmissing-prototypes -Wstrict-prototypes -fexceptions --sysroot=/opt/android-ndk-r9//platforms/android8/arch-arm -I/opt/android-ndk-r9//platforms/android-8/arch-arm/usr/include -I/opt/android-ndkr9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/include -I/opt/android-ndkr9//platforms/android-8/arch-arm//android/bionic -DHAVE_EXPAT_CONFIG_H -o xmlwf/xmlwf.o -c
xmlwf/xmlwf.c
/opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
-std=gnu99 -I./lib -I. --sysroot=/opt/android-ndk-r9//platforms/android-8/arch-arm -I/opt/android-ndkr9//platforms/android-8/arch-arm/usr/include -I/opt/android-ndk-r9//toolchains/arm-linux-androideabi4.8/prebuilt/linux-x86_64/include -I/opt/android-ndk-r9//platforms/android-8/arch-arm//android/bionic -Wall
-Wmissing-prototypes -Wstrict-prototypes -fexceptions --sysroot=/opt/android-ndk-r9//platforms/android8/arch-arm -I/opt/android-ndk-r9//platforms/android-8/arch-arm/usr/include -I/opt/android-ndkr9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/include -I/opt/android-ndkr9//platforms/android-8/arch-arm//android/bionic -DHAVE_EXPAT_CONFIG_H -o xmlwf/xmlfile.o -c
xmlwf/xmlfile.c
/opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
-std=gnu99 -I./lib -I. --sysroot=/opt/android-ndk-r9//platforms/android-8/arch-arm -I/opt/android-ndkr9//platforms/android-8/arch-arm/usr/include -I/opt/android-ndk-r9//toolchains/arm-linux-androideabi4.8/prebuilt/linux-x86_64/include -I/opt/android-ndk-r9//platforms/android-8/arch-arm//android/bionic -Wall
-Wmissing-prototypes -Wstrict-prototypes -fexceptions --sysroot=/opt/android-ndk-r9//platforms/android8/arch-arm -I/opt/android-ndk-r9//platforms/android-8/arch-arm/usr/include -I/opt/android-ndkr9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/include -I/opt/android-ndkr9//platforms/android-8/arch-arm//android/bionic -DHAVE_EXPAT_CONFIG_H -o xmlwf/codepage.o -c
xmlwf/codepage.c
/opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
-std=gnu99 -I./lib -I. --sysroot=/opt/android-ndk-r9//platforms/android-8/arch-arm -I/opt/android-ndkr9//platforms/android-8/arch-arm/usr/include -I/opt/android-ndk-r9//toolchains/arm-linux-androideabi4.8/prebuilt/linux-x86_64/include -I/opt/android-ndk-r9//platforms/android-8/arch-arm//android/bionic -Wall
-Wmissing-prototypes -Wstrict-prototypes -fexceptions --sysroot=/opt/android-ndk-r9//platforms/android8/arch-arm -I/opt/android-ndk-r9//platforms/android-8/arch-arm/usr/include -I/opt/android-ndkr9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/include -I/opt/android-ndkr9//platforms/android-8/arch-arm//android/bionic -DHAVE_EXPAT_CONFIG_H -o xmlwf/readfilemap.o -c
xmlwf/readfilemap.c
/bin/bash ./libtool --silent --mode=link /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linuxx86_64/bin/arm-linux-androideabi-gcc -std=gnu99 -I./lib -I. --sysroot=/opt/android-ndk-r9//platforms/android8/arch-arm -I/opt/android-ndk-r9//platforms/android-8/arch-arm/usr/include -I/opt/android-ndkr9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/include -I/opt/android-ndkr9//platforms/android-8/arch-arm//android/bionic -Wall -Wmissing-prototypes -Wstrict-prototypes -fexceptions
--sysroot=/opt/android-ndk-r9//platforms/android-8/arch-arm -I/opt/android-ndk-r9//platforms/android-8/archarm/usr/include -I/opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/include
-I/opt/android-ndk-r9//platforms/android-8/arch-arm//android/bionic -DHAVE_EXPAT_CONFIG_H
-L/opt/android-ndk-r9//platforms/android-8/arch-arm/usr/lib -L/opt/android-ndk-r9//toolchains/arm-linuxandroideabi-4.8/prebuilt/linux-x86_64/lib -o xmlwf/xmlwf xmlwf/xmlwf.o xmlwf/xmlfile.o xmlwf/codepage.o
xmlwf/readfilemap.o libexpat.la
L'installation se fera dans le NDK android pour pouvoir gérer les dépendances entre paquets cross-compilés.
Pour ce faire le paramètre « prefix » du script autotools a été adapté en conséquence. Il aurait été possible
de laisser le prefix à la valeur usuelle comme « /usr » et en définissant le paramètre DESTDIR pour préciser
la racine tu rootfs :
$ make install
/bin/bash ./conftools/mkinstalldirs /opt/android-ndk-r9//platforms/android-8/arch-arm//usr/lib /opt/android-ndkr9//platforms/android-8/arch-arm//usr/include /opt/android-ndk-r9//platforms/android-8/arch-
arm//usr/lib/pkgconfig
/bin/bash ./libtool --mode=install /usr/bin/install -c libexpat.la /opt/android-ndk-r9//platforms/android-8/archarm//usr/lib/libexpat.la
libtool: install: /usr/bin/install -c .libs/libexpat.so.1.6.0 /opt/android-ndk-r9//platforms/android-8/archarm//usr/lib/libexpat.so.1.6.0
libtool: install: (cd /opt/android-ndk-r9//platforms/android-8/arch-arm//usr/lib && { ln -s -f libexpat.so.1.6.0
libexpat.so.1 || { rm -f libexpat.so.1 && ln -s libexpat.so.1.6.0 libexpat.so.1; }; })
libtool: install: (cd /opt/android-ndk-r9//platforms/android-8/arch-arm//usr/lib && { ln -s -f libexpat.so.1.6.0
libexpat.so || { rm -f libexpat.so && ln -s libexpat.so.1.6.0 libexpat.so; }; })
libtool: install: /usr/bin/install -c .libs/libexpat.lai /opt/android-ndk-r9//platforms/android$ make install
/bin/bash ./conftools/mkinstalldirs /opt/android-ndk-r9//platforms/android-8/arch-arm//usr/lib /opt/android-ndkr9//platforms/android-8/arch-arm//usr/include /opt/android-ndk-r9//platforms/android-8/archarm//usr/lib/pkgconfig
/bin/bash ./libtool --mode=install /usr/bin/install -c libexpat.la /opt/android-ndk-r9//platforms/android-8/archarm//usr/lib/libexpat.la
libtool: install: /usr/bin/install -c .libs/libexpat.so.1.6.0 /opt/android-ndk-r9//platforms/android-8/archarm//usr/lib/libexpat.so.1.6.0
libtool: install: (cd /opt/android-ndk-r9//platforms/android-8/arch-arm//usr/lib && { ln -s -f libexpat.so.1.6.0
libexpat.so.1 || { rm -f libexpat.so.1 && ln -s libexpat.so.1.6.0 libexpat.so.1; }; })
libtool: install: (cd /opt/android-ndk-r9//platforms/android-8/arch-arm//usr/lib && { ln -s -f libexpat.so.1.6.0
libexpat.so || { rm -f libexpat.so && ln -s libexpat.so.1.6.0 libexpat.so; }; })
libtool: install: /usr/bin/install -c .libs/libexpat.lai /opt/android-ndk-r9//platforms/android-8/archarm//usr/lib/libexpat.la
libtool: install: /usr/bin/install -c .libs/libexpat.a /opt/android-ndk-r9//platforms/android-8/archarm//usr/lib/libexpat.a
libtool: install: chmod 644 /opt/android-ndk-r9//platforms/android-8/arch-arm//usr/lib/libexpat.a
libtool: install: /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linuxandroideabi-ranlib /opt/android-ndk-r9//platforms/android-8/arch-arm//usr/lib/libexpat.a-8/archarm//usr/lib/libexpat.la
libtool: install: /usr/bin/install -c .libs/libexpat.a /opt/android-ndk-r9//platforms/android-8/archarm//usr/lib/libexpat.a
libtool: install: chmod 644 /opt/android-ndk-r9//platforms/android-8/arch-arm//usr/lib/libexpat.a
libtool: install: /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linuxandroideabi-ranlib /opt/android-ndk-r9//platforms/android-8/arch-arm//usr/lib/libexpat.a
Voila c'est terminé pour autotools.

6. Cross-compilation d'un package à base de cmake
Pour cmake, je vais rester toujours sur le package libexpat qui propose aussi un support pour cmake avec le
fichier « CMakeLists.txt ».
Avant de commencer téléchargeons le script de wrapping android pour cmake que nous allons mettre
également dans /opt :
$ cd /opt
$ sudo git clone https://github.com/taka-no-me/android-cmake.git

Ce script propose l'utilisation suivante pour la plateforme GNU/Linux :
$ export ANDROID_NDK=/absolute/path/to/the/android-ndk
$ mkdir build && cd build
$ cmake -DCMAKE_TOOLCHAIN_FILE=path/to/the/android.toolchain.cmake ..
$ make -j8

Pour notre cas cela va devenir :
$ export ANDROID_NDK=/opt/android-ndk-r9c
$ mkdir androidbuild && cd androidbuild
$ cmake -DCMAKE_TOOLCHAIN_FILE=/opt/android-cmake/android.toolchain.cmake ..
$ export ANDROID_NDK=/opt/android-ndk-r9c
$ mkdir androidbuild && cd androidbuild
$ cmake -DCMAKE_TOOLCHAIN_FILE=/opt/android-cmake/android.toolchain.cmake ..
-- Looking for dlfcn.h
-- Looking for dlfcn.h - found
-- Looking for fcntl.h
-- Looking for fcntl.h - found
-- Looking for inttypes.h
-- Looking for inttypes.h - found
-- Looking for memory.h
-- Looking for memory.h - found
-- Looking for stdint.h
-- Looking for stdint.h - found
-- Looking for stdlib.h
-- Looking for stdlib.h - found
-- Looking for strings.h
-- Looking for strings.h - found
-- Looking for string.h
-- Looking for string.h - found
-- Looking for sys/stat.h
-- Looking for sys/stat.h - found
-- Looking for sys/types.h
-- Looking for sys/types.h - found
-- Looking for unistd.h
-- Looking for unistd.h - found
-- Looking for getpagesize
-- Looking for getpagesize - not found
-- Looking for bcopy
-- Looking for bcopy - found
-- Looking for memmove
-- Looking for memmove - found
-- Looking for mmap
-- Looking for mmap - found
-- Looking for 4 include files stdlib.h, ..., float.h
-- Looking for 4 include files stdlib.h, ..., float.h - found
-- Check if the system is big endian
-- Searching 16 bit integer
-- Looking for stddef.h
-- Looking for stddef.h - found
-- Check size of unsigned short
-- Check size of unsigned short - done
-- Using unsigned short
-- Check if the system is big endian - little endian
-- Looking for off_t
-- Looking for off_t - not found
-- Looking for size_t
-- Looking for size_t - not found
-- Configuring done
-- Generating done
-- Build files have been written to: /home/tgayet/Documents/articles_lm/cross-compilation android/expat2.1.0/androidbuild

Cette étape permet de préparer le projet de façon à permettre un build :
$ make
Scanning dependencies of target expat
[ 5%] Building C object CMakeFiles/expat.dir/lib/xmlparse.c.o
[ 11%] Building C object CMakeFiles/expat.dir/lib/xmlrole.c.o
[ 17%] Building C object CMakeFiles/expat.dir/lib/xmltok.c.o
[ 23%] Building C object CMakeFiles/expat.dir/lib/xmltok_impl.c.o
[ 29%] Building C object CMakeFiles/expat.dir/lib/xmltok_ns.c.o
Linking C shared library ../libs/armeabi-v7a/libexpat.so
[ 29%] Built target expat
Scanning dependencies of target elements
[ 35%] Building C object CMakeFiles/elements.dir/examples/elements.c.o
Linking C executable ../bin/elements
[ 35%] Built target elements
Scanning dependencies of target outline
[ 41%] Building C object CMakeFiles/outline.dir/examples/outline.c.o
Linking C executable ../bin/outline
[ 41%] Built target outline
Scanning dependencies of target runtests
[ 47%] Building C object CMakeFiles/runtests.dir/tests/runtests.c.o
[ 52%] Building C object CMakeFiles/runtests.dir/tests/chardata.c.o
[ 58%] Building C object CMakeFiles/runtests.dir/tests/minicheck.c.o
Linking C executable ../bin/runtests
[ 58%] Built target runtests
Scanning dependencies of target runtestspp
[ 64%] Building CXX object CMakeFiles/runtestspp.dir/tests/runtestspp.cpp.o
In file included from /home/tgayet/Documents/articles_lm/cross-compilation android/expat2.1.0/tests/runtests.c:19:0,
from /home/tgayet/Documents/articles_lm/cross-compilation android/expat2.1.0/tests/runtestspp.cpp:6:
/home/tgayet/Documents/articles_lm/cross-compilation android/expat-2.1.0/tests/runtests.c: In function 'void
basic_setup()':
(...)

^
[ 70%] Building C object CMakeFiles/runtestspp.dir/tests/chardata.c.o
[ 76%] Building C object CMakeFiles/runtestspp.dir/tests/minicheck.c.o
Linking CXX executable ../bin/runtestspp
[ 76%] Built target runtestspp
Scanning dependencies of target xmlwf
[ 82%] Building C object CMakeFiles/xmlwf.dir/xmlwf/xmlwf.c.o
[ 88%] Building C object CMakeFiles/xmlwf.dir/xmlwf/xmlfile.c.o
[ 94%] Building C object CMakeFiles/xmlwf.dir/xmlwf/codepage.c.o
[100%] Building C object CMakeFiles/xmlwf.dir/xmlwf/readfilemap.c.o
Linking C executable ../bin/xmlwf
[100%] Built target xmlwf

Une version moins silentieuse peut être demandé :
$ make VERBOSE=1

L'installation est aussi simple :
$ sudo make install
[ 29%] Built target expat
[ 35%] Built target elements
[ 41%] Built target outline
[ 58%] Built target runtests
[ 76%] Built target runtestspp
[100%] Built target xmlwf
Install the project...
-- Install configuration: ""
-- Up-to-date: /opt/android-ndk-r9c/toolchains/arm-linux-androideabi-4.8/prebuilt/linuxx86_64/user/lib/libexpat.so
-- Up-to-date: /opt/android-ndk-r9c/toolchains/arm-linux-androideabi-4.8/prebuilt/linuxx86_64/user/include/expat.h
-- Up-to-date: /opt/android-ndk-r9c/toolchains/arm-linux-androideabi-4.8/prebuilt/linuxx86_64/user/include/expat_external.h
-- Up-to-date: /opt/android-ndk-r9c/toolchains/arm-linux-androideabi-4.8/prebuilt/linuxx86_64/user/lib/pkgconfig/expat.pc
-- Up-to-date: /opt/android-ndk-r9c/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/user/bin/xmlwf
-- Up-to-date: /opt/android-ndk-r9c/toolchains/arm-linux-androideabi-4.8/prebuilt/linuxx86_64/user/share/man/man1/xmlwf.1

7. Conclusion
Avec ces deux recettes, il nous sera possible de cross-compiler nombre packages via la toolchain
android sur le même modèle.

8. Liens
•
•
•
•
•

http://www.linuxfromscratch.org/blfs/view/svn/general/expat.html
http://developer.android.com/tools/sdk/ndk/index.html
https://github.com/android/platform_bionic
http://elinux.org/Android_Notes#C_Library_.28bionic.29_info
http://developer.android.com/index.html
•
•
•
•
•
•

http://source.android.com/
http://en.wikipedia.org/wiki/Bionic_(software)
http://stackoverflow.com/questions/19343797/building-a-toolchain-with-cmake-to-crosscompile-for-android
http://www.nextinnovation.org/doku.php?id=android_toolchain
http://www.nextinnovation.org/doku.php?id=android_scratchbox
https://github.com/taka-no-me/android-cmake/blob/master/android.toolchain.cmake

Más contenido relacionado

La actualidad más candente

Kernel Recipes 2016 - Upstream Kernel Graphics is (Finally) Winning
Kernel Recipes 2016 - Upstream Kernel Graphics is (Finally) WinningKernel Recipes 2016 - Upstream Kernel Graphics is (Finally) Winning
Kernel Recipes 2016 - Upstream Kernel Graphics is (Finally) WinningAnne Nicolas
 
Startup Containers in Lightning Speed with Lazy Image Distribution
Startup Containers in Lightning Speed with Lazy Image DistributionStartup Containers in Lightning Speed with Lazy Image Distribution
Startup Containers in Lightning Speed with Lazy Image DistributionKohei Tokunaga
 
SCALE 2011 Deploying OpenStack with Chef
SCALE 2011 Deploying OpenStack with ChefSCALE 2011 Deploying OpenStack with Chef
SCALE 2011 Deploying OpenStack with ChefMatt Ray
 
Stargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動する
Stargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動するStargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動する
Stargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動するKohei Tokunaga
 
[COSCUP 2021] LLVM Project: The Good, The Bad, and The Ugly
[COSCUP 2021] LLVM Project: The Good, The Bad, and The Ugly[COSCUP 2021] LLVM Project: The Good, The Bad, and The Ugly
[COSCUP 2021] LLVM Project: The Good, The Bad, and The UglyMin-Yih Hsu
 
Embedded Recipes 2019 - Testing firmware the devops way
Embedded Recipes 2019 - Testing firmware the devops wayEmbedded Recipes 2019 - Testing firmware the devops way
Embedded Recipes 2019 - Testing firmware the devops wayAnne Nicolas
 
[KubeCon NA 2020] containerd: Rootless Containers 2020
[KubeCon NA 2020] containerd: Rootless Containers 2020[KubeCon NA 2020] containerd: Rootless Containers 2020
[KubeCon NA 2020] containerd: Rootless Containers 2020Akihiro Suda
 
Kernel Recipes 2016 - Landlock LSM: Unprivileged sandboxing
Kernel Recipes 2016 - Landlock LSM: Unprivileged sandboxingKernel Recipes 2016 - Landlock LSM: Unprivileged sandboxing
Kernel Recipes 2016 - Landlock LSM: Unprivileged sandboxingAnne Nicolas
 
Comparing Next-Generation Container Image Building Tools
 Comparing Next-Generation Container Image Building Tools Comparing Next-Generation Container Image Building Tools
Comparing Next-Generation Container Image Building ToolsAkihiro Suda
 
eStargzイメージとlazy pullingによる高速なコンテナ起動
eStargzイメージとlazy pullingによる高速なコンテナ起動eStargzイメージとlazy pullingによる高速なコンテナ起動
eStargzイメージとlazy pullingによる高速なコンテナ起動Kohei Tokunaga
 
Daneyon Hansen - Intro to OpenStack - Feb13 OpenStack Denver Meetup
Daneyon Hansen - Intro to OpenStack - Feb13 OpenStack Denver MeetupDaneyon Hansen - Intro to OpenStack - Feb13 OpenStack Denver Meetup
Daneyon Hansen - Intro to OpenStack - Feb13 OpenStack Denver MeetupShannon McFarland
 
[KubeCon EU 2020] containerd Deep Dive
[KubeCon EU 2020] containerd Deep Dive[KubeCon EU 2020] containerd Deep Dive
[KubeCon EU 2020] containerd Deep DiveAkihiro Suda
 
The State of Rootless Containers
The State of Rootless ContainersThe State of Rootless Containers
The State of Rootless ContainersAkihiro Suda
 
Secure container: Kata container and gVisor
Secure container: Kata container and gVisorSecure container: Kata container and gVisor
Secure container: Kata container and gVisorChing-Hsuan Yen
 
[Paris Container Day 2021] nerdctl: yet another Docker & Docker Compose imple...
[Paris Container Day 2021] nerdctl: yet another Docker & Docker Compose imple...[Paris Container Day 2021] nerdctl: yet another Docker & Docker Compose imple...
[Paris Container Day 2021] nerdctl: yet another Docker & Docker Compose imple...Akihiro Suda
 
BuildKitでLazy Pullを有効にしてビルドを早くする話
BuildKitでLazy Pullを有効にしてビルドを早くする話BuildKitでLazy Pullを有効にしてビルドを早くする話
BuildKitでLazy Pullを有効にしてビルドを早くする話Kohei Tokunaga
 
Build and Run Containers With Lazy Pulling - Adoption status of containerd St...
Build and Run Containers With Lazy Pulling - Adoption status of containerd St...Build and Run Containers With Lazy Pulling - Adoption status of containerd St...
Build and Run Containers With Lazy Pulling - Adoption status of containerd St...Kohei Tokunaga
 

La actualidad más candente (20)

Kernel Recipes 2016 - Upstream Kernel Graphics is (Finally) Winning
Kernel Recipes 2016 - Upstream Kernel Graphics is (Finally) WinningKernel Recipes 2016 - Upstream Kernel Graphics is (Finally) Winning
Kernel Recipes 2016 - Upstream Kernel Graphics is (Finally) Winning
 
Startup Containers in Lightning Speed with Lazy Image Distribution
Startup Containers in Lightning Speed with Lazy Image DistributionStartup Containers in Lightning Speed with Lazy Image Distribution
Startup Containers in Lightning Speed with Lazy Image Distribution
 
SCALE 2011 Deploying OpenStack with Chef
SCALE 2011 Deploying OpenStack with ChefSCALE 2011 Deploying OpenStack with Chef
SCALE 2011 Deploying OpenStack with Chef
 
Stargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動する
Stargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動するStargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動する
Stargz Snapshotter: イメージのpullを省略しcontainerdでコンテナを高速に起動する
 
[COSCUP 2021] LLVM Project: The Good, The Bad, and The Ugly
[COSCUP 2021] LLVM Project: The Good, The Bad, and The Ugly[COSCUP 2021] LLVM Project: The Good, The Bad, and The Ugly
[COSCUP 2021] LLVM Project: The Good, The Bad, and The Ugly
 
Embedded Recipes 2019 - Testing firmware the devops way
Embedded Recipes 2019 - Testing firmware the devops wayEmbedded Recipes 2019 - Testing firmware the devops way
Embedded Recipes 2019 - Testing firmware the devops way
 
[KubeCon NA 2020] containerd: Rootless Containers 2020
[KubeCon NA 2020] containerd: Rootless Containers 2020[KubeCon NA 2020] containerd: Rootless Containers 2020
[KubeCon NA 2020] containerd: Rootless Containers 2020
 
Learning kubernetes
Learning kubernetesLearning kubernetes
Learning kubernetes
 
Kernel Recipes 2016 - Landlock LSM: Unprivileged sandboxing
Kernel Recipes 2016 - Landlock LSM: Unprivileged sandboxingKernel Recipes 2016 - Landlock LSM: Unprivileged sandboxing
Kernel Recipes 2016 - Landlock LSM: Unprivileged sandboxing
 
ISC HPCW talks
ISC HPCW talksISC HPCW talks
ISC HPCW talks
 
Comparing Next-Generation Container Image Building Tools
 Comparing Next-Generation Container Image Building Tools Comparing Next-Generation Container Image Building Tools
Comparing Next-Generation Container Image Building Tools
 
eStargzイメージとlazy pullingによる高速なコンテナ起動
eStargzイメージとlazy pullingによる高速なコンテナ起動eStargzイメージとlazy pullingによる高速なコンテナ起動
eStargzイメージとlazy pullingによる高速なコンテナ起動
 
Daneyon Hansen - Intro to OpenStack - Feb13 OpenStack Denver Meetup
Daneyon Hansen - Intro to OpenStack - Feb13 OpenStack Denver MeetupDaneyon Hansen - Intro to OpenStack - Feb13 OpenStack Denver Meetup
Daneyon Hansen - Intro to OpenStack - Feb13 OpenStack Denver Meetup
 
[KubeCon EU 2020] containerd Deep Dive
[KubeCon EU 2020] containerd Deep Dive[KubeCon EU 2020] containerd Deep Dive
[KubeCon EU 2020] containerd Deep Dive
 
The State of Rootless Containers
The State of Rootless ContainersThe State of Rootless Containers
The State of Rootless Containers
 
Secure container: Kata container and gVisor
Secure container: Kata container and gVisorSecure container: Kata container and gVisor
Secure container: Kata container and gVisor
 
[Paris Container Day 2021] nerdctl: yet another Docker & Docker Compose imple...
[Paris Container Day 2021] nerdctl: yet another Docker & Docker Compose imple...[Paris Container Day 2021] nerdctl: yet another Docker & Docker Compose imple...
[Paris Container Day 2021] nerdctl: yet another Docker & Docker Compose imple...
 
BuildKitでLazy Pullを有効にしてビルドを早くする話
BuildKitでLazy Pullを有効にしてビルドを早くする話BuildKitでLazy Pullを有効にしてビルドを早くする話
BuildKitでLazy Pullを有効にしてビルドを早くする話
 
Build and Run Containers With Lazy Pulling - Adoption status of containerd St...
Build and Run Containers With Lazy Pulling - Adoption status of containerd St...Build and Run Containers With Lazy Pulling - Adoption status of containerd St...
Build and Run Containers With Lazy Pulling - Adoption status of containerd St...
 
There is more to C
There is more to CThere is more to C
There is more to C
 

Destacado

Cooperation au developpement, Koutiala (Mali) Le sursaut local (brochure, …
Cooperation au developpement, Koutiala (Mali) Le sursaut local (brochure, …Cooperation au developpement, Koutiala (Mali) Le sursaut local (brochure, …
Cooperation au developpement, Koutiala (Mali) Le sursaut local (brochure, …regiosuisse
 
MAL MANEJO DE LOS ALIMENTOS COMO LA LECHE
MAL  MANEJO DE LOS ALIMENTOS  COMO LA LECHEMAL  MANEJO DE LOS ALIMENTOS  COMO LA LECHE
MAL MANEJO DE LOS ALIMENTOS COMO LA LECHEmapa030497
 
Monstre De Banyoles
Monstre De BanyolesMonstre De Banyoles
Monstre De Banyolescosterets 1b
 
Los Animales
Los AnimalesLos Animales
Los Animaleselenaem
 
Acompañamiento tutorial de un e mediador en ava
Acompañamiento tutorial de un e mediador en avaAcompañamiento tutorial de un e mediador en ava
Acompañamiento tutorial de un e mediador en ava1961catalina
 
Présentation Zotero Journée du Personnel DBIST - Janvier 2012
Présentation Zotero Journée du Personnel DBIST - Janvier 2012Présentation Zotero Journée du Personnel DBIST - Janvier 2012
Présentation Zotero Journée du Personnel DBIST - Janvier 2012Magalie Le Gall
 
1 lederniermot
1 lederniermot1 lederniermot
1 lederniermotcatavrio
 
Du programme au chantier
Du programme au chantier Du programme au chantier
Du programme au chantier Magalie Le Gall
 
Remise Des Prix Olympiades De GéOsciences 19 Juin 2009
Remise Des Prix Olympiades De GéOsciences 19 Juin 2009Remise Des Prix Olympiades De GéOsciences 19 Juin 2009
Remise Des Prix Olympiades De GéOsciences 19 Juin 2009gawronski
 
Check up de_vieux..
Check up de_vieux..Check up de_vieux..
Check up de_vieux..catavrio
 
Professions
ProfessionsProfessions
Professionscatavrio
 
Quel est le_prix_de_la_beaute
Quel est le_prix_de_la_beauteQuel est le_prix_de_la_beaute
Quel est le_prix_de_la_beautecatavrio
 
Urbanisme et tourisme Crans-Montana
Urbanisme et tourisme Crans-MontanaUrbanisme et tourisme Crans-Montana
Urbanisme et tourisme Crans-Montanaregiosuisse
 
Tipos de redes
Tipos de redesTipos de redes
Tipos de redesAlan Giani
 
Beaujolaisnouveau
BeaujolaisnouveauBeaujolaisnouveau
Beaujolaisnouveaucatavrio
 

Destacado (20)

Cooperation au developpement, Koutiala (Mali) Le sursaut local (brochure, …
Cooperation au developpement, Koutiala (Mali) Le sursaut local (brochure, …Cooperation au developpement, Koutiala (Mali) Le sursaut local (brochure, …
Cooperation au developpement, Koutiala (Mali) Le sursaut local (brochure, …
 
MAL MANEJO DE LOS ALIMENTOS COMO LA LECHE
MAL  MANEJO DE LOS ALIMENTOS  COMO LA LECHEMAL  MANEJO DE LOS ALIMENTOS  COMO LA LECHE
MAL MANEJO DE LOS ALIMENTOS COMO LA LECHE
 
Monstre De Banyoles
Monstre De BanyolesMonstre De Banyoles
Monstre De Banyoles
 
Los Animales
Los AnimalesLos Animales
Los Animales
 
Illusion4
Illusion4Illusion4
Illusion4
 
Les Debutants 2007 2008
Les Debutants 2007 2008Les Debutants 2007 2008
Les Debutants 2007 2008
 
Acompañamiento tutorial de un e mediador en ava
Acompañamiento tutorial de un e mediador en avaAcompañamiento tutorial de un e mediador en ava
Acompañamiento tutorial de un e mediador en ava
 
Présentation Zotero Journée du Personnel DBIST - Janvier 2012
Présentation Zotero Journée du Personnel DBIST - Janvier 2012Présentation Zotero Journée du Personnel DBIST - Janvier 2012
Présentation Zotero Journée du Personnel DBIST - Janvier 2012
 
1 lederniermot
1 lederniermot1 lederniermot
1 lederniermot
 
Du programme au chantier
Du programme au chantier Du programme au chantier
Du programme au chantier
 
Pais Virtual De Frances Marina Vicky
Pais Virtual De Frances Marina VickyPais Virtual De Frances Marina Vicky
Pais Virtual De Frances Marina Vicky
 
Como enfrentar el estrés
Como enfrentar el estrésComo enfrentar el estrés
Como enfrentar el estrés
 
Remise Des Prix Olympiades De GéOsciences 19 Juin 2009
Remise Des Prix Olympiades De GéOsciences 19 Juin 2009Remise Des Prix Olympiades De GéOsciences 19 Juin 2009
Remise Des Prix Olympiades De GéOsciences 19 Juin 2009
 
4
44
4
 
Check up de_vieux..
Check up de_vieux..Check up de_vieux..
Check up de_vieux..
 
Professions
ProfessionsProfessions
Professions
 
Quel est le_prix_de_la_beaute
Quel est le_prix_de_la_beauteQuel est le_prix_de_la_beaute
Quel est le_prix_de_la_beaute
 
Urbanisme et tourisme Crans-Montana
Urbanisme et tourisme Crans-MontanaUrbanisme et tourisme Crans-Montana
Urbanisme et tourisme Crans-Montana
 
Tipos de redes
Tipos de redesTipos de redes
Tipos de redes
 
Beaujolaisnouveau
BeaujolaisnouveauBeaujolaisnouveau
Beaujolaisnouveau
 

Similar a Cross-compiling Android with autotools or cmake

First Steps Developing Embedded Applications using Heterogeneous Multi-core P...
First Steps Developing Embedded Applications using Heterogeneous Multi-core P...First Steps Developing Embedded Applications using Heterogeneous Multi-core P...
First Steps Developing Embedded Applications using Heterogeneous Multi-core P...Toradex
 
Docker Multi-arch All The Things
Docker Multi-arch All The ThingsDocker Multi-arch All The Things
Docker Multi-arch All The ThingsDocker, Inc.
 
Coscup2018 itri android-in-cloud
Coscup2018 itri android-in-cloudCoscup2018 itri android-in-cloud
Coscup2018 itri android-in-cloudTian-Jian Wu
 
Advance Android Application Development
Advance Android Application DevelopmentAdvance Android Application Development
Advance Android Application DevelopmentRamesh Prasad
 
stackconf 2022: Cluster Management: Heterogeneous, Lightweight, Safe. Pick Three
stackconf 2022: Cluster Management: Heterogeneous, Lightweight, Safe. Pick Threestackconf 2022: Cluster Management: Heterogeneous, Lightweight, Safe. Pick Three
stackconf 2022: Cluster Management: Heterogeneous, Lightweight, Safe. Pick ThreeNETWAYS
 
Using the android ndk - DroidCon Paris 2014
Using the android ndk - DroidCon Paris 2014Using the android ndk - DroidCon Paris 2014
Using the android ndk - DroidCon Paris 2014Paris Android User Group
 
Building Embedded Linux Full Tutorial for ARM
Building Embedded Linux Full Tutorial for ARMBuilding Embedded Linux Full Tutorial for ARM
Building Embedded Linux Full Tutorial for ARMSherif Mousa
 
Using open source software to build an industrial grade embedded linux platfo...
Using open source software to build an industrial grade embedded linux platfo...Using open source software to build an industrial grade embedded linux platfo...
Using open source software to build an industrial grade embedded linux platfo...SZ Lin
 
Android on IA devices and Intel Tools
Android on IA devices and Intel ToolsAndroid on IA devices and Intel Tools
Android on IA devices and Intel ToolsXavier Hallade
 
Dev opsec dockerimage_patch_n_lifecyclemanagement_2019
Dev opsec dockerimage_patch_n_lifecyclemanagement_2019Dev opsec dockerimage_patch_n_lifecyclemanagement_2019
Dev opsec dockerimage_patch_n_lifecyclemanagement_2019kanedafromparis
 
Module 4 Embedded Linux
Module 4 Embedded LinuxModule 4 Embedded Linux
Module 4 Embedded LinuxTushar B Kute
 
Android Native Development Kit
Android Native Development KitAndroid Native Development Kit
Android Native Development KitPeter R. Egli
 
Accelerate your development with Docker
Accelerate your development with DockerAccelerate your development with Docker
Accelerate your development with DockerAndrey Hristov
 
Accelerate your software development with Docker
Accelerate your software development with DockerAccelerate your software development with Docker
Accelerate your software development with DockerAndrey Hristov
 
Developing Applications for Beagle Bone Black, Raspberry Pi and SoC Single Bo...
Developing Applications for Beagle Bone Black, Raspberry Pi and SoC Single Bo...Developing Applications for Beagle Bone Black, Raspberry Pi and SoC Single Bo...
Developing Applications for Beagle Bone Black, Raspberry Pi and SoC Single Bo...ryancox
 
Evolution of containers to kubernetes
Evolution of containers to kubernetesEvolution of containers to kubernetes
Evolution of containers to kubernetesKrishna-Kumar
 

Similar a Cross-compiling Android with autotools or cmake (20)

First Steps Developing Embedded Applications using Heterogeneous Multi-core P...
First Steps Developing Embedded Applications using Heterogeneous Multi-core P...First Steps Developing Embedded Applications using Heterogeneous Multi-core P...
First Steps Developing Embedded Applications using Heterogeneous Multi-core P...
 
Docker Multi-arch All The Things
Docker Multi-arch All The ThingsDocker Multi-arch All The Things
Docker Multi-arch All The Things
 
Coscup2018 itri android-in-cloud
Coscup2018 itri android-in-cloudCoscup2018 itri android-in-cloud
Coscup2018 itri android-in-cloud
 
Advance Android Application Development
Advance Android Application DevelopmentAdvance Android Application Development
Advance Android Application Development
 
stackconf 2022: Cluster Management: Heterogeneous, Lightweight, Safe. Pick Three
stackconf 2022: Cluster Management: Heterogeneous, Lightweight, Safe. Pick Threestackconf 2022: Cluster Management: Heterogeneous, Lightweight, Safe. Pick Three
stackconf 2022: Cluster Management: Heterogeneous, Lightweight, Safe. Pick Three
 
Building
BuildingBuilding
Building
 
Using the android ndk - DroidCon Paris 2014
Using the android ndk - DroidCon Paris 2014Using the android ndk - DroidCon Paris 2014
Using the android ndk - DroidCon Paris 2014
 
Introduction to Docker
Introduction to DockerIntroduction to Docker
Introduction to Docker
 
Building Embedded Linux Full Tutorial for ARM
Building Embedded Linux Full Tutorial for ARMBuilding Embedded Linux Full Tutorial for ARM
Building Embedded Linux Full Tutorial for ARM
 
Using open source software to build an industrial grade embedded linux platfo...
Using open source software to build an industrial grade embedded linux platfo...Using open source software to build an industrial grade embedded linux platfo...
Using open source software to build an industrial grade embedded linux platfo...
 
Android on IA devices and Intel Tools
Android on IA devices and Intel ToolsAndroid on IA devices and Intel Tools
Android on IA devices and Intel Tools
 
Dev opsec dockerimage_patch_n_lifecyclemanagement_2019
Dev opsec dockerimage_patch_n_lifecyclemanagement_2019Dev opsec dockerimage_patch_n_lifecyclemanagement_2019
Dev opsec dockerimage_patch_n_lifecyclemanagement_2019
 
Module 4 Embedded Linux
Module 4 Embedded LinuxModule 4 Embedded Linux
Module 4 Embedded Linux
 
Android Native Development Kit
Android Native Development KitAndroid Native Development Kit
Android Native Development Kit
 
olibc: Another C Library optimized for Embedded Linux
olibc: Another C Library optimized for Embedded Linuxolibc: Another C Library optimized for Embedded Linux
olibc: Another C Library optimized for Embedded Linux
 
Accelerate your development with Docker
Accelerate your development with DockerAccelerate your development with Docker
Accelerate your development with Docker
 
Accelerate your software development with Docker
Accelerate your software development with DockerAccelerate your software development with Docker
Accelerate your software development with Docker
 
.Net Core
.Net Core.Net Core
.Net Core
 
Developing Applications for Beagle Bone Black, Raspberry Pi and SoC Single Bo...
Developing Applications for Beagle Bone Black, Raspberry Pi and SoC Single Bo...Developing Applications for Beagle Bone Black, Raspberry Pi and SoC Single Bo...
Developing Applications for Beagle Bone Black, Raspberry Pi and SoC Single Bo...
 
Evolution of containers to kubernetes
Evolution of containers to kubernetesEvolution of containers to kubernetes
Evolution of containers to kubernetes
 

Último

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CVKhem
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 

Último (20)

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 

Cross-compiling Android with autotools or cmake

  • 1. Cross-compilation native pour android avec les autotools ou cmake Thierry GAYET http://www.nextinnovation.org Lorsque l'on cross-compile un package pour une architecture donnée, ils peuvent être basés soit sur autotools, cmake, ou autre. Cela peut être plus ou moins compliqué suivant le système de génération requis. 1. Introduction au NDK de google Android Le NDK (aka Native Development Kit) est un ensemble d'outils comprenant une chaîne de crosscompilation pour plusieurs architectures (ARM, X86, MIPS). Il permet de cross-compiler nativement des packages développés en langage C et/ou C++. Il est mis en libre téléchargement par google. Nous allons le télécharger et nous en servir pour les cross-compilation suivantes. Il est disponibles pour linux pour l'architecture x86 32 et 64 bits : • http://dl.google.com/android/ndk/android-ndk-r9c-linux-x86.tar.bz2 • http://dl.google.com/android/ndk/android-ndk-r9c-linux-x86_64.tar.bz2 Le support c++ pour la STL est aussi disponible avec les symboles de débug : • http://dl.google.com/android/ndk/android-ndk-r9c-cxx-stl-libs-with-debugging-info.zip L'installation sera effectué dans le répertoire /opt pour l'exemple : $ cd /tmp $ wget http://dl.google.com/android/ndk/android-ndk-r9c-linux-x86_64.tar.bz2 $ tar jxf android-ndk-r9c-linux-x86_64.tar.bz2 $ sudo $ tar jxf android-ndk-r9c-linux-x86_64.tar.bz2 -C /opt Le NDK fournit une chaînes de compilation croisée (compilateurs, éditeurs de liens, etc...) pouvant générer des binaires pour une architecture native. Sont fournit les d'en-têtes du système pour API natives stables qui sont garantis pour être pris en charge dans toutes les versions de la plate-forme : • headers libc bionic ; • headers libm (bibliothèque de mathématiques) ; • headers pour les interface JNI avec le java ; • headers libz (bibliothèque de compression Zlib) ; • headers liblog (bibliothèque de traces) ; • headers OpenGL ES 1.1 et OpenGL ES 2.0 (bibliothèques graphiques 3D) ; • headers libjnigraphics (accès au buffer de pixel) à partir d'Android 2.2 et supérieur ; • Un ensemble minimal d'entêtes pour le support du langage C et C++ ; • headers OpenSL ES (bibliothèques audio natives) ;
  • 2. API Android natives ; • Le NDK, peut nécessité plusieurs dépendances : • SDK Android (>= 1.5) complet avec ses dépendances ; • Linux (32 or 64-bit ; Ubuntu 8.04, ou autre distribution Linux GLibc 2.7 ou supérieur) ; • GNU Make 3.81 ou supérieur ; • GNU Awk or Nawk ou supérieur Une fois installé, l'arborescence suivante peut être observée : Répertoire Description <ndk>/build Outils nécessaires aux builds <ndk>/docs Documentation sur la partie native <ndk>/platforms Répertoire plate-forme Android par niveau d'API <ndk>/prebuilt Librairie(s) statiques et dynamique pré-ébuildées <ndk>/samples Exemple de code c/c++ natif <ndk>/sources Divers codes sources <ndk>/tests Tests unitaires du NDK <ndk>/toolchains Chaînes de cross-compilation Pour ceux que cela intéresse, le NDK peut être suivi depuis les repo GIT officiel : git clone https://android.googlesource.com/platform/ndk.git ndk git clone https://android.googlesource.com/platform/development.git development 2. Configuration de l'environement La décompression effectuée, nous pouvons définir le chemin du NDK dans notre fichier ~/.bashrc. Pour ce faire ajoutons la ligne suivante : export NDK_HOME="${FORMATION_HOME}/tools/android-ndk-r9c" Pour une utilisation dans un shell il faudra resourcer le script : $ source ~/.bashrc Pour une utilisation directe en standalone de la toolchaine, il faut d'abord procéder à son investigation. Commençons par les différentes toolchain fournis dans le NDK : $ ls -al ${NDK_HOME}/toolchains/ total 52 drwxr-xr-x 13 124982 5000 4096 déc. 4 05:09 . drwxr-xr-x 10 124982 5000 4096 déc. 4 05:09 .. drwxr-xr-x 3 124982 5000 4096 déc. 4 05:09 arm-linux-androideabi-4.6 drwxr-xr-x 3 124982 5000 4096 déc. 4 05:09 arm-linux-androideabi-4.8 drwxr-xr-x 2 124982 5000 4096 déc. 4 05:08 arm-linux-androideabi-clang3.3 drwxr-xr-x 3 124982 5000 4096 déc. 4 05:09 llvm-3.3 drwxr-xr-x 3 124982 5000 4096 déc. 4 05:09 mipsel-linux-android-4.6 drwxr-xr-x 3 124982 5000 4096 déc. 4 05:09 mipsel-linux-android-4.8 drwxr-xr-x 2 124982 5000 4096 déc. 4 05:08 mipsel-linux-android-clang3.3 drwxr-xr-x 3 124982 5000 4096 déc. 4 05:09 renderscript
  • 3. drwxr-xr-x 3 124982 5000 4096 déc. 4 05:09 x86-4.6 drwxr-xr-x 3 124982 5000 4096 déc. 4 05:09 x86-4.8 drwxr-xr-x 2 124982 5000 4096 déc. 4 05:08 x86-clang3.3 Pour connaître les architectures cibles et hôte, consultons le répertoire prebuilt : $ ls -al ${NDK_HOME}/prebuilt/ drwxr-xr-x 3 tgayet tgayet 4096 juil. 11 20:00 android-arm drwxr-xr-x 3 tgayet tgayet 4096 juil. 11 20:00 android-mips drwxr-xr-x 3 tgayet tgayet 4096 juil. 11 20:00 android-x86 drwxr-xr-x 4 tgayet tgayet 4096 juil. 11 20:00 common drwxr-xr-x 6 tgayet tgayet 4096 juil. 10 21:55 linux-x86_64 (ou linux_x86 sur x86-32) → Android-* donne les architectures cibles : arm, mips ou x86. → linux-x86_64 donne l'architecture hôte de la machine servant aux développement. Pour le support d'API android consultons le répertoire platforms : $ ls -al ${NDK_HOME}/platforms/ drwxr-xr-x 5 tgayet tgayet 4096 juil. 11 04:36 android-14 drwxr-xr-x 5 tgayet tgayet 4096 juil. 11 04:36 android-18 drwxr-xr-x 3 tgayet tgayet 4096 juil. 11 04:36 android-3 drwxr-xr-x 3 tgayet tgayet 4096 juil. 11 04:36 android-4 drwxr-xr-x 3 tgayet tgayet 4096 juil. 11 04:36 android-5 drwxr-xr-x 3 tgayet tgayet 4096 juil. 11 04:36 android-8 drwxr-xr-x 5 tgayet tgayet 4096 juil. 11 04:36 android-9 → android* donne la version d'API d'Android supporté. La toolchain peut être utilisée séparément en exportant les outils nécessaires : SYSROOT="${NDK_HOME}/platforms/android-<level>/arch-<arch>/" CC="${NDK_HOME}/toolchains/<name>/prebuilt/<system>/bin/<prefix>gcc --sysroot=$SYSROOT" Exemple : $ export SYSROOT="${NDK_HOME}/platforms/android-8/arch-arm" $ export CC="${NDK_HOME}/toolchains/arm-linux-androideabi-4.8/prebuilt/linuxx86_64/bin/arm-linux-androideabi-gcc –sysroot=$SYSROOT" Vérifions la version de GNU/Gcc de la toolchain : $ $CC --version arm-linux-androideabi-gcc (GCC) 4.8 Copyright (C) 2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Il sera ensuite possible d'intégrer la règle de compilation suivante dans les Makefiles : .c.o: @echo "n---" $@ "---" $(CC) $(CFLAGS) -c -o $@ $< 3. Limitations La libc Bionic est une version BSD de la librairie GNU C glibc ou eglibc utilisé habituellement sous
  • 4. linux. Elle a été initialement développé par Google pour son système d'exploitation Android en incluant des optimisation pour la mobilité. Elle a plusieurs caractéristiques majeures spécifiques au noyau Linux, et son développement se poursuit indépendamment du code source d'Android. Son code est accessible sur le github suivant : https://github.com/android/platform_bionic Les ingénieurs d'Android ont décidé de développer une libc propre à la plateforme Android car ils avaient besoin d'une libc légère (la libc sera chargé dans chaque processus) et rapide (les appareils mobiles ne disposent de CPU puissant). La Bionic libc a été écrit pour supporter les CPU ARM, bien que le support x86 est présent. Il n'y pas de support pour les autres architecture CPU tel que PowerPC ou MIPS. Néanmoins, pour le marché des appareils mobiles, seulement l'architecture ARM est importante. Parmi les limitations, il y a une restriction au niveau des locales qui sont absente. Cette libc est sous licence BSD, elle reprend une grande partie du code des glibc issue d'OpenBSD, FreeBSD et NetBSD. Caractéristique importante :  Elle pèse environ 200Ko soit la moitié de la glibc ;  L'implémentation des pthreads (POSIX thread) a été complètement réécrit pour supporter les threads de la machine virtuelle Dalvik. De ce fait la Bionic libc ne supporte les threads POSIX ;  Les exceptions C++ et les "wide char" ne sont pas supportés ;  Il n'y a pas eu de "Standard Template Library" (STI) avant la r9c ; il est désormais possible de télécharger http://dl.google.com/android/ndk/android-ndk-r9c-cxx-stl-libs-with- debugging-info.zip Tableau des associations rattachant une architecture à une version d'API android : Architecture Plateforme Goole/Android ARM, ARM-NEON Android 1.5 (API Level 3) ou supérieur x86 Android 2.3 (API Level 9) ou supérieur MIPS Android 2.3 (API Level 9) ou supérieur 4. Infos de génération pour la librairie XML expat Avant de cross-compiler la librairie expat, allons regarder la référence dans LFS (aka Linux From Scratch) qui détaille ce qu'il faut pour (cross)compiler un package. Pour librairie expat, tout est décris http://www.linuxfromscratch.org/blfs/view/svn/general/expat.html à l'adresse Les étapes sont : • Téléchargement : URL (http) : http://downloads.sourceforge.net/expat/expat-2.1.0.tar.gz • Extraction : tar zxvf expat-2.1.0.tar.gz && cd expat-2.1.0/ • Configuration : ./configure --prefix=/usr –disable-static • Compilation : make • Installation : suivante :
  • 5. make install && install -v -m755 -d /usr/share/doc/expat-2.1.0 && install -v -m644 doc/*.{html,png,css} /usr/share/doc/expat-2.1.0 5. Cross-compilation d'un package à base d'autotools Pour l'exemple, je vais cross-compiler la librairie expat. Je vais commencer par la récupérer les sources du package via le bash script suivant : #!/bin/bash echo "--> Récupération du package ${PACKAGE_NAME} - v${PACKAGE_VERSION} " # --- Téléchargement du package --if [ "${PACKAGE_PROTOCOL}" != "" ] && [ "${PACKAGE_URL}" != "" ] && [ "${PACKAGE_NAME}" ! = "" ] && [ "${PACKAGE_VERSION}" != "" ] && [ "${PACKAGE_EXTENSION}" != "" ]; then echo -n " --> Téléchargement du package ... " wget ${PACKAGE_PROTOCOL}://${PACKAGE_URL}/${PACKAGE_NAME}-${PACKAGE_VERSION}.$ {PACKAGE_EXTENSION} > /dev/null 2>&1 if [ -e "${PACKAGE_NAME}-${PACKAGE_VERSION}.${PACKAGE_EXTENSION}" ]; then echo "OK" else echo "NOK ... arrêt !!" exit fi else echo " --> [ERROR] Package mal référencé ; Téléchargement impossible. " echo " Exemple de description du package définissant la librairie expat : " echo " export PACKAGE_PROTOCOL=http " echo " export PACKAGE_URL=downloads.sourceforge.net/expat " echo " export PACKAGE_VERSION=2.1.0 " echo " export PACKAGE_NAME=expat " echo " export PACKAGE_EXTENSION=tar.gz " echo " export PACKAGE_CMD_EXTRACTION=tar zxvf " exit fi # --- Extraction du package --if [ "${PACKAGE_CMD_EXTRACTION}" != "" ] && [ "${PACKAGE_NAME}" != "" ] && [ "$ {PACKAGE_VERSION}" != "" ] && [ "${PACKAGE_EXTENSION}" != "" ]; then echo -n " --> Extraction du package ... " ${PACKAGE_CMD_EXTRACTION} ${PACKAGE_NAME}-${PACKAGE_VERSION}.${PACKAGE_EXTENSION} > /dev/null 2>&1 if [ -d "${PACKAGE_NAME}-${PACKAGE_VERSION}" ]; then echo "OK" else echo "NOK ... arrêt !!" exit fi else echo " --> [ERROR] Impossible de trouver l'outils d'extraction $ {PACKAGE_CMD_EXTRACTION} " echo " ou bien le package ${PACKAGE_NAME}-${PACKAGE_VERSION}.$ {PACKAGE_EXTENSION} " exit fi # --- Déférencement des variables des registres pour nettoyer l'environement --echo -n " --> Nettoyage de l'environement ... " LIST_ENV="PACKAGE_PROTOCOL PACKAGE_URL PACKAGE_VERSION PACKAGE_NAME PACKAGE_EXTENSION PACKAGE_CMD_EXTRACTION"
  • 6. for VAR in `echo ${LIST_ENV}` do if [ "${VAR}" != "" ]; then unset ${VAR} fi done if [ "`env | grep PACKAGE`" == "" ]; then echo "OK" else echo "NOK ... arrêt !!" exit fi # Done. echo "<-- Done." Après définition des informations du package, le téléchargement et l'extraction du package s'effectue de la façon suivante : $ PACKAGE_PROTOCOL="http" PACKAGE_URL="downloads.sourceforge.net/expat" PACKAGE_VERSION="2.1.0" PACKAGE_NAME="expat" PACKAGE_EXTENSION="tar.gz" PACKAGE_CMD_EXTRACTION="tar zxvf" ./getPackage.sh --> Récupération du package expat - v2.1.0 --> Téléchargement du package ... --> Extraction du package ... --> Nettoyage de l'environement ... <-- Done. Une fois effectué, si aucune erreur n'est apparue, voilà ce que l'on doit avoir, à savoir le répertoire contenant les sources et l'archive : $ ls -al | grep expat-2.1.0 drwxrwxr-x 13 tgayet tgayet 4096 mars 24 2012 expat-2.1.0 -rw-rw-r-- 1 tgayet tgayet 562616 mars 24 2012 expat-2.1.0.tar.gz $ cd expat-2.1.0/ $ ls -al total 980 drwxrwxr-x 13 tgayet tgayet 4096 mars 24 2012 . drwxrwxr-x 3 tgayet tgayet 4096 janv. 21 13:26 .. -rw-rw-r-- 1 tgayet tgayet 304569 mars 24 2012 aclocal.m4 drwxrwxr-x 3 tgayet tgayet 4096 mars 24 2012 amiga drwxrwxr-x 2 tgayet tgayet 4096 mars 24 2012 bcb5 -rw-rw-r-- 1 tgayet tgayet 11379 mars 24 2012 Changes -rwxrwxr-x 1 tgayet tgayet 3299 mars 5 2012 CMakeLists.txt -rwxrwxr-x 1 tgayet tgayet 1768 mars 5 2012 CMake.README -rwxrwxr-x 1 tgayet tgayet 565580 mars 24 2012 configure -rwxrwxr-x 1 tgayet tgayet 1512 mars 5 2012 ConfigureChecks.cmake -rw-rw-r-- 1 tgayet tgayet 4652 mars 4 2012 configure.in drwxrwxr-x 2 tgayet tgayet 4096 mars 24 2012 conftools -rw-rw-r-- 1 tgayet tgayet 1208 déc. 29 2005 COPYING drwxrwxr-x 2 tgayet tgayet 4096 mars 24 2012 doc drwxrwxr-x 2 tgayet tgayet 4096 mars 24 2012 examples -rwxrwxr-x 1 tgayet tgayet 2735 mars 5 2012 expat_config.h.cmake
  • 7. -rw-rw-r-- 1 tgayet tgayet 2728 mars 24 2012 expat_config.h.in -rwxrwxr-x 1 tgayet tgayet 1990 sept. 30 2004 expat.dsw -rw-rw-r-- 1 tgayet tgayet 231 janv. 19 2009 expat.pc.in drwxrwxr-x 2 tgayet tgayet 4096 mars 24 2012 lib drwxrwxr-x 2 tgayet tgayet 4096 mars 24 2012 m4 -rw-rw-r-- 1 tgayet tgayet 7036 mars 18 2012 Makefile.in -rw-rw-r-- 1 tgayet tgayet 2518 mars 5 2012 MANIFEST -rw-rw-r-- 1 tgayet tgayet 5790 mars 11 2012 README drwxrwxr-x 3 tgayet tgayet 4096 mars 24 2012 tests drwxrwxr-x 2 tgayet tgayet 4096 mars 24 2012 vms drwxrwxr-x 2 tgayet tgayet 4096 mars 24 2012 win32 drwxrwxr-x 2 tgayet tgayet 4096 mars 24 2012 xmlwf On vérifie que le package supporte bien le support autotools avec la présence des fichiers « configure.in, configure, Makefile.in, expat.pc.in ». Ecrivons maintenant un script qui définera l’environnement pour le script autotools. Au final le script nommé « build.sh » exécutera le script « configure » : #!/bin/bash # – Définition des chemins --export ANDROID_NDK=/opt/android-ndk-r9c/ export DEV_PREFIX=${ANDROID_NDK}/platforms/android-8/arch-arm/ export CROSS_COMPILE=arm-linux-androideabi export ANDROID_PREFIX=${ANDROID_NDK}/toolchains/arm-linux-androideabi4.8/prebuilt/linux-x86_64 export SYSROOT=${ANDROID_NDK}/platforms/android-8/arch-arm export CROSS_PATH=${ANDROID_PREFIX}/bin/${CROSS_COMPILE} export PREFIX=${DEV_PREFIX}/usr # – déclaration des outils de la toolchain -export CPP=${CROSS_PATH}-cpp export AR=${CROSS_PATH}-ar export AS=${CROSS_PATH}-as export NM=${CROSS_PATH}-nm export CC=${CROSS_PATH}-gcc export LD=${CROSS_PATH}-ld export RANLIB=${CROSS_PATH}-ranlib export PKG_CONFIG_PATH=${PREFIX}/lib/pkgconfig export CFLAGS="${CFLAGS} --sysroot=${SYSROOT} -I${SYSROOT}/usr/include -I$ {ANDROID_PREFIX}/include -I${DEV_PREFIX}/android/bionic" export CPPFLAGS="${CFLAGS}" export LDFLAGS="${LDFLAGS} -L${SYSROOT}/usr/lib -L${ANDROID_PREFIX}/lib" ./configure --host=${CROSS_COMPILE} --with-sysroot=${SYSROOT} --prefix=${PREFIX} "$@" Enfin le : ./build.sh configure: WARNING: if you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used checking build system type... x86_64-unknown-linux-gnu checking host system type... arm-unknown-linux-androideabi configure: WARNING: Libtool does not cope well with whitespace in `pwd` checking how to print strings... printf checking for arm-linux-androideabi-gcc... /opt/android-ndk-r9//toolchains/arm-linux-androideabi4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc checking whether the C compiler works... yes
  • 8. checking for C compiler default output file name... a.out checking for suffix of executables... checking whether we are cross compiling... yes checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/armlinux-androideabi-gcc accepts -g... yes checking for /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linuxandroideabi-gcc option to accept ISO C89... none needed checking for a sed that does not truncate output... /bin/sed checking for grep that handles long lines and -e... /bin/grep checking for egrep... /bin/grep -E checking for fgrep... /bin/grep -F checking for ld used by /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linuxx86_64/bin/arm-linux-androideabi-gcc... /opt/android-ndk-r9//toolchains/arm-linux-androideabi4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ld checking if the linker (/opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/armlinux-androideabi-ld) is GNU ld... yes checking for BSD- or MS-compatible name lister (nm)... /opt/android-ndk-r9//toolchains/arm-linuxandroideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-nm checking the name lister (/opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linuxx86_64/bin/arm-linux-androideabi-nm) interface... BSD nm checking whether ln -s works... yes checking the maximum length of command line arguments... 1572864 checking whether the shell understands some XSI constructs... yes checking whether the shell understands "+="... yes checking how to convert x86_64-unknown-linux-gnu file names to arm-unknown-linux-androideabi format... func_convert_file_noop checking how to convert x86_64-unknown-linux-gnu file names to toolchain format... func_convert_file_noop checking for /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linuxandroideabi-ld option to reload object files... -r checking for arm-linux-androideabi-objdump... objdump checking how to recognize dependent libraries... pass_all checking for arm-linux-androideabi-dlltool... dlltool checking how to associate runtime and link libraries... printf %sn checking for arm-linux-androideabi-ar... /opt/android-ndk-r9//toolchains/arm-linux-androideabi4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar checking for archiver @FILE support... @ checking for arm-linux-androideabi-strip... no checking for strip... strip configure: WARNING: using cross tools not prefixed with host triplet checking for arm-linux-androideabi-ranlib... /opt/android-ndk-r9//toolchains/arm-linux-androideabi4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ranlib checking for gawk... gawk checking command to parse /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linuxx86_64/bin/arm-linux-androideabi-nm output from /opt/android-ndk-r9//toolchains/arm-linux-androideabi4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc object... ok checking for sysroot... /opt/android-ndk-r9//platforms/android-8/arch-arm
  • 9. checking for arm-linux-androideabi-mt... no checking for mt... mt checking if mt is a manifest tool... no checking how to run the C preprocessor... /opt/android-ndk-r9//toolchains/arm-linux-androideabi4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-cpp checking for ANSI C header files... yes checking for sys/types.h... yes checking for sys/stat.h... yes checking for stdlib.h... yes checking for string.h... yes checking for memory.h... yes checking for strings.h... yes checking for inttypes.h... yes checking for stdint.h... yes checking for unistd.h... yes checking for dlfcn.h... yes checking for objdir... .libs checking if /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linuxandroideabi-gcc supports -fno-rtti -fno-exceptions... no checking for /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linuxandroideabi-gcc option to produce PIC... -fPIC -DPIC checking if /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linuxandroideabi-gcc PIC flag -fPIC -DPIC works... yes checking if /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linuxandroideabi-gcc static flag -static works... yes checking if /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linuxandroideabi-gcc supports -c -o file.o... yes checking if /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linuxandroideabi-gcc supports -c -o file.o... (cached) yes checking whether the /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/armlinux-androideabi-gcc linker (/opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linuxx86_64/bin/arm-linux-androideabi-ld) supports shared libraries... yes checking whether -lc should be explicitly linked in... no checking dynamic linker characteristics... GNU/Linux ld.so checking how to hardcode library paths into programs... immediate checking whether stripping libraries is possible... yes checking if libtool supports shared libraries... yes checking whether to build shared libraries... yes checking whether to build static libraries... yes checking for arm-linux-androideabi-gcc... (cached) /opt/android-ndk-r9//toolchains/arm-linux-androideabi4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc checking whether we are using the GNU C compiler... (cached) yes checking whether /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/armlinux-androideabi-gcc accepts -g... (cached) yes checking for /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linuxandroideabi-gcc option to accept ISO C89... (cached) none needed checking for arm-linux-androideabi-g++... no
  • 10. checking for arm-linux-androideabi-c++... no checking for arm-linux-androideabi-gpp... no checking for arm-linux-androideabi-aCC... no checking for arm-linux-androideabi-CC... no checking for arm-linux-androideabi-cxx... no checking for arm-linux-androideabi-cc++... no checking for arm-linux-androideabi-cl.exe... no checking for arm-linux-androideabi-FCC... no checking for arm-linux-androideabi-KCC... no checking for arm-linux-androideabi-RCC... no checking for arm-linux-androideabi-xlC_r... no checking for arm-linux-androideabi-xlC... no checking for g++... g++ checking whether we are using the GNU C++ compiler... yes checking whether g++ accepts -g... yes checking how to run the C++ preprocessor... g++ -E checking for ld used by g++... /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linuxx86_64/bin/arm-linux-androideabi-ld checking if the linker (/opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/armlinux-androideabi-ld) is GNU ld... yes checking whether the g++ linker (/opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linuxx86_64/bin/arm-linux-androideabi-ld) supports shared libraries... yes checking for g++ option to produce PIC... -fPIC -DPIC checking if g++ PIC flag -fPIC -DPIC works... yes checking if g++ static flag -static works... no checking if g++ supports -c -o file.o... yes checking if g++ supports -c -o file.o... (cached) yes checking whether the g++ linker (/opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linuxx86_64/bin/arm-linux-androideabi-ld) supports shared libraries... yes checking dynamic linker characteristics... (cached) GNU/Linux ld.so checking how to hardcode library paths into programs... immediate checking for a BSD-compatible install... /usr/bin/install -c checking whether /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/armlinux-androideabi-gcc accepts -fexceptions... yes checking for ANSI C header files... (cached) yes checking whether byte ordering is bigendian... cross-compiling... unknown checking to probe for byte ordering... little endian probe OK, guessing bigendian ... no checking for an ANSI C-conforming const... yes checking for size_t... yes checking for memmove... yes checking for bcopy... yes checking fcntl.h usability... yes
  • 11. checking fcntl.h presence... yes checking for fcntl.h... yes checking for unistd.h... (cached) yes checking for off_t... yes checking for stdlib.h... (cached) yes checking for unistd.h... (cached) yes checking for sys/param.h... yes checking for getpagesize... no checking for working mmap... no checking for /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linuxandroideabi-gcc option to accept ISO C99... -std=gnu99 checking for /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linuxandroideabi-gcc -std=gnu99 option to accept ISO Standard C... (cached) -std=gnu99 checking for an ANSI C99-conforming __func__... yes configure: creating ./config.status config.status: creating Makefile config.status: WARNING: 'Makefile.in' seems to ignore the --datarootdir setting config.status: creating expat.pc config.status: creating expat_config.h config.status: executing libtool commands Lançons la compilation : $ make /bin/bash ./libtool --silent --mode=compile /opt/android-ndk-r9//toolchains/arm-linux-androideabi4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc -std=gnu99 -I./lib -I. --sysroot=/opt/android-ndkr9//platforms/android-8/arch-arm -I/opt/android-ndk-r9//platforms/android-8/arch-arm/usr/include -I/opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/include -I/opt/android-ndkr9//platforms/android-8/arch-arm//android/bionic -Wall -Wmissing-prototypes -Wstrict-prototypes -fexceptions --sysroot=/opt/android-ndk-r9//platforms/android-8/arch-arm -I/opt/android-ndk-r9//platforms/android-8/archarm/usr/include -I/opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/include -I/opt/android-ndk-r9//platforms/android-8/arch-arm//android/bionic -DHAVE_EXPAT_CONFIG_H -o lib/xmlparse.lo -c lib/xmlparse.c /bin/bash ./libtool --silent --mode=compile /opt/android-ndk-r9//toolchains/arm-linux-androideabi4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc -std=gnu99 -I./lib -I. --sysroot=/opt/android-ndkr9//platforms/android-8/arch-arm -I/opt/android-ndk-r9//platforms/android-8/arch-arm/usr/include -I/opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/include -I/opt/android-ndkr9//platforms/android-8/arch-arm//android/bionic -Wall -Wmissing-prototypes -Wstrict-prototypes -fexceptions --sysroot=/opt/android-ndk-r9//platforms/android-8/arch-arm -I/opt/android-ndk-r9//platforms/android-8/archarm/usr/include -I/opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/include -I/opt/android-ndk-r9//platforms/android-8/arch-arm//android/bionic -DHAVE_EXPAT_CONFIG_H -o lib/xmltok.lo -c lib/xmltok.c /bin/bash ./libtool --silent --mode=compile /opt/android-ndk-r9//toolchains/arm-linux-androideabi4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc -std=gnu99 -I./lib -I. --sysroot=/opt/android-ndkr9//platforms/android-8/arch-arm -I/opt/android-ndk-r9//platforms/android-8/arch-arm/usr/include -I/opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/include -I/opt/android-ndkr9//platforms/android-8/arch-arm//android/bionic -Wall -Wmissing-prototypes -Wstrict-prototypes -fexceptions --sysroot=/opt/android-ndk-r9//platforms/android-8/arch-arm -I/opt/android-ndk-r9//platforms/android-8/archarm/usr/include -I/opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/include -I/opt/android-ndk-r9//platforms/android-8/arch-arm//android/bionic -DHAVE_EXPAT_CONFIG_H -o lib/xmlrole.lo -c lib/xmlrole.c /bin/bash ./libtool --silent --mode=link /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linuxx86_64/bin/arm-linux-androideabi-gcc -std=gnu99 -I./lib -I. --sysroot=/opt/android-ndk-r9//platforms/android8/arch-arm -I/opt/android-ndk-r9//platforms/android-8/arch-arm/usr/include -I/opt/android-ndkr9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/include -I/opt/android-ndk-
  • 12. r9//platforms/android-8/arch-arm//android/bionic -Wall -Wmissing-prototypes -Wstrict-prototypes -fexceptions --sysroot=/opt/android-ndk-r9//platforms/android-8/arch-arm -I/opt/android-ndk-r9//platforms/android-8/archarm/usr/include -I/opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/include -I/opt/android-ndk-r9//platforms/android-8/arch-arm//android/bionic -DHAVE_EXPAT_CONFIG_H -noundefined -version-info 7:0:6 -rpath /opt/android-ndk-r9//platforms/android-8/arch-arm//usr/lib -L/opt/androidndk-r9//platforms/android-8/arch-arm/usr/lib -L/opt/android-ndk-r9//toolchains/arm-linux-androideabi4.8/prebuilt/linux-x86_64/lib -o libexpat.la lib/xmlparse.lo lib/xmltok.lo lib/xmlrole.lo /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc -std=gnu99 -I./lib -I. --sysroot=/opt/android-ndk-r9//platforms/android-8/arch-arm -I/opt/android-ndkr9//platforms/android-8/arch-arm/usr/include -I/opt/android-ndk-r9//toolchains/arm-linux-androideabi4.8/prebuilt/linux-x86_64/include -I/opt/android-ndk-r9//platforms/android-8/arch-arm//android/bionic -Wall -Wmissing-prototypes -Wstrict-prototypes -fexceptions --sysroot=/opt/android-ndk-r9//platforms/android8/arch-arm -I/opt/android-ndk-r9//platforms/android-8/arch-arm/usr/include -I/opt/android-ndkr9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/include -I/opt/android-ndkr9//platforms/android-8/arch-arm//android/bionic -DHAVE_EXPAT_CONFIG_H -o xmlwf/xmlwf.o -c xmlwf/xmlwf.c /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc -std=gnu99 -I./lib -I. --sysroot=/opt/android-ndk-r9//platforms/android-8/arch-arm -I/opt/android-ndkr9//platforms/android-8/arch-arm/usr/include -I/opt/android-ndk-r9//toolchains/arm-linux-androideabi4.8/prebuilt/linux-x86_64/include -I/opt/android-ndk-r9//platforms/android-8/arch-arm//android/bionic -Wall -Wmissing-prototypes -Wstrict-prototypes -fexceptions --sysroot=/opt/android-ndk-r9//platforms/android8/arch-arm -I/opt/android-ndk-r9//platforms/android-8/arch-arm/usr/include -I/opt/android-ndkr9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/include -I/opt/android-ndkr9//platforms/android-8/arch-arm//android/bionic -DHAVE_EXPAT_CONFIG_H -o xmlwf/xmlfile.o -c xmlwf/xmlfile.c /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc -std=gnu99 -I./lib -I. --sysroot=/opt/android-ndk-r9//platforms/android-8/arch-arm -I/opt/android-ndkr9//platforms/android-8/arch-arm/usr/include -I/opt/android-ndk-r9//toolchains/arm-linux-androideabi4.8/prebuilt/linux-x86_64/include -I/opt/android-ndk-r9//platforms/android-8/arch-arm//android/bionic -Wall -Wmissing-prototypes -Wstrict-prototypes -fexceptions --sysroot=/opt/android-ndk-r9//platforms/android8/arch-arm -I/opt/android-ndk-r9//platforms/android-8/arch-arm/usr/include -I/opt/android-ndkr9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/include -I/opt/android-ndkr9//platforms/android-8/arch-arm//android/bionic -DHAVE_EXPAT_CONFIG_H -o xmlwf/codepage.o -c xmlwf/codepage.c /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc -std=gnu99 -I./lib -I. --sysroot=/opt/android-ndk-r9//platforms/android-8/arch-arm -I/opt/android-ndkr9//platforms/android-8/arch-arm/usr/include -I/opt/android-ndk-r9//toolchains/arm-linux-androideabi4.8/prebuilt/linux-x86_64/include -I/opt/android-ndk-r9//platforms/android-8/arch-arm//android/bionic -Wall -Wmissing-prototypes -Wstrict-prototypes -fexceptions --sysroot=/opt/android-ndk-r9//platforms/android8/arch-arm -I/opt/android-ndk-r9//platforms/android-8/arch-arm/usr/include -I/opt/android-ndkr9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/include -I/opt/android-ndkr9//platforms/android-8/arch-arm//android/bionic -DHAVE_EXPAT_CONFIG_H -o xmlwf/readfilemap.o -c xmlwf/readfilemap.c /bin/bash ./libtool --silent --mode=link /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linuxx86_64/bin/arm-linux-androideabi-gcc -std=gnu99 -I./lib -I. --sysroot=/opt/android-ndk-r9//platforms/android8/arch-arm -I/opt/android-ndk-r9//platforms/android-8/arch-arm/usr/include -I/opt/android-ndkr9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/include -I/opt/android-ndkr9//platforms/android-8/arch-arm//android/bionic -Wall -Wmissing-prototypes -Wstrict-prototypes -fexceptions --sysroot=/opt/android-ndk-r9//platforms/android-8/arch-arm -I/opt/android-ndk-r9//platforms/android-8/archarm/usr/include -I/opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/include -I/opt/android-ndk-r9//platforms/android-8/arch-arm//android/bionic -DHAVE_EXPAT_CONFIG_H -L/opt/android-ndk-r9//platforms/android-8/arch-arm/usr/lib -L/opt/android-ndk-r9//toolchains/arm-linuxandroideabi-4.8/prebuilt/linux-x86_64/lib -o xmlwf/xmlwf xmlwf/xmlwf.o xmlwf/xmlfile.o xmlwf/codepage.o xmlwf/readfilemap.o libexpat.la L'installation se fera dans le NDK android pour pouvoir gérer les dépendances entre paquets cross-compilés. Pour ce faire le paramètre « prefix » du script autotools a été adapté en conséquence. Il aurait été possible de laisser le prefix à la valeur usuelle comme « /usr » et en définissant le paramètre DESTDIR pour préciser la racine tu rootfs : $ make install /bin/bash ./conftools/mkinstalldirs /opt/android-ndk-r9//platforms/android-8/arch-arm//usr/lib /opt/android-ndkr9//platforms/android-8/arch-arm//usr/include /opt/android-ndk-r9//platforms/android-8/arch-
  • 13. arm//usr/lib/pkgconfig /bin/bash ./libtool --mode=install /usr/bin/install -c libexpat.la /opt/android-ndk-r9//platforms/android-8/archarm//usr/lib/libexpat.la libtool: install: /usr/bin/install -c .libs/libexpat.so.1.6.0 /opt/android-ndk-r9//platforms/android-8/archarm//usr/lib/libexpat.so.1.6.0 libtool: install: (cd /opt/android-ndk-r9//platforms/android-8/arch-arm//usr/lib && { ln -s -f libexpat.so.1.6.0 libexpat.so.1 || { rm -f libexpat.so.1 && ln -s libexpat.so.1.6.0 libexpat.so.1; }; }) libtool: install: (cd /opt/android-ndk-r9//platforms/android-8/arch-arm//usr/lib && { ln -s -f libexpat.so.1.6.0 libexpat.so || { rm -f libexpat.so && ln -s libexpat.so.1.6.0 libexpat.so; }; }) libtool: install: /usr/bin/install -c .libs/libexpat.lai /opt/android-ndk-r9//platforms/android$ make install /bin/bash ./conftools/mkinstalldirs /opt/android-ndk-r9//platforms/android-8/arch-arm//usr/lib /opt/android-ndkr9//platforms/android-8/arch-arm//usr/include /opt/android-ndk-r9//platforms/android-8/archarm//usr/lib/pkgconfig /bin/bash ./libtool --mode=install /usr/bin/install -c libexpat.la /opt/android-ndk-r9//platforms/android-8/archarm//usr/lib/libexpat.la libtool: install: /usr/bin/install -c .libs/libexpat.so.1.6.0 /opt/android-ndk-r9//platforms/android-8/archarm//usr/lib/libexpat.so.1.6.0 libtool: install: (cd /opt/android-ndk-r9//platforms/android-8/arch-arm//usr/lib && { ln -s -f libexpat.so.1.6.0 libexpat.so.1 || { rm -f libexpat.so.1 && ln -s libexpat.so.1.6.0 libexpat.so.1; }; }) libtool: install: (cd /opt/android-ndk-r9//platforms/android-8/arch-arm//usr/lib && { ln -s -f libexpat.so.1.6.0 libexpat.so || { rm -f libexpat.so && ln -s libexpat.so.1.6.0 libexpat.so; }; }) libtool: install: /usr/bin/install -c .libs/libexpat.lai /opt/android-ndk-r9//platforms/android-8/archarm//usr/lib/libexpat.la libtool: install: /usr/bin/install -c .libs/libexpat.a /opt/android-ndk-r9//platforms/android-8/archarm//usr/lib/libexpat.a libtool: install: chmod 644 /opt/android-ndk-r9//platforms/android-8/arch-arm//usr/lib/libexpat.a libtool: install: /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linuxandroideabi-ranlib /opt/android-ndk-r9//platforms/android-8/arch-arm//usr/lib/libexpat.a-8/archarm//usr/lib/libexpat.la libtool: install: /usr/bin/install -c .libs/libexpat.a /opt/android-ndk-r9//platforms/android-8/archarm//usr/lib/libexpat.a libtool: install: chmod 644 /opt/android-ndk-r9//platforms/android-8/arch-arm//usr/lib/libexpat.a libtool: install: /opt/android-ndk-r9//toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linuxandroideabi-ranlib /opt/android-ndk-r9//platforms/android-8/arch-arm//usr/lib/libexpat.a Voila c'est terminé pour autotools. 6. Cross-compilation d'un package à base de cmake Pour cmake, je vais rester toujours sur le package libexpat qui propose aussi un support pour cmake avec le fichier « CMakeLists.txt ». Avant de commencer téléchargeons le script de wrapping android pour cmake que nous allons mettre également dans /opt : $ cd /opt $ sudo git clone https://github.com/taka-no-me/android-cmake.git Ce script propose l'utilisation suivante pour la plateforme GNU/Linux : $ export ANDROID_NDK=/absolute/path/to/the/android-ndk $ mkdir build && cd build $ cmake -DCMAKE_TOOLCHAIN_FILE=path/to/the/android.toolchain.cmake .. $ make -j8 Pour notre cas cela va devenir :
  • 14. $ export ANDROID_NDK=/opt/android-ndk-r9c $ mkdir androidbuild && cd androidbuild $ cmake -DCMAKE_TOOLCHAIN_FILE=/opt/android-cmake/android.toolchain.cmake .. $ export ANDROID_NDK=/opt/android-ndk-r9c $ mkdir androidbuild && cd androidbuild $ cmake -DCMAKE_TOOLCHAIN_FILE=/opt/android-cmake/android.toolchain.cmake .. -- Looking for dlfcn.h -- Looking for dlfcn.h - found -- Looking for fcntl.h -- Looking for fcntl.h - found -- Looking for inttypes.h -- Looking for inttypes.h - found -- Looking for memory.h -- Looking for memory.h - found -- Looking for stdint.h -- Looking for stdint.h - found -- Looking for stdlib.h -- Looking for stdlib.h - found -- Looking for strings.h -- Looking for strings.h - found -- Looking for string.h -- Looking for string.h - found -- Looking for sys/stat.h -- Looking for sys/stat.h - found -- Looking for sys/types.h -- Looking for sys/types.h - found -- Looking for unistd.h -- Looking for unistd.h - found -- Looking for getpagesize -- Looking for getpagesize - not found -- Looking for bcopy -- Looking for bcopy - found -- Looking for memmove -- Looking for memmove - found -- Looking for mmap -- Looking for mmap - found -- Looking for 4 include files stdlib.h, ..., float.h -- Looking for 4 include files stdlib.h, ..., float.h - found -- Check if the system is big endian -- Searching 16 bit integer -- Looking for stddef.h -- Looking for stddef.h - found -- Check size of unsigned short
  • 15. -- Check size of unsigned short - done -- Using unsigned short -- Check if the system is big endian - little endian -- Looking for off_t -- Looking for off_t - not found -- Looking for size_t -- Looking for size_t - not found -- Configuring done -- Generating done -- Build files have been written to: /home/tgayet/Documents/articles_lm/cross-compilation android/expat2.1.0/androidbuild Cette étape permet de préparer le projet de façon à permettre un build : $ make Scanning dependencies of target expat [ 5%] Building C object CMakeFiles/expat.dir/lib/xmlparse.c.o [ 11%] Building C object CMakeFiles/expat.dir/lib/xmlrole.c.o [ 17%] Building C object CMakeFiles/expat.dir/lib/xmltok.c.o [ 23%] Building C object CMakeFiles/expat.dir/lib/xmltok_impl.c.o [ 29%] Building C object CMakeFiles/expat.dir/lib/xmltok_ns.c.o Linking C shared library ../libs/armeabi-v7a/libexpat.so [ 29%] Built target expat Scanning dependencies of target elements [ 35%] Building C object CMakeFiles/elements.dir/examples/elements.c.o Linking C executable ../bin/elements [ 35%] Built target elements Scanning dependencies of target outline [ 41%] Building C object CMakeFiles/outline.dir/examples/outline.c.o Linking C executable ../bin/outline [ 41%] Built target outline Scanning dependencies of target runtests [ 47%] Building C object CMakeFiles/runtests.dir/tests/runtests.c.o [ 52%] Building C object CMakeFiles/runtests.dir/tests/chardata.c.o [ 58%] Building C object CMakeFiles/runtests.dir/tests/minicheck.c.o Linking C executable ../bin/runtests [ 58%] Built target runtests Scanning dependencies of target runtestspp [ 64%] Building CXX object CMakeFiles/runtestspp.dir/tests/runtestspp.cpp.o In file included from /home/tgayet/Documents/articles_lm/cross-compilation android/expat2.1.0/tests/runtests.c:19:0, from /home/tgayet/Documents/articles_lm/cross-compilation android/expat2.1.0/tests/runtestspp.cpp:6: /home/tgayet/Documents/articles_lm/cross-compilation android/expat-2.1.0/tests/runtests.c: In function 'void basic_setup()': (...) ^
  • 16. [ 70%] Building C object CMakeFiles/runtestspp.dir/tests/chardata.c.o [ 76%] Building C object CMakeFiles/runtestspp.dir/tests/minicheck.c.o Linking CXX executable ../bin/runtestspp [ 76%] Built target runtestspp Scanning dependencies of target xmlwf [ 82%] Building C object CMakeFiles/xmlwf.dir/xmlwf/xmlwf.c.o [ 88%] Building C object CMakeFiles/xmlwf.dir/xmlwf/xmlfile.c.o [ 94%] Building C object CMakeFiles/xmlwf.dir/xmlwf/codepage.c.o [100%] Building C object CMakeFiles/xmlwf.dir/xmlwf/readfilemap.c.o Linking C executable ../bin/xmlwf [100%] Built target xmlwf Une version moins silentieuse peut être demandé : $ make VERBOSE=1 L'installation est aussi simple : $ sudo make install [ 29%] Built target expat [ 35%] Built target elements [ 41%] Built target outline [ 58%] Built target runtests [ 76%] Built target runtestspp [100%] Built target xmlwf Install the project... -- Install configuration: "" -- Up-to-date: /opt/android-ndk-r9c/toolchains/arm-linux-androideabi-4.8/prebuilt/linuxx86_64/user/lib/libexpat.so -- Up-to-date: /opt/android-ndk-r9c/toolchains/arm-linux-androideabi-4.8/prebuilt/linuxx86_64/user/include/expat.h -- Up-to-date: /opt/android-ndk-r9c/toolchains/arm-linux-androideabi-4.8/prebuilt/linuxx86_64/user/include/expat_external.h -- Up-to-date: /opt/android-ndk-r9c/toolchains/arm-linux-androideabi-4.8/prebuilt/linuxx86_64/user/lib/pkgconfig/expat.pc -- Up-to-date: /opt/android-ndk-r9c/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/user/bin/xmlwf -- Up-to-date: /opt/android-ndk-r9c/toolchains/arm-linux-androideabi-4.8/prebuilt/linuxx86_64/user/share/man/man1/xmlwf.1 7. Conclusion Avec ces deux recettes, il nous sera possible de cross-compiler nombre packages via la toolchain android sur le même modèle. 8. Liens • • • • • http://www.linuxfromscratch.org/blfs/view/svn/general/expat.html http://developer.android.com/tools/sdk/ndk/index.html https://github.com/android/platform_bionic http://elinux.org/Android_Notes#C_Library_.28bionic.29_info http://developer.android.com/index.html