Je voudrais faire une compilation croisée des librairies statiques ICU pour Android en utilisant Cygwin. Jusqu'à présent, j'ai pu configurer et réaliser les versions Cygwin/MSVC et Cygwin. J'ai installé la version Android-ndk-r7 et je vois une version de gcc dans le répertoire toolchains. Plusieurs exemples suggèrent d'utiliser host:arm-eabi - mais ce n'est pas présent sur ma machine.
J'ai copié mh-linux a mh-inconnu en /icu/source/config et exécutez ce qui suit :
export HOST_ICU=/cygdrive/d/__/External/SQLite/icu
export ICU_CROSS_BUILD=/cygdrive/d/__/External/SQLite/icu-cygwin
export NDK_ROOT=/cygdrive/d/__/android-ndk-r7
export CPPFLAGS="-I$NDK_ROOT/platforms/android-8/arch-arm/usr/include/ -O3 -fno-short-wchar -DU_USING_ICU_NAMESPACE=0 -DU_GNUC_UTF16_STRING=0 -fno-short-enums -nostdlib"
export CXXFLAGS="-I$NDK_ROOT/platforms/android-8/arch-arm/usr/include/ -O3 -fno-short-wchar -DU_USING_ICU_NAMESPACE=0 -DU_GNUC_UTF16_STRING=0 -fno-short-enums -nostdlib"
export CFLAGS="-I$NDK_ROOT/platforms/android-8/arch-arm/usr/include/ -O3 -fno-short-wchar -DU_USING_ICU_NAMESPACE=0 -DU_GNUC_UTF16_STRING=0 -fno-short-enums -nostdlib"
export LDFLAGS="-lc -Wl,-rpath-link=$NDK_ROOT/platforms/android-8/arch-arm/usr/lib/ -L $NDK_ROOT/platforms/android-8/arch-arm/usr/lib/"
$HOST_ICU/source/configure --with-cross-build=$ICU_CROSS_BUILD --enable-extras=no --enable-strict=no --enable-static --enable-shared=no --enable-tests=no --enable-samples=no --enable-dyload=no --enable-tools=no --host=arm-eabi --with-data-packaging=archive
Je reçois l'erreur suivante :
checking for ICU version numbers... release 4.8.1.1, library 48.1.1, unicode version 6.0
checking build system type... i686-pc-cygwin
checking host system type... arm-unknown-eabi
checking target system type... arm-unknown-eabi
checking whether to build debug libraries... no
checking whether to build release libraries... yes
checking for arm-eabi-gcc... no
checking for gcc... gcc
checking whether the C compiler works... no
configure: error: in `/cygdrive/d/Projects/__/External/SQLite/icu-android':
configure: error: C compiler cannot create executables
See `config.log' for more details
Je suis sûr que c'est une question "stupide", mais comment faire pour que la configuration ICU script pointe vers le gcc sous $NDK_ROOT. \toolchains\arm -linux-androideabi-4.4.3 \prebuilt\windows\arm -linux-androideabi \bin ? Est-ce que j'ai manqué une installation ou un setup ? Devrais-je configurer mon PATH de façon à ce que le premier fichier gcc trouvé est celui de arm-linux-androiedeabi ?
Mise à jour 1. Je viens de remarquer que pendant que Windows \arm -linux=androideabi \bin contient gcc , Windows \bin contient arm-linux-androideabi-gcc . Comment je fais pour que les soins intensifs appellent ça ?
Mise à jour 2. Sur la suggestion de Steven R. Loomis, j'ai récupéré les mises à jour de config.sub et config.guess à partir de
http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
placé Android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/Windows/bin dans mon chemin, et j'ai relancé configure avec --host=arm-linux-androideabi... cette fois :
checking for arm-linux-androideabi-gcc... arm-linux-androideabi-gcc
checking whether the C compiler works... no
Définitivement plus proche. Erreur détaillée du fichier config.log
gcc version 4.4.3 (GCC)
configure:3125: $? = 0
configure:3114: arm-linux-androideabi-gcc -V >&5
arm-linux-androideabi-gcc.exe: '-V' option must have argument
configure:3125: $? = 1
configure:3114: arm-linux-androideabi-gcc -qversion >&5
arm-linux-androideabi-gcc.exe: unrecognized option '-qversion'
arm-linux-androideabi-gcc.exe: no input files
configure:3125: $? = 1
configure:3145: checking whether the C compiler works
configure:3167: arm-linux-androideabi-gcc -I/cygdrive/d/Projects/android-ndk-r7/platforms/android-8/arch-arm/usr/include
/ -O3 -fno-short-wchar -DU_USING_ICU_NAMESPACE=0 -DU_GNUC_UTF16_STRING=0 -fno-short-enums -nostdlib -I/cygdrive/d/Projec
ts/android-ndk-r7/platforms/android-8/arch-arm/usr/include/ -O3 -fno-short-wchar -DU_USING_ICU_NAMESPACE=0 -DU_GNUC_UTF1
6_STRING=0 -fno-short-enums -nostdlib -lc -Wl,-rpath-link=/cygdrive/d/Projects/android-ndk-r7/platforms/android-8/arch-a
rm/usr/lib/ -L /cygdrive/d/Projects/android-ndk-r7/platforms/android-8/arch-arm/usr/lib/ conftest.c >&5
D:/Projects/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/
4.4.3/../../../../arm-linux-androideabi/bin/ld.exe: cannot find -lc
collect2: ld returned 1 exit status
configure:3171: $? = 1
configure:3209: result: no
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME ""
| #define PACKAGE_TARNAME ""
| #define PACKAGE_VERSION ""
| #define PACKAGE_STRING ""
| #define PACKAGE_BUGREPORT ""
| #define PACKAGE_URL ""
| /* end confdefs.h. */
|
| int
| main ()
| {
|
| ;
| return 0;
| }
configure:3214: error: in `/cygdrive/d/Projects/__/External/SQLITE/icu-android':
configure:3216: error: C compiler cannot create executables
See `config.log' for more details
Mise à jour 3. Les modifications apportées à config.sub et config.guess ont fonctionné dans la mesure où nous utilisons maintenant le bon compilateur gcc. L'échec de -lc vient du fait qu'il n'est pas possible de trouver libc.so (qui est dans Android-ndk-r7/platforms/Android-8/arch-arm/usr/lib" bien qu'il soit dans les LDFLAGS. J'avais un espace supplémentaire après -L dans les LDFLAGS d'origine, mais le supprimer n'a pas aidé.
Mise à jour 4. D'après un ancien post dans http://groups.google.com/group/Android-ndk/browse_thread/thread/46295616a889bc12
"La chaîne d'outils ndk de Windows est (heureusement) native de Windows, donc elle ne passe pas par la traduction de cygwin. donc elle ne passe pas par la couche de traduction de Cygwin qui traduirait les chemins /cygdrive".
Mise à jour 5. J'ai échangé toutes les instances de /cygdrive/d/ avec D:/. Maintenant, le compilateur C fonctionne mais il ne fait toujours pas. Je soupçonne que ICU_CROSS_BUILD doit être dans le répertoire icu/source.
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 arm-linux-androideabi-gcc accepts -g... yes
checking for arm-linux-androideabi-gcc option to accept ISO C89... none needed
checking for arm-linux-androideabi-g++... arm-linux-androideabi-g++
checking whether we are using the GNU C++ compiler... yes
checking whether arm-linux-androideabi-g++ accepts -g... yes
checking how to run the C preprocessor... arm-linux-androideabi-gcc -E
checking for a BSD-compatible install... /usr/bin/install -c
checking for gmake... /usr/bin/gmake
configure: error: D:/Projects/__/External/SQLite/icu-cygwin/config/icucross.mk not found. Please build ICU in
D:/Projects/__/External/SQLite/icu-cygwin first.
Mise à jour 6. J'ai re-configuré et rbâti mon dossier Cygwin dans icu-cygwin. Allez savoir pourquoi, cette fois icucross.mk était là. Configuration réussie ! Mais...
Mise à jour 7 Faire ne s'est pas si bien terminée.
$ make
D:/Projects/__/External/SQLite/icu/source/config/mh-linux:41: *** target pattern contains no `%'. Stop.
Quoi ? !?! Il semble que maintenant nous voulons à nouveau des chemins Cygwin :(
Mise à jour 8. J'ai modifié mes chemins de sorte que HOST_ICU et ICU_CROSS_BUILD utilisent des chemins Cygwin, mais NDK_ROOT est un chemin Windows (puisque Android NDK ld ne peut pas gérer les chemins Cygwin).
Cette fois-ci, plus loin mais
arm-linux-androideabi-gcc.exe: /cygdrive/d/Projects/__/External/SQLit e/icu/source/stubdata/stubdata.c: No such file or directory
arm-linux-androideabi-gcc.exe: no input files
Il semble que ce qui doit se passer est que arm-linux-androideabi-gcc doit être fait pour cygwin, ou le cross-build ne fonctionnera pas.
Mise à jour 9. Il semble que arm-linux-androideabi-gcc ne supporte pas les chemins cygwin - alors que ndk_build le fait. Cependant, ICU est configuré pour appeler arm-linux-androideabi-gcc alors que "make" requiert des chemins cygwin. Il est peut-être temps de passer à OSX ou Linux pour faire cela.
Mise à jour 10 - Toujours pas de succès. Cygwin - Apparemment, la version Crystax de arm-linux-androideabi ne supporte pas non plus les chemins cygwin dans -L. Tenter de faire une compilation croisée sous Cygwin donnera l'erreur -lc, puisqu'il ne peut pas analyser le chemin -L/cygdrive/d/... vers la bibliothèque. Changer pour D:/ aide, mais fait échouer make puisqu'il s'agit de make Cygwin.
Linux - En utilisant la version normale du NDK r7, la configuration échouera avec une erreur wchar_t = 0. La version Crystax NDK corrige ce problème, et make ne se plaindra pas de l'erreur uint64_t dans sys/type.h d'Android. Bibliothèque ICU dans Android NDK . Vous pouvez le forcer à être défini et cela conduira à une autre erreur de non concordance de taille.
OSX - Probablement la plus réussie, la compilation en utilisant le build officiel ou le build Crystax, elle mène directement au bug uint64_t. Si vous le contournez, cela vous mènera à
icu/source/common/ustrenum.cpp:118: error: must #include <typeinfo> before using typeid
Au secours !