viernes, 19 de noviembre de 2010

Lightning en Thunderbird - Ubuntu 10.04 64 bits

Nota: cuando escribí esta entrada todavía no había caído en la cuenta de que Lightning se puede instalar desde los repositorios en versiones recientes de Ubuntu. De todas formas si alguien necesita compilarlo el método propuesto debería seguir siendo válido.

Sunbird es un buen programa, pero siempre me molestó tenerlo que dejar abierto, a lo sumo minimizado en la barra de tareas, o tenerlo que consultar periódicamente. Estaría bien poder minimizarlo a la bandeja o tenerlo integrado en el cliente de correos (que de todas formas siempre tengo en ejecución mientras estoy en mi escritorio).

Con Lightning es posible tener en Thunderbird un calendario con eventos y tareas.

Pero los usuarios de Ubuntu 10.04 (de 64 bits) no podemos instalar Lightning por el acostumbrado método de descargarlo desde la página de addons de Mozilla, ya que al intentar instalarlo nos dirá que no es compatible con nuestra versión de Thunderbird. Si usamos Ubuntu 10.04 de 32 bits no tendremos ese problema.

La única solución a esto es compilar Thunderbird y Lightning nosotros mismos (también podemos intentar instalar la versión de Thunderbird de 32 bits, que en teoría debería funcionar correctamente, y usar el xpi de la página de addons). A continuación describo qué funcionó para mí. Compilar Thunderbird es necesario para poder compilar Lightning pero no es necesario que usemos el Thunderbird compilado por nosotros, podemos simplemente instalar el xpi de Lightning que compilamos en nuestro Thunderbird que instalamos usando Synaptic, que es lo que yo hice.

El camino corto

Asumiendo que ya hemos instalado Thunderbird (por el método que sea), lo que sigue es ver que versión de Thunderbird tenemos. Ejecutamos Thunderbird y vamos al menú Ayuda->Acerca de Thunderbird

En mi caso, y probablemente de todos los que hayan instalado desde los repositorios de Ubuntu, es la versión 3.0.10.

Abrimos una terminal para ir ingresando los comandos que dejo a continuación.

Primero debemos instalar Mercurial que usaremos para obtener una copia de una de las ramas del proyecto Mozilla. En un terminal, escribimos:

sudo apt-get install mercurial

Una vez acabado también necesitamos instalar cvs ya que el script client.py (del que hablaremos más adelante) intentará usar cvs durante su ejecución y dará error si no está instalado este paquete, así que:

sudo apt-get install cvs

Ahora, con la información que recolectamos anteriormente sobre nuestra versión de Thunderbird, decidiremos cuál rama usaremos.

  • http://hg.mozilla.org/releases/comm-1.9.1/ (Thunderbird 3.0, SeaMonkey 2.0, Sunbird 1.0)
  • http://hg.mozilla.org/releases/comm-1.9.2/ (Thunderbird 3.1)

Mi versión de Thunderbird es 3.0.10, por lo tanto usaré la rama de la versión 3.0. A continuación ejecutamos el siguiente comando:

:~$ hg clone http://hg.mozilla.org/releases/comm-1.9.1/ src

Los que estén usando Thunderbird 3.1.x deberán usar la otra url.

Dependiendo de nuestra velocidad de bajada esto puede llevar un rato. Seamos pacientes.

Una vez acabado, ejecutamos:

:~$ cd src
:~/src$ python client.py checkout

Va a tardar aún más que el comando anterior. Paciencia.

Ahora, para que Lightning muestre los textos en español debemos contar también con los archivos de localización para es-ES.

:~/src$ cd ./..
:~$ hg clone http://hg.mozilla.org/releases/l10n-mozilla-1.9.1/es-ES/ es

Esto nos deja un directorio es en nuestro directorio local, y fuera del directorio src que creamos anteriormente.

Los que tienen Thunderbird 3.1.x deberán usar esta url: <http://hg.mozilla.org/releases/l10n-mozilla-1.9.2/es-ES/>. noten que se diferencian sólo en un número.

Una vez acabado deberemos crear un archivo .mozconfig donde quede especificado qué proyectos y cuales extensiones queremos construir. En este caso, como queremos obtener una compilación de Lightning para nuestro Thunderbird que ya tenemos instalado, vamos a querer entonces compilar Thunderbird con la extensión Lightning (no se puede compilar Lightning sin compilar Thunderbird). No importa si le falta alguna característica a Thunderbird, ya que sólo nos interesa el xpi de Lightning y que esté en el idioma correcto.

Para crear el archivo .mozconfig hacemos lo siguiente:

:~$ cd src
:~/src$ gedit .mozconfig

Esto nos crea el archivo .mozconfig dentro de src y ya nos inicia gedit para empezar a modificarlo. Si no tenemos gedit usamos cualquier otro editor de textos, pero si usamos GNOME seguro gedit será la opción más práctica. Otra alternativa sería edit .mozconfig que abre el archivo con el editor de textos predeterminado, pero seguro será un editor de textos sin interfaz gráfica.

El archivo .mozconfig que me dio resultado a mí lo dejo a continuación:

mk_add_options MOZ_CO_PROJECT=mail,calendar
mk_add_options MOZ_CO_LOCALES=es
mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/objdir-tb-release
ac_add_options --enable-ui-locale=es
ac_add_options --with-l10n-base=/home/usuario
ac_add_options --enable-application=mail
ac_add_options --enable-calendar
# mk_add_options MOZ_MAKE_FLAGS="-j4" # desactivar si da problemas
ac_add_options --enable-extensions=default

Así que copiamos y pegamos eso en gedit. Debemos reemplazar la ruta /home/usuario por /home/ + nuestro nombre de usuario. Ejemplo: si nuestro usuario en el escritorio se llama juan quedaría:

ac_add_options --with-l10n-base=/home/juan

Luego guardamos los cambios y cerramos gedit. La opción -j4 la podemos descomentar para intentar aumentar la velocidad del proceso de compilación, pero si da problemas (mensajes de error pocos descriptivos, etc) entonces la volvemos a comentar. Ahora seguimos con la terminal.

Hay una serie de paquetes que no vienen por defecto con Ubuntu que deberíamos tener instalados antes de intentar compilar Thunderbird. Los paquetes son:

  • autoconf2.13
  • build-essential
  • libgtk2.0-dev
  • libdbus-glib-1-dev
  • libasound2-dev
  • libcurl4-gnutls-dev
  • libIDL-dev
  • libxt-dev
  • libnotify-dev
  • libiw-dev

Para instalar estos paquetes, por cada uno, ejecutamos:

sudo apt-get install [nombre del paquete]

Reemplazando [nombre del paquete] por el nombre de cada paquete de la lista. No importa si pensamos que ya tenemos algunos de esos paquetes, no está demás ejecutar de todas formas apt-get para ver si tenemos la versión más actual y ya dejarla instalada. La excepción sería el paquete autoconf2.13 ya que para este paquete estamos haciendo un downgrade, si tenemos autoconf probablemente sea una versión más actual que la 2.13, pero Mozilla usa 2.13 y otra versión dará problemas. Esto está explicado en el Mozilla Build FAQ.

Ahora procedemos a ejecutar:

:~/src$ make -f client.mk build

Puede llevar más de 30 minutos, mucho más. Al finalizar el xpi de Lightning lo encontramos en /home/usuario/src/objdir-tb-release/mozilla/dist/xpi-stage, el archivo se llama lightning.xpi

Para instalarlo en nuestro Thunderbird iniciamos este, vamos a Herramientas->Complementos (en algunas localizaciones al español dice Agregados en lugar de Complementos. En la ventana de Complementos, abajo a la izquierda, hay un botón que dice Instalar.... Se nos abre el diálogo de elegir archivo, navegamos hasta la ruta indicada en el párrafo anterior y elegimos el archivo lightning.xpi.

Y ya debería haber quedado instalado. A disfrutar de esta gran extensión para Thunderbird.

¿Qué puede ir mal?

Si venimos siguiendo los pasos desde el principio de esta entrada puede que lo consigamos a la primera, pero si alguien llegó aquí después de hacer una búsqueda en la web, después de haber intentado compilar por sí mismo Lightning y haber encontrado algún error, seguramente le resulte más útil lo que dejo a continuación:

Al ejecutar client.py checkout parece que todo anda bien, pero se produce una excepción al intentar hacer un checkout usando cvs, dando el siguiente mensaje de salida:

CVS checkout begin: 2010-11-22 17:05:33 UTC
Executing command: ['cvs', '-d', ':pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot', '-q', 'checkout', '-P', '-r', 'LDAPCSDK_6_0_6D_MOZILLA_RTM', '-d', 'c-sdk', 'mozilla/directory/c-sdk']
Traceback (most recent call last):
  File "./client.py", line 447, in <module>
    do_cvs_checkout(LDAPCSDK_DIRS, LDAPCSDK_CO_TAG, options.cvsroot, options.cvs, '')
  File "./client.py", line 264, in do_cvs_checkout
    cwd=os.path.join(topsrcdir, checkoutdir, parent))
  File "./client.py", line 73, in check_call_noisy
    execute_check_call(cmd, *args, **kwargs)
  File "./client.py", line 69, in execute_check_call
    check_call(cmd, *args, **kwargs)
  File "/usr/lib/python2.6/subprocess.py", line 493, in check_call
    retcode = call(*popenargs, **kwargs)
  File "/usr/lib/python2.6/subprocess.py", line 480, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/usr/lib/python2.6/subprocess.py", line 633, in __init__
    errread, errwrite)
  File "/usr/lib/python2.6/subprocess.py", line 1139, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

Esto es porque cvs no está instalado. Al parecer no todo el código reside en un repositorio Mercurial, por lo tanto también es necesario tener cvs para poder ejecutar client.py sin problemas.

La solución es instalar cvs:

sudo apt-get install cvs

Y volver a ejecutar ./client.py checkout

Otra cosa que también puede ocurrir es que la conexión falle durante la ejecución del script client.py, provocando que se alcance el final de un archivo que se esperaba fuera de mayor tamaño, se verá un mensaje como este:

abort: premature EOF reading chunk (got 2313 bytes, expected 2488)
The exception was:
subprocess.CalledProcessError: Command '['hg', 'clone', 'http://hg.mozilla.org/releases/mozilla-1.9.1/', './mozilla']' returned non-zero exit status 255

Traceback (most recent call last):
  File "client.py", line 428, in <module>
    do_hg_pull('mozilla', options.mozilla_repo, options.hg, options.mozilla_rev)
  File "client.py", line 232, in do_hg_pull
    retryMax=options.retries)
  File "client.py", line 96, in check_call_noisy
    raise Exception("Command '%s' failed %d time(s). Giving up." % (cmd, retryMax + 1))
Exception: Command '['hg', 'clone', 'http://hg.mozilla.org/releases/mozilla-1.9.1/', './mozilla']' failed 2 time(s). Giving up.

La solución a esto es ejecutar denuevo ./client.py checkout. dependiendo de nuestra conexión, puede fallar más de una vez, difícilmente en el mismo archivo, es decir, el número de bytes en esta línea: (got 2313 bytes, expected 2488) serán diferentes cada vez. Si esto ocurre, simplemente seguimos intentando con ./client.py checkout hasta que al final conseguirá llegar al final.

Al ejecutar make -f client.mk build también puden ocurrir algunos errores. Documentados a continuación.

Si no tenemos instalado autoconf, se produce el siguiente mensaje de salida:

Adding client.mk options from /home/usuario/src/.mozconfig:
    MOZ_CO_PROJECT=mail,calendar
    MOZ_OBJDIR=$(TOPSRCDIR)/objdir-tb-release
    MOZ_MAKE_FLAGS=-j4
make[1]: se ingresa al directorio `/home/usuario/src'
Generating /home/usuario/src/configure using autoconf
cd /home/usuario/src; 
Generating /home/usuario/src/mozilla/configure using autoconf
cd /home/usuario/src/mozilla; 
Generating /home/usuario/src/mozilla/js/src/configure using autoconf
cd /home/usuario/src/mozilla/js/src; 
cd /home/usuario/src/objdir-tb-release
/home/usuario/src/configure
/bin/sh: /home/usuario/src/configure: not found
*** Fix above errors and then restart with               "make -f client.mk build"
make[1]: *** [configure] Error 1
make[1]: se sale del directorio `/home/usuario/src'
make: *** [/home/usuario/src/objdir-tb-release/Makefile] Error 2

La solución es instalar autoconf además tiene que ser la versión 2.13, no nos sirve la versión más actual. Por lo tanto, escribimos en la terminal:

sudo apt-get install autoconf2.13

.../mozilla-central/client.mk:284: *** Couldn't find autoconf 2.13. Stop.

Esto ocurre porque la versión de autoconf que tenemos no es la correcta. La razón por la cual Mozilla no usa la versión 2.5.x está explicada en el Mozilla Build FAQ. La solución, es la misma que para el caso anterior, instalar el paquete autoconf2.13.

Otra cosa que puede pasarnos es que no esté instalado el software básico de compilación. Esto produce el siguiente mensaje de error:

configure: error: installation or configuration problem: C++ compiler cannot create executables.
*** Fix above errors and then restart with               "make -f client.mk build"
make[1]: *** [configure] Error 1
make[1]: se sale del directorio `/home/usuario/src'
make: *** [/home/usuario/src/objdir-tb-release/Makefile] Error 2

La solución es instalar el meta paquete build-essential. Que nos instala los compiladores de c, c++ y librerías básicas.

sudo apt-get install build-essential

Si nunca hemos compilado nada que use gtk, probablemente no tengamos el paquete de desarrollo de libgtk. Esto produce el siguiente mensaje:

configure: error: Library requirements (gtk+-2.0 >= 2.10.0 gtk+-unix-print-2.0 glib-2.0 gobject-2.0 gdk-x11-2.0) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.
*** Fix above errors and then restart with               "make -f client.mk build"
make[1]: *** [configure] Error 1
make[1]: se sale del directorio `/home/usuario/src'
make: *** [/home/usuario/src/objdir-tb-release/Makefile] Error 2

La solución es instalar el paquete correspondiente:

sudo apt-get install libgtk2.0-dev

También puede ser que nos falte libdbus, porque dbus seguro lo tenemos incluso desde una instalación fresca de Ubuntu pero el paquete de desarrollo de dbus probablemente no.

checking for dbus-glib-1 >= 0.60... Package dbus-glib-1 was not found in the pkg-config search path. Perhaps you should add the directory containing `dbus-glib-1.pc' to the PKG_CONFIG_PATH environment variable No package 'dbus-glib-1' found
configure: error: Library requirements (dbus-glib-1 >= 0.60) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.
*** Fix above errors and then restart with               "make -f client.mk build"
make[1]: *** [configure] Error 1
make[1]: se sale del directorio `/home/usuario/src'
make: *** [/home/usuario/src/objdir-tb-release/Makefile] Error 2

sudo apt-get install libdbus-glib-1-dev

También puede ocurrir que nos diga que falta el paquete alsa.

checking for alsa... Package alsa was not found in the pkg-config search path.
Perhaps you should add the directory containing `alsa.pc'
to the PKG_CONFIG_PATH environment variable
No package 'alsa' found
configure: error: Need alsa for Ogg or Wave decoding on Linux.  Disable with --disable-ogg --disable-wave.
*** Fix above errors and then restart with               "make -f client.mk build"
make[1]: *** [configure] Error 1
make[1]: se sale del directorio `/home/usuario/src'
make: *** [/home/usuario/src/objdir-tb-release/Makefile] Error 2

La solución que me funcionó fue instalar el paquete libasound2-dev ya que lo que propone el mismo mensaje de error, usar el parámetro --disable-ogg y --disable-audio lamentablemente en mi caso impedía la compilación, al final lo único que resultó fue instalar el paquete.

sudo apt-get install libasound2-dev

De todas formas, si alguien quiere intentar lo de --disable-wave y --disable-ogg, se debe agregar al archivo .mozconfig las líneas:

ac_add_options --disable-wave
ac_add_options --disable-ogg

Si incurrimos en el siguiente error:

configure: error: Could not compile basic X program.

El cual es muy poco descriptivo, y no parece estar relacionado con la falta de alguna librería, no obstante sí lo es y se puede solucionar instalando el siguiente paquete:

sudo apt-get install libxt-dev

Si nos sale diciendo que falta la librería curl:

checking for curl/curl.h... no
configure: error: Couldn't find curl/curl.h which is required for the crash reporter.  Use --disable-crashreporter to disable the crash reporter.
configure: error: /home/usuario/src/mozilla/configure failed for mozilla
*** Fix above errors and then restart with               "make -f client.mk build"
make[1]: *** [configure] Error 1
make[1]: se sale del directorio `/home/usuario/src'
make: *** [/home/usuario/src/objdir-tb-release/Makefile] Error 2

La podemos instalar o bien podemos agregar ac_add_options --disable-crashreporter al archivo .mozconfig. Si sólo nos interesa Lightning deberíamos poder agregar esa línea al archivo .mozconfig sin miedo. Pero en mi caso impedía la compilación por lo que terminé instalándo el paquete.

sudo apt-get install libcurl4-gnutls-dev

Otra librería que puede faltarnos es libIDL, que da el siguiente mensaje de error:

checking for libIDL-2.0 >= 0.8.0... Package libIDL-2.0 was not found in the pkg-config search path. Perhaps you should add the directory containing `libIDL-2.0.pc' to the PKG_CONFIG_PATH environment variable No package 'libIDL-2.0' found
configure: error: Library requirements (libIDL-2.0 >= 0.8.0) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.
configure: error: /home/usuario/src/mozilla/configure failed for mozilla
*** Fix above errors and then restart with               "make -f client.mk build"
make[1]: *** [configure] Error 1
make[1]: se sale del directorio `/home/usuario/src'
make: *** [/home/usuario/src/objdir-tb-release/Makefile] Error 2

Lo solucionamos instalando el paquete libIDL-dev

sudo apt-get install libIDL-dev

Puede pasar que al primer intento asumamos que la ruta que se pasa al parámetro: ac_add_options --with-l10n-base es relativa al directorio src cuando en realidad es relativa al directorio obj. Si vemos un mensaje similar a este:

processing /home/usuario/src/mozilla/netwerk/locales/jar.mn
Traceback (most recent call last):
  File "/home/usuario/src/mozilla/config/JarMaker.py", line 463, in <module>
    main()
  File "/home/usuario/src/mozilla/config/JarMaker.py", line 460, in main
    jardir=options.j)
  File "/home/usuario/src/mozilla/config/JarMaker.py", line 231, in makeJar
    localedirs)
  File "/home/usuario/src/mozilla/config/JarMaker.py", line 300, in processJarSection
    outHelper, jf)
  File "/home/usuario/src/mozilla/config/JarMaker.py", line 332, in _processEntryLine
    raise RuntimeError("file not found: " + src)
RuntimeError: file not found: necko.properties

Cuando esto ocurre lo mejor es no darle más vueltas y usar una ruta absoluta para ac_add_options --with-l10n-base por ejemplo, si tenemos ac_add_options --with-l10n-base=.. lo reemplazamos por: ac_add_options --with-l10n-base=/home/usuario o la ruta que corresponda a nuestro caso en particular, pero siempre absoluta.

checking for libnotify >= 0.4... Package libnotify was not found in the pkg-config search path. Perhaps you should add the directory containing `libnotify.pc' to the PKG_CONFIG_PATH environment variable No package 'libnotify' found
configure: error: Library requirements (libnotify >= 0.4) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.
configure: error: /home/usuario/src/mozilla/configure failed for mozilla

Esto es porque falta el paquete de desarrollo de libnotify. La instalamos ejecutando:

sudo apt-get install libnotify-dev

checking for iwlib.h... no
configure: error: Can't find header iwlib.h for Necko WiFi scanning (might be in package libiw-dev (Ubuntu) or wireless-tools-devel (Fedora)); use --disable-necko-wifi to disable

Creo que esto es específico de Thunderbird 3.1. En este caso en vez de instalar una librería podríamos simplemente usar --disable-necko-wifi en el archivo .mozconfig pero tener la librería y sus cabeceras no hace ningún daño tampoco, la descarga e instalación duran unos pocos segundos. Para instalarla:

sudo apt-get install libiw-dev

A veces, después de ir corrigiendo uno a uno los errores, resulta que aún no conseguimos llegar al final del proceso de compilación. Si esto ocurre revisamos todo una vez más. ¿Está correcto el archivo .mozconfig? ¿No cometimos algún error de tipografía?. Si estamos usando la opción -j4 en nuestro archivo .mozconfig probamos a comentarla (agregar un # al principio de la línea, para que sea ignorada esa línea de texto). Esta opción existe para aprovechar los múltiples núcleos que nuestro procesador pueda tener para aumentar la velocidad del proceso de compilación. Pero puede dar problemas. Me ha servido en procesadores con 2 y 4 núcleos, y se siente la ganancia en tiempo de compilación, pero me ha fallado en la máquina virtual, por ejemplo, obligándome a comentar la opción para poder llegar al final del proceso de compilación sin problemas.

Si después de estar seguros que tenemos todos los requisitos, ya desactivado -j4 o -j2 y aún no conseguimos compilar probamos con los siguientes comandos:

make -f client.mk clean

Y luego, intentamos una vez más:

make -f client.mk build

A veces al ejecutar make -f client.mk clean falla nada más empezar arrojando este mensaje o uno muy similar:

Adding client.mk options from /home/usuario/src/.mozconfig:
    MOZ_CO_PROJECT=mail,calendar
    MOZ_CO_LOCALES=es
    MOZ_OBJDIR=$(TOPSRCDIR)/objdir-tb-release
make  -C /home/usuario/src/objdir-tb-release clean
make[1]: se ingresa al directorio `/home/usuario/src/objdir-tb-release'
make -C mozilla clean
make[2]: se ingresa al directorio `/home/usuario/src/objdir-tb-release/mozilla'
make[2]: *** No hay ninguna regla para construir el objetivo `clean'.  Alto.
make[2]: se sale del directorio `/home/usuario/src/objdir-tb-release/mozilla'
make[1]: *** [clean] Error 2
make[1]: se sale del directorio `/home/usuario/src/objdir-tb-release'
make: *** [clean] Error 2

En este caso estamos en problemas puesto que no podemos intentar un clean para ver si después nos permite compilar. Lo único que funciona es eliminar manualmente el directorio objdir-tb-release. Esto se puede hacer desde Nautilus o bien desde la terminal ejecutando:

:~/src$ rm -r objdir-tb-release

Enlaces

0 comentarios:

Publicar un comentario