Linux From Scratch VII: bash. El siguiente paso

En mi artículo anterior he dejado compilados varios paquetes más del sistema temporal de Linux From Scratch. En éste voy a seguir compilando. Lo más dificil era binutils y el gcc. Los demás paquetes son más fáciles. Algunos de ellos tienen alguna peculiaridad, pero la mayoría se compilan siempre con los mismos comandos sin problemas. El siguiente paquete que toca compilar es el maravilloso bash.

Compilando bash

Compilar bash en un Linux From Scratch no es dificil. Para empezar hay que descomprimir el código fuente y aplicar un parche.

[lfs@corellia sources]$ tar xvzf bash-4.2.tar.gz 

...

bash-4.2/y.tab.c
bash-4.2/y.tab.h
bash-4.2/parser-built
bash-4.2/pathnames.h.in
bash-4.2/MANIFEST.doc
[lfs@corellia sources]$ cd bash-4.2       
[lfs@corellia bash-4.2]$ patch -Np1 -i ../bash-4.2-fixes-8.patch

...

patching file support/shobj-conf
patching file tests/shopt.right
patching file variables.c
patching file variables.h
[lfs@corellia bash-4.2]$

Una vez hecho esto, ya podemos compilar. Se le indica a configure el parámetro --without-bash-malloc para que utilice la función malloc de glibc en vez de la que está implementada internamente en bash, que a veces da errores.

[lfs@corellia bash-4.2]$ ./configure --prefix=/tools --without-bash-malloc

...

config.status: executing default-1 commands
config.status: creating po/POTFILES
config.status: creating po/Makefile
config.status: executing default commands
[lfs@corellia bash-4.2]$ make

...
ltilde     -ldl 
ls -l bash
-rwxr-xr-x 1 lfs lfs 3642842 Dec 27 16:57 bash
size bash
   text       data        bss        dec        hex    filename
 885529      36000      23080     944609      e69e1    bash
[lfs@corellia bash-4.2]$ make install
  for file in Makevars; do \
    rm -f /tools/share/gettext/po/$file; \
  done; \
else \
  : ; \
fi
make[1]: Leaving directory `/mnt/lfs/sources/bash-4.2/po'
[lfs@corellia bash-4.2]$ ln -vs bash /tools/bin/sh
'/tools/bin/sh' -> 'bash'
[lfs@corellia bash-4.2]$

La última linea sirve para crear un enlace a bash llamado sh de manera que bash quede configurado como shell por defecto a la hora de ejecutar scripts. Esta es una práctica común cuando hay varias alternativas para un mismo programa. El proceso ha tardado 40 segundos. Algo más de los 32 segundos que sería de esperar dado mi SBU. De todos modos, la diferencia es demasiado pequeña como para que sea significativa.

Por último, para terminar con bash, borramos el directorio de código fuente. No ha sido muy dificil.

[lfs@corellia bash-4.2]$ cd ..
[lfs@corellia sources]$ rm -rf bash-4.2
[lfs@corellia sources]$

Compilando bzip2

El siguiente paquete que vamos a compilar es bzip2. Este paquete es un poco peculiar porque no tiene configuración. Después de descomprimirlo, basta con compilarlo con make y, al instalar, se indica el directorio de instalación con una variable de make.

[lfs@corellia sources]$ tar xvzf bzip2-1.0.6.tar.gz 

...

bzip2-1.0.6/entities.xml
bzip2-1.0.6/manual.xml
bzip2-1.0.6/format.pl
bzip2-1.0.6/xmlproc.sh
[lfs@corellia sources]$ cd bzip2-1.0.6
[lfs@corellia bzip2-1.0.6]$ make

...

It is available in Postscript form (manual.ps), PDF form (manual.pdf),
and HTML form (manual.html).

You can also do "bzip2 --help" to see some helpful information. 
"bzip2 -L" displays the software license.
[lfs@corellia bzip2-1.0.6]$ make PREFIX=/tools install

...

echo ".so man1/bzgrep.1" > /tools/man/man1/bzegrep.1
echo ".so man1/bzgrep.1" > /tools/man/man1/bzfgrep.1
echo ".so man1/bzmore.1" > /tools/man/man1/bzless.1
echo ".so man1/bzdiff.1" > /tools/man/man1/bzcmp.1
[lfs@corellia bzip2-1.0.6]$ cd ..
[lfs@corellia sources]$ rm -rf bzip2-1.0.6
[lfs@corellia sources]$

En este caso no me he molestado en comprobar cuánto tarda. Según el libro, bzip2 tarda en compilar 0.1 SBU. Viendo los tiempos que me está dando, creo que puedo ignorar todo lo que sea menor que 1 SBU.

Compilando coreutils

Continuamos con coreutils. La compilación de coreutils es muy sencilla y el único punto a destacar es el parámetro que se le pasa a configure para que instale el comando hostname, ya que por defecto no lo hace.

[lfs@corellia sources]$ tar xvJf coreutils-8.19.tar.xz 

...

coreutils-8.19/old/sh-utils/
coreutils-8.19/old/sh-utils/NEWS
coreutils-8.19/old/sh-utils/ChangeLog.0
coreutils-8.19/old/sh-utils/ChangeLog
[lfs@corellia sources]$ cd coreutils-8.19
[lfs@corellia coreutils-8.19]$ ./configure --prefix=/tools --enable-install-program=hostname

...

config.status: executing depfiles commands
config.status: executing po-directories commands
config.status: creating po/POTFILES
config.status: creating po/Makefile
[lfs@corellia coreutils-8.19]$ make

...

make[2]: Entering directory `/mnt/lfs/sources/coreutils-8.19'
make[2]: Nothing to be done for `all-am'.
make[2]: Leaving directory `/mnt/lfs/sources/coreutils-8.19'
make[1]: Leaving directory `/mnt/lfs/sources/coreutils-8.19'
[lfs@corellia coreutils-8.19]$ make install

...

make[3]: Nothing to be done for `install-data-am'.
make[3]: Leaving directory `/mnt/lfs/sources/coreutils-8.19'
make[2]: Leaving directory `/mnt/lfs/sources/coreutils-8.19'
make[1]: Leaving directory `/mnt/lfs/sources/coreutils-8.19'
[lfs@corellia coreutils-8.19]$ cd ..
[lfs@corellia sources]$ rm -rf coreutils-8.19
[lfs@corellia sources]$

Compilando diffutils

El paquete diffutils tiene un poco más de chicha. Primero descomprimimos, como siempre.

[lfs@corellia sources]$ tar xvzf diffutils-3.2.tar.gz 
diffutils-3.2/man/sdiff.1
diffutils-3.2/man/cmp.1
diffutils-3.2/man/diff.1
diffutils-3.2/man/help2man
[lfs@corellia sources]$ cd diffutils-3.2
[lfs@corellia diffutils-3.2]$

Ahora viene el truco. Se trata de eliminar una linea en el fichero stdio.in.h para solucionar un problema de compatibilidad con glibc. El comando sed permite hacer esto desde la linea de comandos.

[lfs@corellia diffutils-3.2]$ sed -i -e '/gets is a/d' lib/stdio.in.h
[lfs@corellia diffutils-3.2]$

El resto del proceso ya es mucho más normal y se limita a repetir los pasos típicos de configurar, compilar e instalar.

[lfs@corellia diffutils-3.2]$ ./configure --prefix=/tools

...

config.status: executing depfiles commands
config.status: executing po-directories commands
config.status: creating po/POTFILES
config.status: creating po/Makefile
[lfs@corellia diffutils-3.2]$ make

...

make[1]: Leaving directory `/mnt/lfs/sources/diffutils-3.2/gnulib-tests'
make[1]: Entering directory `/mnt/lfs/sources/diffutils-3.2'
make[1]: Nothing to be done for `all-am'.
make[1]: Leaving directory `/mnt/lfs/sources/diffutils-3.2'
[lfs@corellia diffutils-3.2]$ make install

...

make[2]: Nothing to be done for `install-exec-am'.
make[2]: Nothing to be done for `install-data-am'.
make[2]: Leaving directory `/mnt/lfs/sources/diffutils-3.2'
make[1]: Leaving directory `/mnt/lfs/sources/diffutils-3.2'
[lfs@corellia diffutils-3.2]$ cd ..
[lfs@corellia sources]$ rm -rf diffutils-3.2
[lfs@corellia sources]$

Compilando file, findutils y gawk

Estos tres paquetes no tienen ninguna peculiaridad. Los tres se compilan con los típicos comandos de siempre y no tardan nada, así que voy a poner todos juntos los comandos para compilarlos. No merece la pena explicarlos por separado.

[lfs@corellia sources]$ tar xvzf file-5.11.tar.gz 

...

file-5.11/python/Makefile.in
file-5.11/python/example.py
file-5.11/python/magic.py
file-5.11/python/setup.py
[lfs@corellia file-5.11]$ ./configure --prefix=/tools

...

config.status: creating python/Makefile
config.status: creating config.h
config.status: executing depfiles commands
config.status: executing libtool commands
[lfs@corellia file-5.11]$ make

...

make[2]: Leaving directory `/mnt/lfs/sources/file-5.11/python'
make[2]: Entering directory `/mnt/lfs/sources/file-5.11'
make[2]: Leaving directory `/mnt/lfs/sources/file-5.11'
make[1]: Leaving directory `/mnt/lfs/sources/file-5.11'
[lfs@corellia file-5.11]$ make install

...

make[2]: Nothing to be done for `install-exec-am'.
make[2]: Nothing to be done for `install-data-am'.
make[2]: Leaving directory `/mnt/lfs/sources/file-5.11'
make[1]: Leaving directory `/mnt/lfs/sources/file-5.11'
[lfs@corellia file-5.11]$ cd ..
[lfs@corellia sources]$ rm -rf file-5.11
[lfs@corellia sources]$ tar xvzf findutils-4.4.2.tar.gz 

...

findutils-4.4.2/po/zh_CN.gmo
findutils-4.4.2/po/zh_TW.gmo
findutils-4.4.2/po/findutils.pot
findutils-4.4.2/po/stamp-po
[lfs@corellia sources]$ cd findutils-4.4.2
[lfs@corellia findutils-4.4.2]$ ./configure --prefix=/tools

...

config.status: executing depfiles commands
config.status: executing po-directories commands
config.status: creating po/POTFILES
config.status: creating po/Makefile
[lfs@corellia findutils-4.4.2]$ make

...

make[2]: Leaving directory `/mnt/lfs/sources/findutils-4.4.2/m4'
make[2]: Entering directory `/mnt/lfs/sources/findutils-4.4.2'
make[2]: Leaving directory `/mnt/lfs/sources/findutils-4.4.2'
make[1]: Leaving directory `/mnt/lfs/sources/findutils-4.4.2'
[lfs@corellia findutils-4.4.2]$ make install

...

make[2]: Nothing to be done for `install-exec-am'.
make[2]: Nothing to be done for `install-data-am'.
make[2]: Leaving directory `/mnt/lfs/sources/findutils-4.4.2'
make[1]: Leaving directory `/mnt/lfs/sources/findutils-4.4.2'
[lfs@corellia findutils-4.4.2]$ cd ..
[lfs@corellia sources]$ rm -rf findutils-4.4.2
[lfs@corellia sources]$ tar xvJf gawk-4.0.1.tar.xz 

...

gawk-4.0.1/dfa.c
gawk-4.0.1/ChangeLog
gawk-4.0.1/ylwrap
gawk-4.0.1/bisonfix.awk
[lfs@corellia sources]$ cd gawk-4.0.1
[lfs@corellia gawk-4.0.1]$ ./configure --prefix=/tools

...

config.status: executing depfiles commands
config.status: executing po-directories commands
config.status: creating po/POTFILES
config.status: creating po/Makefile
[lfs@corellia gawk-4.0.1]$ make

...

make[2]: Entering directory `/mnt/lfs/sources/gawk-4.0.1/test'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/mnt/lfs/sources/gawk-4.0.1/test'
make[1]: Leaving directory `/mnt/lfs/sources/gawk-4.0.1'
[lfs@corellia gawk-4.0.1]$ make install

...

make[2]: Nothing to be done for `install-exec-am'.
make[2]: Nothing to be done for `install-data-am'.
make[2]: Leaving directory `/mnt/lfs/sources/gawk-4.0.1/test'
make[1]: Leaving directory `/mnt/lfs/sources/gawk-4.0.1/test'
[lfs@corellia gawk-4.0.1]$ cd ..
[lfs@corellia sources]$ rm -rf gawk-4.0.1
[lfs@corellia sources]$

He dejado de pasar los test. En este capítulo son opcionales y no aporta nada saber si pasan o no. Es normal que pueda fallar alguno, ya que la compilación que estamos haciendo es sobre un sistema incompleto. En el siguiente capítulo será más recomendable pasarlos todos, pero por ahora he preferido dejar de hacerlos.

Compilando gettext

El siguiente paquete tiene bastante más chicha. La forma de compilar gettext es completamente diferente de lo habitual. Empecemos por descomprimir el paquete.

[lfs@corellia sources]$ tar xvzf gettext-0.18.1.1.tar.gz 

...

gettext-0.18.1.1/m4/init-package-version.m4
gettext-0.18.1.1/m4/woe32-dll.m4
gettext-0.18.1.1/m4/fixautomake.m4
gettext-0.18.1.1/m4/ltsugar.m4
[lfs@corellia sources]$ cd gettext-0.18.1.1

Ahora hay que aplicar la misma corrección que en el caso de diffutils.

[lfs@corellia gettext-0.18.1.1]$ sed -i -e '/gets is a/d' gettext-*/*/stdio.in.h
[lfs@corellia gettext-0.18.1.1]$

El configure está en gettext-tools, así que hay que compilarlo desde ese directorio.

[lfs@corellia gettext-0.18.1.1]$ cd gettext-tools
[lfs@corellia gettext-tools]$ EMACS="no" ./configure --prefix=/tools --disable-shared

...

config.status: creating Makefile
config.status: creating installpaths
config.status: creating po/Makefile
config.status: executing po-directories commands

Con las opciones que hemos indicado en el configure, lo que estamos haciendo es evitar que determine dónde instalar los ficheros de Emacs Lisp y evitar que compile las librerías que no vamos a necesitar.

Ahora viene la compilación. Sólo queremos el binario msgfmt, así que hay que compilar en dos pasos. Los comandos son los siguientes:

[lfs@corellia gettext-tools]$ make -C gnulib-lib

...

libtool: link: rm -fr .libs/libgettextlib.lax
libtool: link: ( cd ".libs" && rm -f "libgettextlib.la" && ln -s "../libgettextlib.la" "libgettextlib.la" )
make[1]: Leaving directory `/mnt/lfs/sources/gettext-0.18.1.1/gettext-tools/gnulib-lib'
make: Leaving directory `/mnt/lfs/sources/gettext-0.18.1.1/gettext-tools/gnulib-lib'
[lfs@corellia gettext-tools]$ make -C src msgfmt

...

libtool: link: gcc -std=gnu99 -g -O2 -o msgfmt msgfmt-msgfmt.o msgfmt-write-mo.o msgfmt-write-java.o msgfmt-write-csharp.o msgfmt-write-resources.o msgfmt-write-tcl.o msgfmt-write-qt.o msgfmt-hash-string.o  ./.libs/libgettextsrc.a -L/tools/lib /mnt/lfs/sources/gettext-0.18.1.1/gettext-tools/gnulib-lib/.libs/libgettextlib.a -lncurses -lc
make: Leaving directory `/mnt/lfs/sources/gettext-0.18.1.1/gettext-tools/src'
[lfs@corellia gettext-tools]$

Una vez compilado, copiamos el binario a /tools/bin. Esta es la instalación.

[lfs@corellia gettext-tools]$ cp -v src/msgfmt /tools/bin
'src/msgfmt' -> '/tools/bin/msgfmt'
[lfs@corellia gettext-tools]$ cd ../..
[lfs@corellia sources]$ rm -rf gettext-0.18.1.1
[lfs@corellia sources]$

Ha sido uno de los paquetes más raros de compilar hasta ahora, pero siguiendo las instrucciones del libro es todo muy fácil. Todo esto es por la forma extraña de compilar el sistema temporal. En el siguiente capítulo la compilación será más sencilla.

Compilando grep y gzip

Estos dos paquetes tampoco tienen nada de especial y voy a poner todos los comandos seguidos. No merece la pena destacar nada.

[lfs@corellia sources]$ tar xvJf grep-2.14.tar.xz 

...

grep-2.14/m4/isatty.m4
grep-2.14/m4/libunistring-base.m4
grep-2.14/m4/fts.m4
grep-2.14/m4/wcwidth.m4
[lfs@corellia sources]$ cd grep-2.14
[lfs@corellia grep-2.14]$ ./configure --prefix=/tools

...

config.status: executing depfiles commands
config.status: executing po-directories commands
config.status: creating po/POTFILES
config.status: creating po/Makefile
[lfs@corellia grep-2.14]$ make

...

make[2]: Leaving directory `/mnt/lfs/sources/grep-2.14/gnulib-tests'
make[2]: Entering directory `/mnt/lfs/sources/grep-2.14'
make[2]: Leaving directory `/mnt/lfs/sources/grep-2.14'
make[1]: Leaving directory `/mnt/lfs/sources/grep-2.14'
[lfs@corellia grep-2.14]$ make install

...

make[2]: Nothing to be done for `install-exec-am'.
make[2]: Nothing to be done for `install-data-am'.
make[2]: Leaving directory `/mnt/lfs/sources/grep-2.14'
make[1]: Leaving directory `/mnt/lfs/sources/grep-2.14'
[lfs@corellia grep-2.14]$ cd ..
[lfs@corellia sources]$ rm -rf grep-2.14
[lfs@corellia sources]$ tar xvJf gzip-1.5.tar.xz 

...

gzip-1.5/m4/gettimeofday.m4
gzip-1.5/m4/ftello.m4
gzip-1.5/m4/utimes.m4
gzip-1.5/m4/fseeko.m4
[lfs@corellia sources]$ cd gzip-1.5
[lfs@corellia gzip-1.5]$ ./configure --prefix=/tools

...

config.status: creating lib/Makefile
config.status: creating tests/Makefile
config.status: creating lib/config.h
config.status: executing depfiles commands
[lfs@corellia gzip-1.5]$ make

...

make[2]: Entering directory `/mnt/lfs/sources/gzip-1.5/tests'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/mnt/lfs/sources/gzip-1.5/tests'
make[1]: Leaving directory `/mnt/lfs/sources/gzip-1.5'
[lfs@corellia gzip-1.5]$ make install

...

make[3]: Nothing to be done for `install-data-am'.
make[3]: Leaving directory `/mnt/lfs/sources/gzip-1.5/tests'
make[2]: Leaving directory `/mnt/lfs/sources/gzip-1.5/tests'
make[1]: Leaving directory `/mnt/lfs/sources/gzip-1.5'
[lfs@corellia gzip-1.5]$ cd ..
[lfs@corellia sources]$ rm -rf gzip-1.5
[lfs@corellia sources]$

Y con esto nos quedamos por ahora. En el siguiente capítulo toca empezar por el preprocesador M4.

EOF