Compiler Firefox OS

Une fois que vous avez mis en place votre système de compilation puis récupéré et configuré le code, vous pouvez compiler Boot to Gecko. Ce guide détaille les étapes nécessaires à la compilation.

Mettre à jour votre code

Si ce n'est pas la première fois que vous compilez B2G, vous pouvez récupérer la dernière version du code avant de commencer à compiler. Pour ce faire, vous devez mettre à jour les outils B2G ainsi que les dépendances grâce aux commandes suivantes :

git pull
./repo sync -d

L'option -d permet de récupérer les dernières versions (HEAD) des projets Android selon le manifeste de révision (c'est-à-dire la version principale, par défaut, du dépôt). Cette option est pratique si vous avez effectué des modifications mais que vous voulez revenir à l'état de la branche master de façon temporaire. Vos changements seront mis de côté (staged) le répertoire de travail ne sera pas modifié (voir la question Stack Overflow sur ce sujet ou la page de documentation sur la commande repo). Si vous n'avez pas modifié les sources, vous pouvez utiliser :

git pull
./repo sync

Vous pouvez mettre à jour votre dépôt selon une cible donnée en indiquant son nom :

./repo sync gaia

La commande repo possède d'autres options qui peuvent être utilisées. Utilisez la commande repo help pour avoir plus d'informations.

Compiler Boot to Gecko

Note : Avant la compilation, vous pouvez utiliser un fichier .userconfig pour personnaliser votre version. Voir la page Personnaliser la version grâce au fichier .userconfig pour plus d'informations.

Pour compiler Boot to Gecko, il suffit d'utiliser le script build.sh :

cd B2G
./build.sh

À ce moment, vous pouvez sans doute prendre une autre pause café (voire une sieste si c'est votre première compilation). Pour indication, la compilation dure environ 30 minutes sur un Core i7 avec 8 Go de RAM). Comme expliqué dans la page précédente, si vous utilisez un autre répertoire dans lequel vous avez sauvegardé des fichiers système Android, vous devrez définir la variable d'environnement ANDROIDFS_DIR avant de lancer build.sh.

Note : Pour plus d'informations sur l'installation (flashing) d'une nouvelle version sur un téléphone, lire la page Installer Firefox OS sur un appareil mobile.

Compiler des modules particuliers

Si vous souhaitez compiler uniquement un certain module, vous pouvez spécifier le nom du module souhaité comme argument du script. Ainsi, si vous souhaitez ne compiler que Gecko, vous pourrez utiliser la commande suivante :

./build.sh gecko

Si vous souhaitez ne rafraîchir qu'une seule application, vous pouvez compiler le module gaia et spécifier la variable d'environnement BUILD_APP_NAME avec le nom de l'application :

BUILD_APP_NAME=calendar ./build.sh gaia

Afin d'obtenir une liste des modules que vous pouvez compiler, vous pouvez utiliser la commande suivante :

./build.sh modules

Définir le nombre de tâches parallèles

Par défaut, les scripts B2G lancent des tâches parallèles (le nombre de tâches par défaut étant égal au nombre de cœurs plus (+) deux). Le nombre de tâches à lancer en parallèle est défini grâce au paramètre -j de build.sh. Cet argument peut s'avérer utile lorsque vous souhaitez réduire la charge CPU prise par la compilation pour pouvoir faire autre chose. De plus, n'avoir qu'une seule tâche pour la compilation permet d'interpréter beaucoup plus facilement les informations affichées par le script.

Ainsi, pour compiler en utilisant uniquement deux tâches parallèles, vous pouvez utiliser la commande suivante :

./build.sh -j2

Le plus souvent, ce paramètre est utilisé pour empêcher toute exécution parallèle. De cette façon, le processus peut être analysé plus simplement. Pour n'avoir qu'une seule tâche, lancer la commande suivante :

./build.sh -j1

Compiler une version multilocales

Pour compiler une version avec plusieurs locales, il faut réaliser les étapes suivantes :

  1. Déterminer le fichier de locales à utiliser. Actuellement, ce sont les fichiers locales/languages_dev.json et locales/languages_all.json qui sont utilisés comme fichiers de locales.
  2. Cloner les locales adéquates depuis http://hg.mozilla.org/gaia-l10n vers un répertoire. Le répertoire utilisé est gaia-l10n/. Vous pourriez très bien utiliser un répertoire locales/. Vous devrez cloner un dépôt pour chaque locale listée dans le fichier de langues.
  3. Dans votre environnement définissez la variable d'environnement LOCALE_BASEDIR avec le chemin absolu du répertoire choisi à l'étape 2. La variable d'environnement LOCALES_FILE doit être définie avec le chemin absolu du répertoire utilisé à l'étape 1.
  4. Vous pouvez également définir la variable d'environnement GAIA_DEFAULT_LOCALE si vous souhaitez définir une locale par défaut.
cd gaia/locales/
hg clone https://hg.mozilla.org/releases/gaia-l10n/v1_2/es
Définir les variables d'environnement :
 
export LOCALE_BASEDIR=$PWD/locales
export LOCALES_FILE=$PWD/locales/languages_dev.json
export GAIA_DEFAULT_LOCALE=fr

Le fichier languages-dev.json peut être remplacé par votre propre fichier mes-langues.json à condition que celui-ci respecte le format suivant (où chaque entrée correspond à une locale clonée dans le répertoire des locales) :

{
  "en-US"     : "English (US)",
  "es"        : "Español"
}

Depuis la livraison du bug 884752 (en novembre 2013), il est possible d'utiliser la variable d'environnement GAIA_KEYBOARD_LAYOUTS pour ajouter des agencements de clavier.

Voir la fiche du bug : https://bugzilla.mozilla.org/show_bug.cgi?id=884752

Voir des exemples d'agencements: https://github.com/mozilla-b2g/gaia/tree/v1.2/keyboard/layouts

Ainsi, si vous souhaitez ajouter des agencements de clavier pour l'espagnol, l'italien et l'anglais, vous pouvez définir la variable d'environnement de cette façon :

  GAIA_KEYBOARD_LAYOUTS=en,es,it

Vous pouvez alors flasher Gaia sur le téléphone. Connectez le téléphone et vérifiez que le débogage USB est activé dans l'écran Paramètres > Informations > Plus d'informations > Développeurs. Vous n'aurez pas besoin de répéter cette étape. En effet, votre version de Gaia aura le paramètre REMOTE_DEBUGGER à 1. Pour compiler une version multilocales :

 make clean && make production LOCALES_FILE=locales/languages-own.json

Si vous souhaitez cloner et/ou mettre à jour l'ensemble des locales prises en charge pour une branche donnée, vous pouvez utiliser ce script.

 

Compiler une version « engineering build officielle »

If this paragraph gets outdated. Please refer to the logs of the Be job in Treeherder to get the latest variables set.

Pour compiler une version  « engineering build officielle » comme celles publiées par Mozilla, vous devez utiliser les options suivantes sur votre ligne de commande:

VARIANT=eng MOZILLA_OFFICIAL=1 B2G_SYSTEM_APPS=1 GAIA_OPTIMIZE=1 B2G_UPDATER=1 B2G_UPDATE_CHANNEL=default MOZ_TELEMETRY_REPORTING=1 MOZ_CRASHREPORTER_NO_REPORT=1 LOCALES_FILE=locales/languages_all.json GAIA_KEYBOARD_LAYOUTS=en,pt-BR,es,de,fr,pl,zh-Hans-Pinyin,zh-Hant-Zhuyin,en-Dvorak ./build.sh

Ci-dessous l'explication des paramètres:

Variable Explication
VARIANT=eng Définition d'une version de type « engineering ». C'est aussi la valeur par défaut.
MOZILLA_OFFICIAL=1 Génère une version affichant le logo et la marque Firefox OS. Ne pas utiliser cette option avec des versions que vous souhaitez distribuer. Mozilla se réserve ce droit.
B2G_SYSTEM_APPS=1 Installe lest applications dans  le dossier /system/b2g/webapps (au lieu de /data/local/webapps).
GAIA_OPTIMIZE=1 Concatène les sources de Gaia.
B2G_UPDATER=1 Active les mises à jour quotidienne.
B2G_UPDATE_CHANNEL=default Le canal de mises à jour Firefox OS. La valeur «default» pointe vers mozilla-central.
MOZ_TELEMETRY_REPORTING=1 Active la Télémétrie permettant de partager les données concernant l'utilisation du téléphone.
MOZ_CRASHREPORTER_NO_REPORT=1 Désactive l'interface Firefox Desktop lors d'un crash, so the Gaia reporter only is used.
LOCALES_FILE=locales/languages_all.json Défini les langues disponibles dans Gaia (l'arborescence relative part du dossier de gaia).
GAIA_KEYBOARD_LAYOUTS=en,pt-BR,es,de,fr,pl,zh-Hans-Pinyin,zh-Hant-Zhuyin,en-Dvorak Défini les dispositions de clavier inclues dans Gaia.

Générer une archive système sans aucun blob binaire

Firefox OS Master Branch Only

Il est possible de générer une archive de système complet sans recourrir à un seul blob binaire, qui peut être utilisée pour convertir un appareil, fonctionnant sous Android, à Firefox OS, en s'affranchissant de l'interdiction de distribution de systèmes contenant des blobs binaires. Cette possibilité doit être développée séparément pour chaque type d'appareil, avec seulement les téléphones Flame et Z3/Z3 Compact supportés initialement.

Note: Nous devrions pouvoir le faire pour n'importe quel appareil pour lequel nous générons déjà des systèmes, mais il faut faire des vérifications dans chaque cas avant de pouvoir l'affirmer.

Une telle archive est générée à l'aide de l'option suivante :

./build.sh blobfree

Ceci produit une archive zip composé de :

  • Un fichier .zip contenant toutes les partitions du système prêtes à être utilisée mais pas sous forme de fichier image (dossiers BOOT, RECOVERY et SYSTEM)
  • Un fichier devices.json décrivant les appareils supportés avec les propriétés adb et les variables fastboot à lire et gérées pour chacun d'eux.
  • fstab de secours, permettant le partitionnement et le mapping des images.
  • dt.img  si nécessaire.
  • Blob de mapping système, basé sur le résultat de extract-files.sh.

Le but de cette archive est d'être utilisée avec l'installeur d'addon B2G (voir bug 1166276.)

Erreurs fréquentes

"Build failed!"

Si vous obtenez le message générique "Build failed" (« la compilation a échoué), vous pouvez essayer de reconnecter votre téléphone à votre ordinateur. Il peut arriver que le volume du téléphone soit démonté du système.

Attention, configurer et compiler B2G pour un Keon ne FONCTIONNERA PAS pour Mac. Pour cet appareil, il est nécessaire d'utiliser Linux.

Erreurs propres à Mountain Lion

1. Si vous compilez sur OS X 10.8 Mountain Lion (Xcode 4.4.1 ou ultérieur) et que vous obtenez l'erreur suivante :

external/qemu/android/skin/trackball.c:130:25: error: 'M_PI' undeclared (first use in this function)
Éditez le fichier : B2G/external/qemu/Makefile.android et ajoutez le code suivant à la ligne 78:
MY_CFLAGS += -DM_PI=3.14159265358979323846264338327950288   #/* B2G_fix: not finding M_PI constant */
2. Si vous utilisez Mountain Lion et que vous obtenez l'erreur suivante avec ./build.sh :
/System/Library/Frameworks/IOKit.framework/Headers/usb/USB.h:797:9: error: too many #pragma options align=reset

Remplacez les occurences de '#pragma options align=reset' par '#pragma pack()' dans le fichier /System/Library/Frameworks/IOKit.framework/Headers/usb/USB.h

Undefined symbols "_sqlite3_androidopt_handle_pragma" and "_sqlite3_androidopt_open"

Cette erreur se produit si vous compilez sur OS X 10.7 ou ultérieur avec Xcode 4.5 ou ultérieur. Pour résoudre le problème, appliquez le correctif https://groups.google.com/forum/#!msg/android-building/yAfPyUqCsiQ/7zvICk4GWjYJ au fichier external/sqlite/dist/Android.mk.

KeyedVector.h:193:31: error: indexOfKey was not declared in this scope

Cette erreur se produit lorsque la version de gcc utilisée est trop récente. Installez les versions gcc/g++/g++-multilib. Voir la page personnaliser la version compilée avec le fichier .userconfig pour plus d'informations.

Note : Vous pouvez utiliser gcc 4.7.x en apportant de légères modifications. En raison des priorités de développement, les bugs liés à ces modifications ne seront pas corrigés.

arm-linux-androideabi-g++: Internal error: Killed (program cc1plus)

Si vous obtenez ce message, cela signifie probablement qu'il manque de la mémoire. Assurez-vous de disposer de suffisamment de mémoire avant de lancer ./build.sh. Si vous disposez de 4 Go, cela devrait suffire.

Erreur « ...is referenced by DSO »

Lors de la compilation de l'émulateur, si vous obtenez « /usr/bin/ld: out/host/linux-x86/obj/EXECUTABLES/triangleCM_intermediates/triangleCM: hidden symbol `_XGetRequest' in out/host/linux-x86/obj/STATIC_LIBRARIES/libSDL_intermediates/libSDL.a(SDL_x11dyn.o) is referenced by DSO ».

Cela peut arriver avec certaines versions de binutils. Si vous utilisez Debian Stable, vous pouvez utiliser le linker gold en installant le paquet binutils-gold. Le linker gold est déjà installé avec binutils mais il n'est pas utilisé par défaut. binutils-gold permet de le passser en linker par défaut.

Si vous obtenez des erreurs de compilation lorsque le système de compilation exécute les tests

Certaines fois (surtout lorsque les outils de compilation et/ou le système sont mis à jour) vous pouvez obtenir certaines erreurs étranges lorsque le script effectue les tests post-compilation :

Generating permissions.sqlite...
test -d profile || mkdir -p profile
run-js-command  permissions
WARNING: permission unknown:offline-app
WARNING: permission unknown:indexedDB-unlimited
build/permissions.js:122: NS_ERROR_UNEXPECTED: Component returned failure code: 0x8000ffff (NS_ERROR_UNEXPECTED) [nsIPermissionManager.add]
make[1]: *** [permissions] Error 3
make: *** [gaia/profile.tar.gz] Error 2

Pour résoudre ce problème, supprimez le répertoire gaia/xulrunner-sdk avant de récupérer le code :

rm -r gaia/xulrunner-sdk

Cette commande permettra de supprimer la version téléchargée, précompilée de XULRunner que le système de compilation récupère automatiquement. Lors de la prochaine compilation, le système téléchargera automatiquement une nouvelle version de XULRunner.

Impossible de récupérer platform/libcore

Si vous essayez de configurer B2G pour Nexus S (./config.sh nexus-s) et que vous obtenez une erreur liée à libcore, cela est dû à un problème avec le git linaro. Pour résoudre ce problèmé, récupérez le manifeste de B2G :

git clone https://github.com/mozilla-b2g/b2g-manifest.git

Puis éditez le fichier nexus-s.xml dans ce dépôt, remplacez l'entrée pour le git linaro avec une référence à l'entrée aosp. Le résultat obtenu devrait ressembler à :

<default revision="refs/tags/android-4.0.4_r1.2"
              remote="aosp"
              sync-j="4" />

Effectuez un commit ces modifications (git commit -a) puis modifiez le fichier config.sh dans la branche master du dépôt principal de B2G puis modifiez le pour pointer vers votre fichier de manifeste local (plutôt que celui de Mozilla) avec la commande suivante :

GITREPO=${GITREPO:-"file:///home/path/to/my/b2g-manifest"}

Erreurs clang lors de la compilation avec Xcode 5 sur OS X

Si vous compilez en utilisant Xcode 5 sur OS X 10.8, il est probable que vous rencontriez les erreurs suivantes :

clang: error: argument unused during compilation: '-include system/core/include/arch/darwin-x86/AndroidConfig.h'
clang: error: argument unused during compilation: '-U DEBUG'
clang: error: argument unused during compilation: '-U DEBUG'
clang: error: argument unused during compilation: '-MF out/host/darwin-x86/obj/EXECUTABLES/obbtool_intermediates/Main.d'
make: *** [out/host/darwin-x86/obj/EXECUTABLES/obbtool_intermediates/Main.o] Error 1

Cela est dû à la modification du compilateur g++ dans le dossier /usr/bin par Xcode 5, ce qui fait planter le processus de compilation. Pour résoudre ce problème, éditer la ligne du fichier build/core/combo/HOST_darwin-x86.mk:

HOST_CXX := g++

en

HOST_CXX := g++-4.7
ifeq (,$(wildcard /usr/local/bin/g++-4.7))
 HOST_CXX := g++
endif

Ensuite, désinstaller gcc avec brew (ici, on considère que vous avez utilisé le script de mise en route pour Mac OS, si ce n'est pas le cas, utiliser ce script avant de continuer) :

brew uninstall gcc-4.7

Puis réinstaller gcc avec le support multilib et c++ :

brew install --enable-cxx https://gist.github.com/artlogic/6988658/raw/aeb9d1ea098274ad3f3fe2637b9df7f308a8a120/gcc-4.7.rb

Assurez vous que /usr/local/bin soit bien dans votre PATH. Vous pouvez l'ajouter temporairement à votre PATH grâce à la ligne suivante :

export PATH=/usr/local/bin:$PATH

Pour rendre cette modification permanente, vous pouvez ajouter cette ligne dans le fichier .bash_profile de votre répertoire home.

Une fois que vous avez bien défini votre PATH, assurez-vous de pouvoir lancer chacune d eces commandes :

gcc-4.7 -v

g++-4.7 -v

Si l'une de ces commandes échoue, il faudra peut-être lier de nouveau GCC à brew grâce à la commande suivante :

brew link --overwrite gcc-4.7

Il se peut également que /usr/bin/c++ ne pointe pas vers clang++ alors que ça devrait être le cas avec Xcode 5 installé. Vous pouvez le vérifier en tapant la commande suivante :

ls -l /usr/bin/c++

Le résultat de cette commande devrait ressembler à :

lrwxr-xr-x 1 root admin 7 Sep 19 11:40 /usr/bin/c++ -> clang++

Si c++ pointe vers autre chose que vers clang++, il faut mettre à jour avec le lien :

sudo rm /usr/bin/c++

sudo ln -s /usr/bin/clang++ /usr/bin/c++

"system/core/include/log/log.h:38:20: error: stdarg.h: No such file or directory"

Cette erreur peut se produire si vous utilisez 10.6 SDK pour compiler sur Mac OSX 10.10, ou tout autre configuration SDK qui n'est pas supportée par la cible que vous essayer de compiler. Voir bug 1071266 pour plus de détails.

Impossible de récupérer les fichiers depuis le répertoire de sauvegarde

Cela peut arriver lorsque la connexion USB a été interrompue lors de la récupération des données de l'appareil vers l'ordinateur.

Lorsque vous lancez le script, vous obtenez un résultat semblable à celui-là (obtenu pour un Peak) :

Pulling files from ../../../backup-peak
cat: ../../../backup-peak/system/build.prop: No such file or directory
Found firmware with build ID
Pulling "libaudioeq.so"
cp: cannot stat `../../../backup-peak/system/lib/libaudioeq.so': No such file or directory
Failed to pull libaudioeq.so. Giving up.

> Build failed! <

Build with |./build.sh -j1| for better messages
If all else fails, use |rm -rf objdir-gecko| to clobber gecko and |rm -rf out| to clobber everything else.

Pour résoudre ce problème, il n'est pas nécessaire de supprimer les répertoires objdir-gecko et out dans leur intégralité. Il suffit de supprimer le répertoire de sauvegarde avec cette commande) :

$rm -rf backup-peak

Problèmes de compilation pour l'émulateur

Si vous construisez une version d'un émulateur, vous pourrez rencontrer certains problèmes. Les informations détaillées ici permettent d'en résoudre certains.

Attention : l'émulateur x86 est plus difficile à installer et n'est pas très bien supporté.

Le système de compilation d'un émulateur construit à la fois la version 32 bits et la version 64 bits de l'émulateur. L'émulateur aura besoin d'utiliser OpenGL, cela signifie qu'il vous faudra avoir installé les bibliothèques 32 bits et 64 bits pour OpenGL. Voir la discussion à ce sujet sur le bug 897727.

Deux méthodes permettent de résoudre ce problème :

Première solution : avoir installé les deux bibliothèques OpenGL 32 bits et 64 bits et avoir construit les liens symboliques (symlinks)

Si votre distribution Linux dispose de paquets multilib pour les bibliothèques OpenGL, vous pouvez les installer manuellement. Il vous faudra peut être ajouter manuellement certains liens symboliques.

Par exemple, sur Ubuntu 12.04 LTS x86-64, le paquet libgl1-mesa-dev ne peut pas être installé simultanément pour les versions x86-64 et i386 mais la combinaison de paquets suivante peut être installée :

sudo apt-get install libgl1-mesa-dev libglapi-mesa:i386 libgl1-mesa-glx:i386

Une fois avoir lancé la commande précédente, il vous faudra créer quelques liens symboliques pour que la compilation puisse fonctionner :

sudo ln -s /usr/lib/i386-linux-gnu/libX11.so.6 /usr/lib/i386-linux-gnu/libX11.so
sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so

Seconde solution : corriger le dépôt pour que l'émulateur ne soit compilé qu'en 64 bits

Il suffit d'appliquer ce correctif au dépôt git sdk/ situé sous le dépôt B2G. L'émulateur B2G ne sera ainsi compilé qu'en une version 64 bits, ce qui permettra d'éviter tout problème e gestion des bibliothèques pour différentes architectures. Dans tous les cas, l'émulateur 32 bits ne sera pas utilisé sur un système 64 bits. Cette solution est la plus simple à mettre en œuvre (sauf si le patch devient un jour corrompu...).

Prochaines étapes

Une fois la compilation achevée, la suite dépendra de votre cible : un appareil mobile « réel » ou un émulateur. Pour obtenir les informations pertinentes, vous pouvez lire les articles suivants :

Soumettre des bugs sur B2G/Firefox OS/Gaia

Une fois que votre version de B2G/Firefox OS fonctionne, vous serez en mesure de rapporter des bogues et d'aider à l'amélioration de Firefox OS. Si vous trouvez un bug, vous pouvez le décrire sur Bugzilla, grâce au projet "Firefox OS" en spécifiant bien les éléments de version :

  1. Pour commencer, indiquez le numéro de version majeur, par exemple 1.4.0.0-prerelease. Cette information se trouve dans Paramètres > Informations.
  2. Vous pouvez fournir des identifiants de versions plus spécifiques en indiquant les hash correspondant aux dépôt gaia et gecko. Pour obtenir ces informations, vous pouvez utiliser les commanes suivantes :
    #!/bin/bash
    (cd gaia;  echo "gaia  $(git rev-parse HEAD)")
    (cd gecko; echo "gecko $(git rev-parse HEAD)")

Étiquettes et contributeurs liés au document

 Contributeurs à cette page : jwhitlock, Leonarf, tchevalier, SphinxKnight
 Dernière mise à jour par : jwhitlock,