Como Construir LibreOffice

From The Document Foundation Wiki
Jump to: navigation, search

Esta página documenta el proceso de construcción de la versión de desarrollo actual de LibreOffice, basada en un repositorio git llamado 'core'; como construir versiones antiguas, tales como las 3.3 y 3.4, esta documentado aqui.

Preparación

Dependencias

El primer paso es estar seguro de que tenemos todas las dependencias necesarias en tu plataforma para construir el producto. Hay páginas que detallan que y como instalar para Windows, Linux, y MacOS.

Espacio en Disco

Como mínimo, con todos los repositorios git, y el los productos construidos y empaquetados, necesitaras de 7 a 10 GB de espacio libre en disco, dependiendo de la plataforma, las opciones de construcción y las opciones específicas de autogen que estés usando, unos pocos mas de Gb si estas haciendo una construcción de depuración.

Ten en mente que si quieres hacer mas que solo construir el producto una vez para tu propio disfrute, la mayoría de vosotros querreis tener mas que un directorio de trabajo (veremos más tarde como seleccionarlos). Un directorio de trabajo te permite tener distintos entornos de construcción sin tener que duplicar la historia de git, pero esto te costara entre 6 y 9GB por directorio de trabajo.

Consiguiendo los fuentes

En el resto de este tutorial trabajaremos en ~/git, por supuesto eres libre de elegir el directorio que quieras como punto de inicio. Ahova descarguemos el repositorio git 'core':

$ mkdir git
$ cd git
$ git clone git://anongit.freedesktop.org/libreoffice/core libo
Cloning into libo...
Remote: Counting objects: 76845, done.
remote: Compressing objects: 100% (17328/17328), done.
remote: Total 76845 (delta 60786), reused 74045 (delta 58579)
Receiving objects: 100% (76845/76845), 15.82 MiB | 1.17 MiB/s, done.
Resolving deltas: 100% (60786/60786), done.
$ cd libo

Nota: Dependiendo de tu localización, hora del día, fase de la luna, etc..., el clonado de todos los repositorios git puede ser lento, o incluso fallar tras un tiempo. Por ello, proveemos unos tarballs actualizados semanalmente de los repositorios. Si tienes problemas con el metodo anterior, descarga el siguiente shell script: libo_git_from_tar.sh y ejecútalo, por ejemplo:

$ mkdir git
$ ./libo_git_from_tar.sh -d ./git/libo

Por favor ejecuta ./libo_git_from_tar.sh --help para más información sobre como usarlo

Rendimiento

Construir LibreOffice toma tiempo, mucho tiempo. Exactamente mucho depende de como de rápida sea tu máquina. Pero hay herramientas que puedes usar para acelerar las cosas.

ccache

ccache es una herramienta que cachea los resultados de la compilación en c/c++ para intentar re-usarlos mas tarde. No acelerara tu construcción inicial (al contrario, la retrasara un poco), pero acelerará dramáticamente las reconstrucciones posteriores. Si planeas hacer algo de hacking en LibreOffice, te ayudara un montón,así que es una buena herramienta para tener.

Por defecto, ccache se habilitará automáticamente si se encuentra en tu sistema. Para mejores resultados, puedes querer incrementar el tamaño de la cache o habilitar la compresión de la cache; `man ccache` es tu amigo.

distcc / Icecream

Si estas en un entorno donde tienes acceso a múltiples maquinas con ciclos de cpu sobrantes, puedes echarle un ojo a distcc o icecream, que son herramientas para construcción distribuida.

El soporte para Icecream esta dentro de LibreOffice, es suficiente añadir --enable-icecream a ./autogen.sh, y el proceso de configuración preseleccionará el numero de trabajos a usar, e intentará encontrar los icecream gcc wrappers en /opt/icecream/bin. Podrías tenerlos en algún otro lugar, por favor usa --with-gcc-home=/path/to/your/icecream/bin para sobrescribir eso.

--with-max-jobs / --with-num-cpus

El proceso de construcción puede realizarse ejecutando múltiples tareas en paralelo. El paralelismo total se controla desde el parámetro de autogen --with-max-jobs y el paralelismo de cada maquina en subtareas se controla con --with-num-cpus. Si tienes suficiente memoria, descubrirás que usando --with-max-jobs=n --with-num-cpus=n donde n es tu número de nucleos, o 2 para --with-max-jobs si solo tienes 1 núcleo, reduce significativamente el tiempo de construcción.

--with-max-jobs por defecto a 1, y --with-num-cpus pro defecto para el numero de núcleos/cpus en tu sistema. Nota que su efecto en red es multiplicativo, ahí podemos acelerar su producto con procesos de trabajo (compilador) de manera simultanea.

Tiempo Aproximado

Con un Athlon 435 X3 con ccache sin java sin epm toma alrededor de 1.5 horas para el make inicial con gentoo.

Autogen

Ahora necesitamos configurar tu construcción. Esto lo hacemos mediante el script llamado 'autogen.sh'. Hay muchas opciones que se le pueden dar a este script, para obtener una lista de ellas ejecuta

$ ./autogen.sh --help
'configure' configures LibreOffice 3.3 to adapt to many kinds of systems.

Usage: ./configure [OPTION]... [VAR=VALUE]...

To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE.  See below for descriptions of some of the useful variables.

Defaults for the options are specified in brackets.

Configuration:
  -h, --help              display this help and exit
      --help=short        display options specific to this package
      --help=recursive    display the short help of all the included packages
[....]

Las opciones pueden variar, dependiendo de tu plataforma y distribución. Lo que vemos aquí es el autogen que usamos en Linux

$ ./autogen.sh --with-num-cpus=6 --with-max-jobs=6 --without-junit


y para MacOS

$ ./autogen.sh --with-max-jobs=8 --with-num-cpus=8

Para mas datos consulta esta pagina para descripciones mas detalladas de las opciones de configuración de construcción.

Parametros de autogen.sh para solucionar problemas comunes

--disable-epm Esto solucionara "rpm not found", como autogen espera encontrar dpkg o rpm en el sistema.

--without-java Esto solucionara "ant not found"


Nota: Instalando el paquete'libgnomevfs2-dev' en ubuntu manualmente solucionaremos el aviso "No package 'gnome-vfs-2.0' found". Usa el gestor de paquetes synaptic o instalalo en una terminal

$ sudo apt-get install libgnomevfs2-dev

Fetch

Solo la primera vez, ejecuta

$ make fetch

esto descargara los otros repositorios git y los paquetes tar.gz necesarios. Nota que make realizará este paso de cualquier forma si tu no lo haces manualmente, pero haciendo un make fetch la primera vez te permitirá monitorizar la actividad de descarga.

Construyendo

Primera Construcción

La primera vez que invocamos make, descargará todos los demás repositorios git que necesite (si hay) y otros paquetes externos que deben ser descargados.

Construir el producto puede tomar 8/numero_de_núcleos horas en un procesador decente, y mucho más en Windows..

$ make 2>&1 | tee build.log

Nota que en el comando superior, un simple 'make' debería de ser suficiente. El resto del comando es para guardar la salida de make en un archivo (build.log), asi que tu puedas retroceder más tarde para investigar si fuera necesario.

( Con un clon de git fresco, descargar y correr make puede tomar mucho tiempo. Para evitar la muerte accidental del proceso, puedes hace un nohup make como sigue)

$ nohup make & 
nohup: ignoring input and appending output to `nohup.out
$ tail -f nohup.out

Iniciando lo que has contruido

Para ejecutar LibreOffice solo tienes que construilo, haz

$ make dev-install

y la salida mostrará el inicio del programa. Tipicamente esto es ../libo/install/program/soffice, lo cual viene desde el Makefile

Reconstruir

Si modificas los fuentes, o actualizas tus repositorios git con la ultima versión, puedes reconstruir simplemente ejecutando:

$ make

Algunas veces, quizas porque alguna cabecera ha sido eliminada o renombrada, es necesario hacer una reconstrucción completa.

$ make clean && make

Construccion Parcial

Por supuesto, dado el tiempo que toma, una reconstrucción completa no es el primer recurso. Cuando algo va mal en un módulo específico, puedes implemente reconstruir ese modulo.

Primero necesitas usar 'source' en el entorno de construcción. Necesitas hacerlo solo una vez en una sesión.

$ source build_env      # para code line >= 3.5
$ source *Env.Set.sh    # para code before 3.5


entonces vamos al derectorio de modulo que nos ofende, por ejemplo

$ cd sw

Desde ahí puedes construir el modulo de nuevo, usando el comando 'build', o reconstruir en modulo entero con

$ rm -r $INPATH ; deliver -delete
$ build

Nota: los valores de peralelismo seleccionados en autogen no se conservarán automáticamente cuando ejecutes 'build' manualmente. Para decirle a build que use más de una CPU, usa 'build -- -P<n>' donde <n> es el grado de paralelismo que quieres. Si estas añadiendo nuevas características a una biblioteca existente, tendrás que usar deliver para hacer tus cambios vidibres a otros modulos. Será basicamente copiar el contenido de <module>/unxlngi6.pro a solver/330/unxlngi6.pro donde todos los módulos buscan las cabeceras.

Para modulos que usan el nuevo sistema de construcción gmake, usando el comando 'make -sr', o reconstruyendo el modulo entero con

$ make -sr clean
$ make -sr

en lugar el viejo alias build. Por favor nota que deliver no es necesario con el nuebo sistema de construcción que saca los objetos directamente a solver/330/unxlngi6.pro.

Depuración de la Construcción Parcial

Podrías necesitar realizar una construcción de depuración de un modulo, para ver mas sobre mensajes de depuración durante la ejecuación de LibreOffice, puedes añadir debug=build como parametro de construción, así:

$ rm -r $INPATH
$ build debug=true

La sintaxis es similar para el nuevo sistema construido:

$ make -sr clean
$ make -sr debug=true

Modo Verboso

Si quieres tener una salida verbosa durante la construcción:

$ build verbose=t

con gmake:

$ make -r

Consiguiendo la salida de depuración

Si quieres capturar la salida de las llamadas OSL_TRACE() y otros mensajes de depuración:


$ build debug=t dbglevel=2

con gmake:

$ make -sr dbglevel=2

Consiguiendo símbolos de depuración

Si quieres habilitar símbolos para sintonización, depuración con gdb, etc...pero no quieres volver a las salidas de depuración o cambiar las optimizaciónes de compilador, ejecuta:

$ build -- ENVCFLAGS+=-g

con gmake:

$ make -sr ENABLE_SYMBOLS=true

Mira otros comandos útiles que puedes usar (solo para GNU make)

Para ver otras opciones durante la construcción parcial de un módulo, ejecuta:

$ make help

Nota que esto es diferente de ejecutar make -h, que da una lista de comandos para GNU make mismo.

La Construcción Falló... ¿Que puedo hacer ?

Usando una rama de desarrollo temprana, como estas haciendo, lo normal es que no falle, y si falla cortarlo. Estas cosas no dan poco trabajo como esperabas.

Aqui hay un ejemplo de contrucción fallida. Mis mensajes de construcción finalizaron con:

Making:    libslideshowtestlx.so
slideshow deliver
Module 'slideshow' delivered successfully. 2 files copied, 2 files unchanged

-----------------------------------------------------------------------
        Oh dear - something failed during the build - sorry !
  For more help with debugging build errors, please see the section in:
            [[Development]]

  internal build errors:

ERROR: error 65280 occurred while making /lo/libo/connectivity/source/cpool

 it seems that the error is inside 'connectivity', please re-run build
 inside this module to isolate the error and/or test your fix:
-----------------------------------------------------------------------
[...]
make: *** [all] Error 1

Primeras cosas: no postees eso en las listas de correo. La única información util en todo eso es que el modulo 'conectivity' no se pudo construir por alguna razón desconocida.

Para conseguir una salida mas útil, rastrea que ha pasado, o al menos obtén suficiente información para que alguien más pueda ayudarte, necesitas hacer 'Source' en el archivo *Env.Set.sh (si no lo hiciste ya en la sesión actual).

$ source Env.Host.sh

Entonces querrás ir al directorio nombrado después de que el modulo fallara, aquí 'connectivity'

$ cd connectivity

Y desde ahí puedes reiniciar la construcción de este modulo en particular usando el comando 'build'.

Aquí hay una salida (parcial) del comando 'build':

$ build
build -- version: 275224

=============
Building module connectivity
=============
Entering /lo/libo/connectivity/inc
[...]
Entering /lo/libo/connectivity/source/cpool

Compiling: connectivity/source/cpool/ZConnectionPool.cxx
/lo/libo/clone/libs-core/connectivity/source/cpool/ZConnectionPool.cxx: In constructor 'connectivity::OConnectionPool::OConnectionPool(const com::sun::star::uno::Reference<com::sun::star::sdbc::XDriver>&, const com::sun::star::uno::Reference<com::sun::star::uno::XInterface>&, const com::sun::star::uno::Reference<com::sun::star::reflection::XProxyFactory>&)':
/lo/libo/clone/libs-core/connectivity/source/cpool/ZConnectionPool.cxx:98: error: 'TimeValue' is not a member of 'salhelper'
dmake:  Error code 1, while making '../../unxlngx6.pro/slo/ZConnectionPool.obj'

[... supressed nice messages explaining you succinctly what to do ...]

Ahora, esto esta mejor. Vi el archivo indicado y me di cuenta que accidentalmente (o a propósito para tu entretenimiento) eliminando una T delante de TimeValue, que se leía TTimeVaue... Solucione rápidamente el problema y ejecute el comando 'build' otra vez para asegurarme. Entonces pude volver a ejecutar el comando make de nuevo.

Si no puedes imaginarte que paso, puedes probar a forzar una reconstrucción del modulo.

Trucos de Construcción

Construyendo en Windows con Cygwin y Visual Studio Express

Construyendo en Windows con Cygwin es un poco especial y no toda la información que damos aquí se aplica. Para Noticias de construcciones coleccionadas aqui.

Si tienes misteriosas pausas de construcción o tu sistema se cuelga totalmente, deberías considerar, que estas ejecutando una aplicación que interfiere con Cygwin, para mas detalles mira [1]

Deshabilitar mozilla

Si tienes problemas de construcción relacionados con mozilla, considera des-habilitarlo todo usando la opción de configuración --disable-mozilla. El código de Mozilla se usa para características tales como preferencias de seguridad de macros y firmas digitales. Así, si no necesitas esas características en tu construcción de desarrollo, es seguro deshabilitar mozilla.

Instalador multi-idioma para Windows

Para construir un instalador multi-idioma en Windows, primero completa la construcción hasta el final, entonces haz

 cd instsetoo_native/util
 dmake openoffice_<locale>,<locale>,....   (lista de idiomas separada por comas)

donde especificas las locales que quieres incluir en el instalador. No olvides construir con --with-lang="<locale> <locale> ... " para haces estas locales estén disponibles durante la construcción.

Multiples Directorios de Trabajo

Si quieres trabajas en ambas ramas, la maestra y la versión actual al mismo tiempo, puedes compartir los repositorios git,y tarballs de fuentes externas (nota que el ahorro puede ser significativo, especialmente si también usas bastante el repositorio l10n). Nota que cambiar entre ramas con el mismo directorio de trabajo no se recomienda - las dependencias de construcción de LibreOffice serán incompletas y frágiles, y lo mas probable es que tengas que hacer limpiezas y recompilaciones cada vez que cambies de rama. Si tienes suficiente espacio disponible, recomendamos que mantengas arboles de directorios separados.

Instalación

Preparar la primera construcción en tu disco como se explica abajo. Por un segundo, y todas las demás construcciones, hacen esto para clonar el repositorio core inicial:

$ /other/libo/bin/git-new-workdir /other/libo /dir/to/be/created my-libo-branch

Notaras que la operación de clonado es mucho mas rápida. Después de esto, la instalación del nuevo directorio de trabajo tiene dos opciones extras de configuración(o autogen.sh):

$ ./autogen.sh ... --with-linked-git=/other/libo/clone --with-external-tar=/other/libo/src
$ ./g checkout my-libo-branch

De nuevo, el clonado será mucho mas rápido. Tendrás que usar una ruta absoluta para la opción --with-external-tar . Después de eso, irás constuyendo justo como sería para el caso de un solo directorio de trabajo.