Linux From Scratch XVI: Instalamos gcc, sed, bzip2 y pkg-config

Después de dejar instalados los paquetes que gcc necesita en mi anterior artículo, ha llegado el momento de instalarlo. Hasta ahora estabamos usando el compilador del sistema temporal. Esta ya es la instalación definitiva, así que a partir de ahora empezaremos a usar el compilador que estamos instalando aquí.

Nada más ver las instrucciones del libro, lo primero que descubrimos es que esta compilación tarda nada menos que 53.5 SBU. En mi equipo eso es más de una hora. 🙂 Habrá que tener paciencia. Lo primero es preparar el paquete y hacer algunos ajustes.

[~/lfs]$ sudo lfs gcc-4.7.1
root:/# cd sources/
root:/sources# tar xvf gcc-4.7.1.tar.bz2
root:/sources# cd gcc-4.7.1
root:/sources/gcc-4.7.1# sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in
root:/sources/gcc-4.7.1# case `uname -m` in
>   i?86) sed -i 's/^T_CFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in ;;
> esac
root:/sources/gcc-4.7.1# sed -i -e /autogen/d -e /check.sh/d fixincludes/Makefile.in

Los primeros comandos ya los conocemos. El primer sed es para usar la versión de libiberty que viene con binutils. Es la que hemos instalado en el artículo anterior. El case es para usar -fomit-frame-pointer igual que habíamos hecho en el sistema temporal. El segundo sed corrige un error en uno de los tests. Ahora ya podemos crear un directorio para hacer la compilación, configurar el código fuente y compilar.

root:/sources/gcc-4.7.1# mkdir -v ../gcc-build
root:/sources/gcc-4.7.1# cd ../gcc-build
root:/sources/gcc-build# ../gcc-4.7.1/configure --prefix=/usr            \
>                        --libexecdir=/usr/lib    \
>                        --enable-shared          \
>                        --enable-threads=posix   \
>                        --enable-__cxa_atexit    \
>                        --enable-clocale=gnu     \
>                        --enable-languages=c,c++ \
>                        --disable-multilib       \
>                        --disable-bootstrap      \
>                        --with-system-zlib
root:/sources/gcc-build# make

Es interesante la opción –with-system-zlib para que use la zlib instalada en vez de la suya propia. Aparte de eso, ha compilado todo sin problemas y sólo ha tardado 5 minutos, o sea que lo gordo deben de ser los tests.

Los tests del gcc son críticos y no hay que evitarlos bajo ninguna circunstancia. Así que vamos a pasarlos. El comando ulimit que ponemos es para aumentar el tamaño de la pila de llamadas. Uno de los tests agota la pila si no se hace así.

root:/sources/gcc-build# ulimit -s 32768
root:/sources/gcc-build# make -k check
root:/sources/gcc-build# ../gcc-4.7.1/contrib/test_summary

Efectivamente, los tests han tardado una hora en pasar. 🙂 Sólo me ha fallado libmudflap pero, según el libro, es normal que este test falle, así que me doy por satisfecho. Ahora hay que instalar los ficheros.

root:/sources/gcc-build# make install

Me he quedado sin espacio al instalar. 🙂 La razón es que el script que estoy utilizando monta el directorio que guarda los cambios en un ramdisk (con el sistema de ficheros tmpfs). Esto lo he hecho en parte porque he pensado que así tardaría menos en compilar y en parte porque estoy usando un SSD y así evito machacarlo mucho. Se ve que el gcc es demasiado grande para el ramdisk a pesar de que tengo 4 Gb de RAM.

Lo que he hecho es salir del chroot, borrar el paquete que ha creado, que no sirve para nada y repetir todo el proceso desde el principio sin pasar los tests. Esto me ha funcionado, o sea que el problema era que los tests generaban muchos ficheros temporales que llenaban la memoria.

No pasar los tests en este momento no es un problema, porque ya los había pasado antes y, al haber repetido todos los comandos exactamente igual, lo lógico es que haya quedado todo igual de bien compilado. O sea que lo doy por bueno.

Si esta solución no os funciona, otra forma de evitar el problema podría ser no usar el ramdisk. Para esto habría que modificar ligeramente el script para eliminar las lineas que lo montan y lo desmontan. Si alguien está interesado en esta idea, que me lo comente y le puedo dar más detalles. A lo mejor incluso puedo publicar una versión mejorada del script.

Otra posible solución es aumentar el tamaño del ramdisk, pero no me parece recomendable. No me gusta arriesgarme a quedarme sin memoria del todo. Además, si nos pasamos en el tamaño, la máquina puede colgarse, porque sería incapaz de liberar la memoria.

Una vez solucionado nuestro pequeño problema, creamos un par de enlaces. El primero es para los programas que buscan el preprocesador en /lib. El segundo es para los que llaman al compilador a través del comando cc en vez de gcc. Esa es la forma portable de hacerlo, así que también tiene que funcionar.

root:/sources/gcc-build# ln -sv ../usr/bin/cpp /lib
root:/sources/gcc-build# ln -sv gcc /usr/bin/cc

Ahora comprobamos que el compilador funciona correctamente. Para ello, compilamos un programa trivial de prueba y analizamos el resultado. Se trata, básicamente, de las mismas pruebas que hemos hecho después de ajustar el toolchain. Comprobamos que el cargador y el runtime sean correctos y que esté buscando los headers en las rutas correctas.

root:/sources/gcc-build# echo 'main(){}' > dummy.c
root:/sources/gcc-build# cc dummy.c -v -Wl,--verbose &> dummy.log
root:/sources/gcc-build# readelf -l a.out | grep ': /lib'
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
root:/sources/gcc-build# grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.1/../../../../lib64/crt1.o succeeded
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.1/../../../../lib64/crti.o succeeded
/usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.1/../../../../lib64/crtn.o succeeded
root:/sources/gcc-build# grep -B4 '^ /usr/include' dummy.log
#include <...> search starts here:
 /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.1/include
 /usr/local/include
 /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.1/include-fixed
 /usr/include

El orden de los dos primeros directorios está cambiado. No sé por qué es esto, pero no me va a dar problemas mientras no instale programas en /usr/local. Esto no va a ocurrir en toda la instalación de Linux From Scratch, así que lo podemos dejar así. Ademas, he comprobado que en mi ArchLinux están en este mismo orden, o sea que debe de ser normal.

root:/sources/gcc-build# grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
SEARCH_DIR("/usr/x86_64-unknown-linux-gnu/lib64")
SEARCH_DIR("/usr/local/lib64")
SEARCH_DIR("/lib64")
SEARCH_DIR("/usr/lib64")
SEARCH_DIR("/usr/x86_64-unknown-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");
root:/sources/gcc-build# grep "/lib.*/libc.so.6 " dummy.log
attempt to open /lib64/libc.so.6 succeeded
oot:/sources/gcc-build# grep found dummy.log
found ld-linux-x86-64.so.2 at /lib64/ld-linux-x86-64.so.2
root:/sources/gcc-build# rm -v dummy.c a.out dummy.log
root:/sources/gcc-build# mkdir -pv /usr/share/gdb/auto-load/usr/lib
root:/sources/gcc-build# mv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib

Con estos comandos hemos comprobado que sean correctas las rutas de búsqueda del linkador y que haya encontrado correctamente la glibc y el cargador. Si en todas estas comprobaciones hubiera aparecido alguna ruta apuntando a /tools, significaría que hemos hecho algo mal.

Los últimos comandos son para borrar los ficheros intermedios y mover dos ficheros que no se instalan en su lugar correcto. Ahora salimos del chroot e instalamos el paquete.

root:/sources/gcc-build# exit
[~/lfs]$ sudo lfsinst gcc-4.7.1.txz

Tarda un rato tanto en generar el paquete como en instalar. Este paquete es el más grande que hemos generado hasta ahora.

Instalando sed

Comparado con gcc, instalar sed es facilito. Los primeros comandos son los de siempre.

[~/lfs]$ sudo lfs sed-4.2.1
root:/# cd sources/
root:/sources# tar xvf sed-4.2.1.tar.bz2
root:/sources# cd sed-4.2.1

Ahora que ya estamos en el directorio del código fuente, aplicamos un parche que corrige unos tests, configuramos e instalamos. La documentación en html, se genera aparte.

root:/sources/sed-4.2.1# patch -Np1 -i ../sed-4.2.1-testsuite_fixes-1.patch
root:/sources/sed-4.2.1# ./configure --prefix=/usr --bindir=/bin --htmldir=/usr/share/doc/sed-4.2.1
root:/sources/sed-4.2.1# make
root:/sources/sed-4.2.1# make html
root:/sources/sed-4.2.1# make check

Todos los tests han pasado sin problemas. Ahora instalamos los ficheros incluida la documentación, salimos del chroot e instalamos el paquete.

root:/sources/sed-4.2.1# make install
root:/sources/sed-4.2.1# make -C doc install-html
root:/sources/sed-4.2.1# exit
[~/lfs]$ sudo lfsinst sed-4.2.1.txz

Instalando bzip2

Instalar bzip2 tampoco es muy complicado. Requiere algunos ajustes, pero es bastante fácil. Como siempre, los primeros comandos son para que el script entre en el chroot y quede preparado para crear el paquete, y para descomprimir el código fuente. Luego se aplican una serie de correcciones.

[~/lfs]$ sudo lfs bzip2-1.0.6
root:/# cd sources/
root:/sources# tar xvf bzip2-1.0.6.tar.gz
root:/sources# cd bzip2-1.0.6
root:/sources/bzip2-1.0.6# patch -Np1 -i ../bzip2-1.0.6-install_docs-1.patch
root:/sources/bzip2-1.0.6# sed -i 's@\(ln -s -f \)$(PREFIX)/bin/@\1@' Makefile
root:/sources/bzip2-1.0.6# sed -i "s@(PREFIX)/man@(PREFIX)/share/man@g" Makefile

El comando patch se usa para aplicar un parche que instala la documentación. El primer sed es para que los enlaces simbólicos sean relativos y el segundo instala las páginas del manual en el lugar correcto.

Este paquete tienes sus peculiaridades. Una de ellas es que no usa configure. En lugar de ello se hace así:

root:/sources/bzip2-1.0.6# make -f Makefile-libbz2_so
root:/sources/bzip2-1.0.6# make clean
root:/sources/bzip2-1.0.6# make
root:/sources/bzip2-1.0.6# make PREFIX=/usr install

Como habréis visto, tampoco tiene tests. Ahora sólo falta copiar el binario en el lugar adecuado y crear algunos enlaces en /bin.

root:/sources/bzip2-1.0.6# cp -v bzip2-shared /bin/bzip2
root:/sources/bzip2-1.0.6# cp -av libbz2.so* /lib
root:/sources/bzip2-1.0.6# ln -sv ../../lib/libbz2.so.1.0 /usr/lib/libbz2.so
root:/sources/bzip2-1.0.6# rm -v /usr/bin/{bunzip2,bzcat,bzip2}
root:/sources/bzip2-1.0.6# ln -sv bzip2 /bin/bunzip2
root:/sources/bzip2-1.0.6# ln -sv bzip2 /bin/bzcat

Listo. Ya podemos salir del chroot e instalar el paquete.

root:/sources/bzip2-1.0.6# exit
[~/lfs]$ sudo lfsinst bzip2-1.0.6.txz

Instalando pkg-config

Este paquete es trivial. Las instrucciones son similares a las de cualquier programa normal y corriente. Incluso los tests no dan ningún problema. Voy a limitarme a poner los comandos, ya que no hay nada destacable.

[~/lfs]$ sudo lfs pkg-config-0.27
root:/# cd sources/
root:/sources# tar xvf pkg-config-0.27.tar.gz
root:/sources# cd pkg-config-0.27
root:/sources/pkg-config-0.27# ./configure --prefix=/usr         \
>             --with-internal-glib  \
>             --docdir=/usr/share/doc/pkg-config-0.27
root:/sources/pkg-config-0.27# make
root:/sources/pkg-config-0.27# make check
root:/sources/pkg-config-0.27# make install
root:/sources/pkg-config-0.27# exit
[~/lfs]$ sudo lfsinst pkg-config-0.27.txz

Con esto hemos avanzado unos cuantos paquetes más. Todavía quedan muchos por delante. En el próximo post continuamos con ncurses.

EOF

Anuncios

7 pensamientos en “Linux From Scratch XVI: Instalamos gcc, sed, bzip2 y pkg-config

    1. hexborg Autor de la entrada

      El kernel que estoy usando ahora mismo es el 3.7.4. Es el de ArchLinux, porque el de LFS todavía no está instalado y va para largo. El gcc de LFS es el 4.7.1 y el de ArchLinux es el 4.7.2, pero ahora mismo ya estoy compilando con el de LFS.

  1. Damian Rivera

    :O 1 hora en tu pc,en la mia deben ser como 7 horas :(,gcc no lo he querido ni compilar en gentoo,tengo aun el 4.5.4 ,voy a ver si lo logro, o si no tendre que esperar a tener mejor hardware 😦

    Saludos

Los comentarios están cerrados.