Compilar Firefox OS en Fedora 20

Logo do Firefox OS

Este post, está feito en base a un borrador que fun escribindo mentres compilaba a miña propia rom de B2G 2.1, sírveme como referencia, mais está sin “refinar”, polo que nalgúns casos deberás usala túa intuición.

Prerequisitos

Instalar os prerequisitos de:

En caso do Fedora 20, instalar os seguintes paquetes:
sudo yum install autoconf213 bison bzip2 ccache curl flex gawk gcc-c++ git glibc-devel glibc-static libstdc++-static libX11-devel make mesa-libGL-devel ncurses-devel patch zlib-devel ncurses-devel.i686 readline-devel.i686 zlib-devel.i686 libX11-devel.i686 mesa-libGL-devel.i686 glibc-devel.i686 libstdc++.i686 libXrandr.i686 zip perl-Digest-SHA wget

En caso de erro do compilador (Recomendable)

Se tes erros na compilación recomendan instalar este compilador:

curl -O http://people.mozilla.org/~gsvelto/gcc-4.6.4-fc19.tar.xz
sudo tar -x -a -C /opt -f gcc-4.6.4-fc19.tar.xz
 
export CC=/opt/gcc-4.6.4/bin/gcc
export CXX=/opt/gcc-4.6.4/bin/g++

Configurala caché do compilador

Configurala caché do compilador
$ export CCACHE_DIR=<ruta/directorio/cache>
$ ccache --max-size 20GB
Para comprobar que colleu ben tódala configuración:
$ ccache -s

Configurando udev para usalo co ZTE Open

# vi /etc/udev/rules.d/android.rules

No meu caso elexín ZTE Open, onde pon que 19d2 poñedes o código do vendedor do voso teléfono, aquí podedes consultalo código: VendorIds

Introducimos o seguinte no arquivo android.rules aberto:
SUBSYSTEM=="usb", ATTR{idVendor}=="19d2", MODE="0666", GROUP="plugdev"
Dámoslle só permisos de lectura ao arquivo:
# chmod a+r /etc/udev/rules.d/android.rules
Reiniciámolo servizo udev:
systemctl restart systemd-udevd.service

Instalar o ADB

https://developer.mozilla.org/en-US/Firefox_OS/Debugging/Installing_ADB

# yum install android-tools

Configuralo móbil para compilación

No móbil accedemos a: Opciones > información del dispositivo > más información > desarrolladores > activar depuración remota.

Agora conectamos o móbil ao computador e como usuario normal executamos “adb devices” e debería amosalo seguinte resultado:
$ adb devices
List of devices attached 
  full_inari      device

No caso de ter problemas co recoñecemento do ADB

Se tiveras algún problema ou te amosa o móbil como “????????”

Exemplo:
# adb devices
List of devices attached 
????????????    no permissions
Como root deberías executalo seguinte:
# adb kill-server
# adb start-server
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
 
# adb devices
List of devices attached 
full_inari      device

Por último, lémbrate de desbloquear o bloqueo automático da pantaia, xa que unha vez a pantaia se bloquea intorrómpese a conexión co adb.

Realizar unha copia de seguridade do teléfono

Recomendan facer unha copia de seguridade da partición do sistema do teléfono, polo que aquí deixo como facela:

$ adb pull /system BACKUP_FIREFOX_OS/system
Dependendo do terminal pódeche facer falta facelo seguinte:
$ adb pull /data BACKUP_FIREFOX_OS/data
$ adb pull /vendor BACKUP_FIREFOX_OS/vendor

Preparando a primeira compilación de B2G

Clonámolo repositorio de B2G:
git clone git://github.com/mozilla-b2g/B2G.git
Unha vez remate a descarga, accedemos ao directorio B2G:
cd B2G

Actualizando a árbore B2G

Se xa tiñas descargado o repositorio e queres actualizalo as mudanzas máis recentes:
git fetch origin
git checkout origin/master
Pra comprobar que se actualizou todo:
git show HEAD
./config.sh inari

Ver se o último comit coincide co último comit publicado en: https://github.com/mozilla-b2g/B2G/commits/master

Ver o estado das versión de B2G

Para ver o estado das versión se pode comprobar aquí: https://wiki.mozilla.org/B2G/Roadmap Mais actualmente o desenrolo de B2G foi parado pola propia Mozilla.

Configurar B2G co branch que nos interesa

https://developer.mozilla.org/en-US/Firefox_OS/Preparing_for_your_first_B2G_build

Este paso vai requerir dun bo tempo ( uns 30 ou 40 minutos con unha conexión de 100/10 Mb/s ) se non o fixéramos antes, eleximos a variante “user” para que non meta aplicacións de desenrolo que non usaremos, algunhas non se poden desinstalar.

Máis información sobre cómo configurala clonación do B2G: https://developer.mozilla.org/en-US/docs/Mozilla/Firefox_OS/Building_and_installing_Firefox_OS/B2G_Build_Variables_Reference_Sheet

Se configura para usar a versión 2.1, na súa variante de usuario:
$ BRANCH=v2.1 VARIANT=user ./config.sh inari
No caso de erro na compilación usar:
$ bash config.sh inari

Meterá tódolo software de desenrolo e probas, mais superarás o proceso de compilado, se este os faia pode ser por falta de algunha biblioteca no teu entorno de compilación.

No caso de recibir un erro “UnicodeDecodeError”
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 19: ordinal not in range(128)
Repo sync failed

Hai que movelo directorio a unha ruta do sistema, cuxas letras cumpran co estandar “ascii”, máis info: https://developer.mozilla.org/en-US/Firefox_OS/Preparing_for_your_first_B2G_build

Compilando Firefox OS / B2G

Se queremos construir un .zip para aplicar a actualización podemos ollar este manual: https://developer.mozilla.org/en-US/Firefox_OS/Building_and_installing_Firefox_OS/Firefox_OS_update_packages#Generating_a_complete_FOTA_target_files_zip.

$ ./build.sh target-files-package
$ cp out/target/product/$DEVICE/obj/PACKAGING/target_files_intermediates/$DEVICE-target_files-$VARIANT.$USER.zip <destination>

Pra consultar o número de fíos usados na compilación consultar:

https://developer.mozilla.org/en-US/Firefox_OS/Building#Setting_the_number_of_processor_cores_to_use

Accedemos ao directorio B2G e executámolo seguinte:
./build.sh -j4

Onde -j indica o número de fíos a usar na compilación.

O resultado obtido tras un bo rato de compilado é:
Finding NOTICE files: out/target/product/inari/obj/NOTICE_FILES/hash-timestamp
Combining NOTICE files: out/target/product/inari/obj/NOTICE.html
Installed file list: out/target/product/inari/installed-files.txt
Target system fs image: out/target/product/inari/obj/PACKAGING/systemimage_intermediates/system.img
Install system fs image: out/target/product/inari/system.img
out/target/product/inari/system.img+ total size is 132456192
 
real    105m52.367s
user    279m13.771s
sys     18m18.217s
Run |./flash.sh| to flash all partitions of your device
Agora aplicámola compilación ao móbil:
./flash.sh
A execución do script debería amosar unha saída parecida a esta:
< waiting for device >
erasing 'cache'...
OKAY [  0.522s]
finished. total time: 0.522s
erasing 'userdata'...
OKAY [  1.386s]
finished. total time: 1.386s
sending 'userdata' (54466 KB)...
OKAY [  4.649s]
writing 'userdata'...
OKAY [  9.835s]
finished. total time: 14.484s
sending 'system' (129351 KB)...
OKAY [ 11.044s]
writing 'system'...
OKAY [ 22.238s]
finished. total time: 33.282s
rebooting...
 
finished. total time: 0.001s
Attempting to set the time on the device
time 1410909135 -> 1410909135.0

E listo, con isto xa terías o Firefox OS / B2G compilado , actualizado e instalado no teu terminal.

Resolución de algúns erros que poden xurdir no proceso

Falta de javac

Pode ser que ao iniciar o “./build.sh -j4 “, che diga “witch: … javac …” ou algo similar, de que non atopa o javac.

O problema en fedora 20, se soluciona instalando:
yum install java-devel

< waiting for device >

Se cando vas executar o script “flash.sh” quédase agardando a consola coa mensaxe “waiting for device…”
$ ./flash.sh 
< waiting for device >

Tes un problema coa execución de udev, isto amañase executando o flash.sh como root, sería a solución máis rápida, mais non é recomendable por temas de permisos, seguridade do teu sistema, etc…

Pra solucionar o erro e executalo sen problemas como usuario normal, podes seguir a seguinte guía: https://developer.mozilla.org/en-US/Firefox_OS/Installing_on_a_mobile_device#Configuring_the_udev_rule_for_your_device

Executándono como root non amosa ese erro:
# ./flash.sh
< waiting for device >
erasing 'cache'...
OKAY [  0.522s]
finished. total time: 0.522s
erasing 'userdata'...
OKAY [  1.382s]
finished. total time: 1.382s
sending 'userdata' (54336 KB)...
OKAY [  4.625s]
writing 'userdata'...
OKAY [  9.812s]
finished. total time: 14.437s
sending 'system' (129417 KB)...
OKAY [ 10.982s]
writing 'system'...
OKAY [ 22.236s]
finished. total time: 33.218s
rebooting...
 
finished. total time: 0.002s
Attempting to set the time on the device
time 1414930899 -> 1414930899.0

Agora mesmo teño instalado B2G na súa versión 2.1, compilada a 2 de Novembro do 2014.

Tempos de compilación:

A primeira compilación do día, non terminaba de aplicala e se quedaba na pantaia co logo de firefox, amosoume o aviso de javac, e estos foron os resultados:

Finding NOTICE files: out/target/product/inari/obj/NOTICE_FILES/hash-timestamp
Combining NOTICE files: out/target/product/inari/obj/NOTICE.html
Installed file list: out/target/product/inari/installed-files.txt
Target system fs image: out/target/product/inari/obj/PACKAGING/systemimage_intermediates/system.img
Install system fs image: out/target/product/inari/system.img
out/target/product/inari/system.img+ total size is 132523776
 
real    102m25.053s
user    224m31.683s
sys     15m13.628s
Run |./flash.sh| to flash all partitions of your device

Uns 224 minutos que veñen sendo unhas 3 horas, si, como para que logo non funcione… xD

Este foi o resultado da compilación que fixen tras solucionar o tema da falta do compilador de java “javac”:
Finding NOTICE files: out/target/product/inari/obj/NOTICE_FILES/hash-timestamp
Combining NOTICE files: out/target/product/inari/obj/NOTICE.html
Installed file list: out/target/product/inari/installed-files.txt
Target system fs image: out/target/product/inari/obj/PACKAGING/systemimage_intermediates/system.img
Install system fs image: out/target/product/inari/system.img
out/target/product/inari/system.img+ total size is 132523776
 
real    21m0.301s
user    8m28.262s
sys     2m12.282s
Run |./flash.sh| to flash all partitions of your device

Scripts

Script con tódolos pasos para configurar o entorno de fedora 20 para compilar B2G:
#!/bin/bash
####
# Author: Delio Docampo Cordeiro
# Date: 2015-11-18
# Source: deliodc.com
# Descripton: This script configures and install al software you need to compile firefox OS
####
# Install al needed packages:
sudo yum install -y  autoconf213 bison bzip2 ccache curl flex gawk gcc-c++ git glibc-devel glibc-static libstdc++-static libX11-devel make mesa-libGL-devel ncurses-devel patch zlib-devel ncurses-devel.i686 readline-devel.i686 zlib-devel.i686 libX11-devel.i686 mesa-libGL-devel.i686 glibc-devel.i686 libstdc++.i686 libXrandr.i686 zip perl-Digest-SHA wget java-devel cmake autoconf
 
# get gcc-4.6.4 needed for compile B2G
curl -O http://people.mozilla.org/~gsvelto/gcc-4.6.4-fc19.tar.xz
sudo tar -x -a -C /opt -f gcc-4.6.4-fc19.tar.xz
 
# Set gcc-4.6.4 as default compiler for this sesion:
export CC=/opt/gcc-4.6.4/bin/gcc
export CXX=/opt/gcc-4.6.4/bin/g++
 
# Set CC cache dir:
mkdir CCACHE_DIR
export CCACHE_DIR=`pwd`/CCACHE_DIR
echo -e "CCACHE_DIR = $CCACHE_DIR"
ccache --max-size 20GB
ccache -s
####################### EXECUTE WITH ROOT USER
## Set udev android rule for reconice Inari device (Requires ROOT access, for the defaults fedora 20 setups):
#su
#echo "SUBSYSTEM==\"usb\", ATTR{idVendor}==\"19d2\", MODE=\"0666\", GROUP=\"plugdev\"" > /etc/udev/rules.d/android.rules
#chmod -v a+r /etc/udev/rules.d/android.rules
#systemctl restart systemd-udevd.service
 
## Install ADB tolls
#yum update && yum install -y android-tool
#adb kill-server
#adb devices
#exit 
# Close ROOT session
Script cos pasos para clonar o repo de B2G e compilar B2G:
#!/bin/bash
####
# Autho: Delio Docampo Cordeiro
# Date: 2015-11-18
# Source: deliodc.com
# Descripton: This script clones B2G git repo and compile it
####
 
git clone git://github.com/mozilla-b2g/B2G.git
cd B2G
git fetch origin
git checkout origin/master
#cp -v ./.repo/repo/repo ./repo
BRANCH=v2.1 VARIANT=user ./config.sh inari
./build.sh -j2