uclibc-lfs

TÍTULO:		uclibc-lfs
VERSIÓN LFS:	No disponible
AUTOR:		MichaŽl Tousignant <evanidus@videotron.ca>
TRADUCTOR:	Proyecto LFS-ES

SINOPSIS:	Cómo construir un sistema base LFS basado en uClibc

RECETA:

VERSIÓN DE LA RECETA:	0.2r1 (20020718)

REGISTRO DE MODIFICACIONES (CHANGELOG):	No disponible

Antes de intentar crear un sistema uClibc, deberías preguntarte si de
verdad quieres hacerlo ya que eso significa:
    - No tener un C++ nativo (debes usar un compilador GCC C++ estático)
    - No tener groff (a menos que emplees un compilador GCC C++ basado en
      glibc estático o que compiles groff en modo estatico con glibc)
    - No tener modutils (salvo que no te importe emplear unas modutils 
      compiladas en modo estático con glibc)
    - No tener soporte (por el momento) para instalar paquetes que no 
      pertenezcan al LFS (buena suerte)
    - Ésta receta se realizó/comprobó empleando tan sólo gcc 2.95.3-2 en 
      un sistema con arquitectura x86. Si empleas gcc 3.x.x u otra
      arquitectura, podrías encontrar otros problemas (buena suerte).

Haz el favor de pasar por la página web de la uClibc (http://www.uclibc.org/)
y de consultar su documentación para enterarte de qué soporta y qué no antes
de empezar.

==========
0. Índice
==========

1. Requisitos previos
2. Preparación del sistema
3. Creando el sistema
4. Extras
5. Preguntas más frecuentes (FAQ).

=======================
1. Requisitos previos
=======================

Requisitos previos (Antes de empezar con el capítulo 6 del LFS):
    - Un sistema LFS completo hasta el capítulo 5
      (es muy recomendable mantener separados los capítulos 5 y 6 -estilo 
      /static- especialmente porque ésta receta supone que es así como lo
      estás haciendo)
    - Imagen tar (tarball) de perl-5.6.1 
    	  -> http://www.perl.org/
    - Imagen tar de ncurses-5.2  	 
    	  -> ftp://ftp.gnu.org/gnu/ncurses/
    - (opcional) imagen tar de modutils  
    	  -> ftp://ftp.kernel.org/pub/linux/utils/kernel/
    - (opcional) imagen tar de groff     
          -> ftp://ftp.gnu.org/gnu/groff/
    - (opcional) imagen tar de file      
          -> ftp://ftp.gw.com/mirrors/pub/unix/file/

Requisitos previos (Para completar el capítulo 6 del LFS)
    - Las imágenes tar y los parches de todos los paquetes del capítulo 6 del
      LFS excepto:
        1. psmisc 20.2+
        2. modutils
        3. Posiblemente 'file' (se explica más adelante)
        4. Posiblemente 'groff' (se explica más adelante)
        5. glibc

    - Imágen tar de uClibc-0.9.12       (http://www.uclibc.org/)
    - Imágen tar de psmisc-20.1         (http://psmisc.sourceforge.net/)

    - Diversos parches (luego se explica para qué sirven):
           -> ftp://evanidus.ath.cx/uclibc/uclibc-lfs-patches-0.2.tar.bz2

    - El libro LFS, a ser posible en versión 3.3+.
    	   -> http://www.linuxfromscratch.org/

    - Otros paquetes (opcionales):
        1. zlib - hace falta para versiones recientes de util-linux y muchos
	   otros paquetes lo usan si está disponible.
           -> http://www.zlib.org
        2. nasm - hace falta para las versiones recientes de lilo
           -> http://nasm.sourceforge.net
        3. man2cat - muy útil si quieres ver páginas man y no tienes groff
           -> ftp://evanidus.ath.cx/misc/man2cat/

==========================
2. Preparación del sistema
==========================

Antes de comenzar con el capítulo 6 del libro, es preciso añadir algunas
herramientas estáticas al capítulo 5:

Nota: Se supone que todas las órdenes deben ejecutarse desde el directorio que
contiene el código fuente original, recién extraído del paquete correspondiente

- perl estático (comprobado con la versión 5.6.1)
    Hace falta Perl para ejecutar un guión (script) durante la compilación de
    uClibc
    Puede instalarse ejecutando las órdenes siguientes:

    ./Configure -Dprefix=/static -Dinstallprefix=$LFS/static -Dso=none \
                -Dldflags=-static -Uinstallusrbinperl -Uusedl -Dman1dir=none \
                -d -e &&
    make &&
    make install

    Nota: No te molestes en configurar perl para dejarlo a tu gusto, pues es
          normal reinstalarlo a lo largo del capítulo 6. Bastará con la
          configuración por defecto

- el programa tic de las ncurses-5.2 versión estática
    Por razones todavía oscuras, el programa tic de las ncurses compila bien
    con uClibc pero no acaba de funcionar del todo. Ya que la mayor parte de
    la gente lo usa sólo una vez (en el 'make install' de las ncurses),
    emplearemos la versión estática de tic y la borraremos una vez usada. (Si
    no la usamos, cosas que emplean las ncurses tales como 'make menuconfig'
    no se visualizan correctamente).

    Puedes instalarlo ejecutando las órdenes siguientes:

    LDFLAGS=-static ./configure --without-cxx --without-debug \
                                --without-profile &&
    make -C ncurses &&
    make -C progs transform.h tic &&
    cp -f progs/tic $LFS/static/bin

- which
    uClibc emplea la orden 'which' durante el proceso de instalación. Aunque
    en un sistema normal se recomienda usar el auténtico which, es posible
    soslayar temporalmente su uso para instalar uClibc haciendo:

cat > $LFS/static/bin/which <<EOF;
#!/bin/sh
type -p $*
EOF
chmod +x $LFS/static/bin/which

- groff estático opcional (comprobado con la versión 1.17.2)
    Es imposible en este momento (sin un montón de trabajo) compilar o
    utilizar aplicaciones desarrolladas en C++ en un sistema basado
    únicamente en uClibc. Si deseas ser capaz de visualizar páginas man sin
    formatear, necesitarás conseguirte un groff compilado estáticamente con
    glibc/libstdc++ o compilar uno más adelante empleando un compilador GCC
    C++ estático (si lo puedes conseguir). (Todas las alternativas a groff que
    usan sólo código en C son demasiado antiguas y resultan inútiles con la
    mayor parte de las páginas man de hoy en día).

    Nota: Una alternativa (si no quieres emplear un gcc estático o un groff
          estático) sería preformatear tus páginas man o convertirlas a HTML
	  mediante las herramientas de tu sistema base (mira la sección 4 para
	  obtener ayuda sobre cómo preformatear las paginas man utilizando
	  man2cat)

    Si prefieres probar a crear un groff con librerías compartidas, pasa de
    largo de este paquete por el momento.

    Aviso: !Un groff estático completo ocupa unos 18MB y unos 11MB sin
    	   cabeceras (stripped)!

    Puedes instalr un groff estático haciendo:

    mkdir -p $LFS/usr &&
    LDFLAGS=-static ./configure --prefix=/usr --mandir=$LFS/usr/share/man &&
    make &&
    make prefix=$LFS/usr install &&
    ln -s soelim $LFS/usr/bin/zsoelim &&
    ln -s eqn $LFS/usr/bin/geqn &&
    ln -s tbl $LFS/usr/bin/gtbl

- modutils estáticas opcionales (comprobado con la versión 2.4.16)
    Por razones todavía desconocidas, las herramientas de modutils provocan
    violaciones de segmento, cuando se ejecutan ciertas operaciones, si se han
    enlazado con uClibc, lo que las hace inutilizables.

    Si los módulos son importantes para tí (siempre puedes crear un núcleo sin
    módulos), tendrás que crear unas modutils estáticas con glibc ejecutando
    las órdenes siguientes:

    ./configure --prefix=$LFS/usr --exec-prefix=$LFS \
                --mandir=$LFS/usr/share/man &&
    make LDFLAGS=-static &&
    make install

- programa 'file' estático opcional (comprobado con la versión 3.39)
    Por razones tan oscuras como las del programa tic con las ncurses, el
    programa 'file' enlazado con uClibc tendrá problemas para interpretar
    correctamente el fichero 'magico' (magic) tras la compilación, pero
    funcionará correctamente cuando se trate de identificar ficheros.

    Puedes (si quieres ser capaz de utilizar 'file'):
      a) Compilar una versión estática con glibc de 'file', utilizarla
         para interpretar el fichero "mágico", instalar el 'file' enlazado
	 con uClibc y borrar a continuación la versión estática con
	 glibc. (Más adelante daremos detalles adicionales sobre cómo
	 hacerlo).
         
      b) Compilar un 'file' estático con glibc e instalarlo de forma
         permanente en tu sistema uClibc, en lugar del normal que utiliza
	 librerías compartidas.
         
      c) No compilar ningún 'file' estático y utilizar la alternativa que
         luego citaremos para compilar un 'file' con librerías compartidas
	 (implica quitar cuatro tipos de fichero del fichero "mágico" que
	 después no se podrán detectar. Tampoco se sabe si puede haber algún
	 otro problema no detectado en los resultados relacionados con dicho
	 fichero)

   Para la solución 'a)' ejecuta:

      touch aclocal.m4 configure Makefile.in stamp-h.in &&
      ./configure --prefix=/usr --datadir=/usr/share/misc &&
      make LDFLAGS=-static file &&
      cp -f file $LFS/static/bin
       
   Para la solución 'b)' ejecuta:

      touch aclocal.m4 configure Makefile.in stamp-h.in &&
      ./configure --prefix=/usr --datadir=/usr/share/misc &&
      make LDFLAGS=-static &&
      make prefix=$LFS/usr install

=======================
3. Creando el sistema
=======================

    Empecemos con el capítulo 6 del LFS. Haz todo lo que el libro LFS indica
    hasta que llegues a la glibc. 

    En primer lugar, extrae los paquetes uclibc-lfs-patches en los mismos
    directorios de los otros paquetes, si no lo has hecho ya.

    A continuación, necesitaremos algunos enlaces simbólicos para cosas que la
    uClibc (y probablemente algún otro paquete) van a tratar de usar y que
    tienen sus ubicaciones fijadas por defecto. Puedes crearlos haciendo:

    ln -s ../static/bin/true /bin &&
    ln -s ../../static/bin/perl /usr/bin

    Puede que también necesites, si aún no lo has hecho, ejecutar:

    ln -s ../static/bin/bash /bin/sh

    Nota: si alguno de esos programas binarios se instaló en /static/usr/bin
    en lugar de en /static/bin, habrás de ajustar los enlaces
    correspondientes.

    Si no lo has hecho ya, (algunas versiones del libro lo hacen mientras se
    crea glibc y algunas lo hacen antes), ejecuta también:

    mknod -m 0666 /dev/null c 1 3

    Nota: De aquí en adelante, se supone que cada orden se ejecuta desde el
          directorio que contiene el código fuente limpio recien extraído del
	  paquete en el que estamos trabajando.

    En lugar de glibc (que no instalaremos en absoluto), instalamos 
    uClibc-0.9.12; lo que puedes lograr ejecutando las órdenes siguientes que
    se explican a continuación:

    Nota: Se recomienda encarecidamente emplear las optimizaciones por defecto
          recomendadas por la uClibc. Ni siquiera cambies -march=

    patch -Np1 < ../uclibc-lfs-patches/uclibc-0.9.12.patch &&
    ln -s extra/Configs/Config.i386 Config &&
    make DO_C99_MATH=true HAS_SHADOW=true DOLFS=true INCLUDE_RPC=true \ 
         all install

    Notas sobre /dev/pty*: uClibc puede configurarse para que emplee
          dispositivos /dev/pty* en lugar de devpts/devfs del directorio 
	  /dev/pts; pero para usarlos hace falta el programa 'pt_chown' que no
	  se incluye con uClibc.
          Si de verdad necesitas el soporte de /dev/pty*, tendrás que coger el
	  código fuente de pt_chown de la glibc, compilarlo con uClibc y
	  colocarlo en /sbin como set-uid root. - Recomiendo encarecidamente a
	  cualquiera que emplee en su lugar devpts o devfs (el libro LFS
	  explica cómo configurar devpts)

    Explicación de los comandos:
        patch -Np1 < ../uclibc-lfs-patches/uclibc-0.9.12.patch
          -> Este parche para los ficheros make y config de uClibc elimina la
	     necesidad de tener una libc 'ya disponible' (tal como glibc) y
	     hará que se instale a sí misma como la librería libc principal en
	     lugar de cualquier otra en su propio directorio (tal como 
             /usr/i386-linux-uclibc). Esto evita también la necesidad de
	     disponer de un envoltorio para gcc (wrapper).
               
        ln -s extra/Configs/Config.i386 Config
          -> Permite acceder simplemente a las configuraciones por defecto de 
	     Config.<arch>. Si estás usando un sistema no-x86 tendrás que
	     ajustarlo. (Por desgracia, esta receta sólo se ha probado en una
	     arquitectura x86)
               
        make DO_C99_MATH=true HAS_SHADOW=true DOLFS=true INCLUDE_RPC=true \ 
        all install
          -> Creará e instalará uClibc, con las distintas variables
	     correspondiendo a:
               - DO_C99_MATH=true
                 -> Proporciona un conjunto completo de características
		    matemáticas acordes a C99 para la librería matemática
		    (libm). Algunos paquetes recientes pueden necesitarlo.
		    (Por contra hace que libm sea unos ~35kB más grande en una
		    arquitectura x86)
               - HAS_SHADOW=true
                 -> Añade soporte para las contraseñas ocultas (shadow password)
		    (que es lo que emplea un LFS normal)
               - DOLFS=true
                 -> Añade soporte para ficheros grandes (2GB+), aunque puedes
		    desactivar su uso en la mayor parte de los paquetes si no
		    te hace falta. Algunos (tales como las versiones recientes
		    de e2fsprogs) simplemente se negarán a compilar sin él. O
		    sea que es mejor que lo actives.
                    Nota: El núcleo también puede necesitar el soporte para
		    ficheros grandes
               - INCLUDE_RPC=true
                 -> RPC no lo emplean muchas cosas aparte de NFS (sistema de
		    ficheros en red). Aún así, algunos paquetes tales como las
		    contraseñas ocultas tratarán de utilizar funciones
		    incluídas en él. Por lo cual lo activamos por defecto.

    A continuación, te sugiero que instales los paquetes siguientes antes de
    hacer cualquier otra cosa (más adelante encontrarás las instrucciones):

    1. man-pages
    2. fileutils
    3. sh-utils
    4. Crear dispositivos (ejecuta MAKEDEV)
    5. ncurses
    6. bash

    En realidad, no hace falta hacerlo así estrictamente, si bien te evitarás
    algunas molestias del tipo 'nombre grupo/usuario no resuelto' ('unresolved 
    group/user name'). (Las man-pages se instalan en primer lugar ya que los
    libros actuales del LFS lo instalan sin hacer que compruebe si existen
    páginas man ya instaladas (es más rápido)).
    
    Después, puedes instalar los paquetes en el mismo órden que se sigue en el
    libro LFS (que viene a ser más o menos el que se indica a
    continuación) con la excepción de gettext que debe ser el último. Algunos
    de ellos necesitarán opciones/órdenes o parches adicionales. Continúa
    leyendo para enterarte de cosas así.

    Para instalar los paquetes siguientes, sigue sin más las instrucciones del
    libro LFS en el capítulo 6 y aplica las modificaciones o adiciones
    que se indican a continuación (si hay alguna) para las distintas órdenes:

    Nota: no se indican las órdenes exactas para aumentar la compatibilidad
          con la versión del libro que estés usando y hacer más fácil de
	  mantener actualizada esta receta.

- man-pages (comprobado con la versión 1.51)
    Nota: Si no instalaste un groff estático con anterioridad o no vas a
          preformatear/convertir tus páginas man más adelante para que
	  funcionen sin groff, deberías obviar sin más la instalación de este
	  paquete. 

- fileutils (comprobado con la versión 4.1)
    añade a ./configure las opciones: --disable-nls
    
- sh-utils (comprobado con la versión 2.0)
    ejecuta antes de empezar: rm -f /bin/true
    añade a ./configure las opciones: --disable-nls
    
- MAKEDEV (comprobado con la versión 1.5)

- ncurses (comprobado con la versión 5.2)
    ejecuta antes de empezar: 
          patch -Np1 < ../uclibc-lfs-patches/ncurses-5.2-uClibc.patch
  
       -> Este parche hará que ncurses emplee nuestro tic estático que
          compilamos con anterioridad para la instalación de la base de datos
	  de terminfo.
    añade a ./configure las opciones: --without-cxx

    Nota: Si no te gusta tener un 'tic' parcialmente defectuoso enlazado
          con uClibc y prefieres quedarte con el estático, ejecuta:

          cp -f /static/bin/tic /usr/bin
    
- bash (comprobado con la versión 2.05a)
    ejecuta antes de empezar: ln -s ../static/bin/cat /bin
       -> Bash empleará /bin/cat para algunas operaciones y dado que aún no
          hemos instalado textutils, nos hará falta este enlace simbólico.
          
- zlib (comprobado con la versión 1.1.4)
    Nota: En el momento de escribir esta receta, zlib no aparecía en el libro
          LFS. Ya que se recomienda instalarlo si quieres usar un
	  paquete de las 'util-linux' reciente sin tener que modificarlo y
	  dejando que los paquetes empleen zlib (o utilicen el zlib del
	  sistema en lugar del que se incluye en ellos) lo incluimos aquí
	  (quitaremos las instrucciones si llega a formar parte del libro LFS)

    Puedes crear/instalar zlib ejecutando las órdenes siguientes:

    ./configure --prefix=/usr &&
    make libz.a &&
    cp libz.a /usr/lib &&
    chmod -x /usr/lib/libz.a &&
    ./configure --shared --prefix=/usr --libdir=/lib &&
    make clean all &&
    make install &&
    rm -f /lib/libz.so &&
    ln -sf ../../lib/libz.so.1 /usr/lib/libz.so &&
    cp zlib.3 /usr/share/man/man3

    Explicación de las órdenes:
        zlib se crea sólo bien como una versión estática o como versión
	compartida de sí misma. Puesto que a menudo se prefiera hacerlo de
	ambas maneras, lo hacemos así creándolo dos veces

        [...] --libdir=/lib
          -> Ya que algunos programas que emplean la zlib se instalarán en
	     /lib en lugar de en /usr/lib, haremos que siempre esté disponible 
	     para ellos incluso si /usr no está montado 

        make clean all
          -> podría reutilizarse el código creado mediante la primera 
	     operación de compilación, pero limpiarlo permite que zlib se cree
	     con las opciones del compilador que prefiramos para las librerías
	     compartidas en lugar de las que elegimos para la versión
	     estática.
	     
        rm -f /lib/libz.so &&
        ln -sf ../../lib/libz.so.1 /usr/bin/libz.so
          -> no hace falta libz.so en /lib, mientras se encuentre en /usr/lib,
	     pues se usa sólo como información para el enlazador (linker) para
	     ayudarle a encontrar la librería. (No hay programas que se
	     enlacen directamente con libz.so, pues emplearán
	     /lib/libz.so.1) 

- GCC (comprobado con la versión 2.95.3-2)
    en las opciones de ./configure, sustituye: --enable-languages=c,c++
                                   por: --enable-languages=c
          -> el compilador de c++ y las librerías no pueden crearse con la
	     uClibc actual y no existe forma de arreglarlo en este momento (y
	     es probable que no la haya próximamente)

- ViM (comprobado con la versión 6.1)
    Nota: No debería hacer falta emplear --disable-nls (lo detecta
          automáticamente)

- findutils (comprobado con la versión 4.1)

- gawk (comprobado con la versión 3.1.1)
    añade a ./configure las opciones: --disable-nls    

- bison (comprobado con la versión 1.35)
    añade a ./configure las opciones: --disable-nls

- less (comprobado con la versión 374)

- groff (comprobado con la versión 1.17.2)
    Si no compilaste un groff estático y tienes un compilador GCC C++ estático
    como resultado de completar el capítulo 5, puedes crear este paquete
    ejecutando las mismas órdenes descritas en el libro.

- textutils (comprobado con la versión 2.0)
    run: rm -f /bin/cat
      -> Creamos ese enlace simbólico al crear bash, ahora simplemente lo
         quitamos ya que los libros recientes del LFS experan que /bin/cat
	 no exista.
    añade a ./configure las opciones: --disable-nls

- sed (comprobado con la versión 3.02)

- flex (comprobado con la versión 2.5.4a)

- binutils (comprobado con la versión 2.12.1)
     añade a ./configure las opciones: --disable-nls

- gettext
    No construyas por ahora este paquete ya que hará que algunos otros paquetes
    crean que queremos soporte NLS. (Nos evitará algún trabajo si no lo
    creen). Si necesitas gettext por otras razones (tales como poder ejecutar
    'aclocal' en un código fuente que soporte gettext sin problemas) hazlo al
    final de esta receta. Allí encontrarás las instrucciones

- net-tools (comprobado con la versión 1.60)
    Dos protocolos (activados por defecto) no compilarán debido a que faltan
    includes/funciones en uClibc. 
    Se trata de AX25 y NET/ROM (Paquetes de radio) que no suelen emplearse y
    no hay problema en desactivarlos para la mayor parte de la gente.

    Si configuras net-tools 'sin' usar 'yes "" | make', haz simplemente 'n' 
    cada vez que los mencione (AX25 y NET/ROM) e instálalo normalmente. En
    otro caso, emplea las órdenes siguientes en lugar de las que aparecen en
    el libro LFS:

        yes "" | make config &&
        mv config.h config.h~ &&
        sed -e /AX25/s/1/0/ -e /NETROM/s/1/0/ < config.h~ > config.h &&
        make &&
        make update

- m4 (comprobado con la versión 1.4)
    ejecuta antes de empezar: patch -Np1 < ../uclibc-lfs-patches/m4-1.4-uClibc.patch
      -> m4 necesita algunas funciones que faltan en la uClibc, y este parche
      las proporciona.

- texinfo (comprobado con la versión 4.2)
     añade a ./configure las opciones: --disable-nls

- autoconf (comprobado con la versión 2.53)

- automake (comprobado con la versión 1.6.2)

- file (comprobado con la versión 3.38 y la 3.39)
    Hemos dicho antes en esta receta que hemos encontrado un problema con file
    y cómo se podía solcuionar. Había tres soluciones: según la que hayas
    empleado (es decir, la solución a, b, o c - compruébalo si no estás
    seguro), haz lo siguiente:
    Nota : No lo hagas todo, sólo a, b o c.
    Nota2: Ten cuidado de no confundir los parches, ya que hay dos parches con
           dos propósitos diferentes.

    a) Uso temporal de un file compilado estáticamente con glibc para
       hacer el trabajo: 
           ejecuta antes de empezar:
                patch -Np1 < ../uclibc-lfs-patches/file-3.39-uClibc-1.patch

             -> Este parche simplemente modifica los makefiles para que
	        empleen nuestro 'file' estático.

    b) Uso permanente de un file compilado estáticamente con glibc
       (seguro):
           No hagas nada, ve al paquete siguiente. (file ya está instalado)

    c) Uso de un arreglo 'sucio' para que file funcione sin ayuda externa
       (inseguro): 
           ejecuta antes de empezar (emplea file-3.38-uClibc-2.patch si usas
	   la versión 3.38):
                patch -Np1 < ../uclibc-lfs-patches/file-3.39-uClibc-2.patch

             -> Quitará misteriosamente lineas que considera erróneas en el
	        fichero "mágico" de 'file' incluso aunque tengan una sintaxis
	        correcta. Las líneas son:
         0 string/b  #\040xmcd           CDDB(tm) formato datos CD texto
         0 string/b  #!\ /bin/tcsh       Guión ejecutable de Tenex C shell 
         0 string/b  #!\ /usr/local/tcsh Guión ejecutable de Tenex C shell 
         0 string/cB \<!doctype\ html    Documento texto HTML 
                También se desconoce si la salida producida por 'file' al
		interpretar el fichero "mágico" será correcta al 100%, aunque
		parece utilizable (con la excepción de los cuatro tipos mencionados)

- libtool (comprobado con la versión 1.4.2)

- bin86 (comprobado con la versión 0.16.3)

- bzip2 (comprobado con la versión 1.0.2)

- ed (comprobado con la versión 0.2)

- kbd (comprobado con la versión 1.06)

- diffutils (comprobado con la versión 2.8.1)
    añade a ./configure las opciones: --disable-nls

- e2fsprogs (comprobado con la versión 1.27)
    Nota: No debería hacer falta --disable-nls (se detecta automáticamente)

- grep (comprobado con la versión 2.5)
    añade a ./configure las opciones: --disable-nls

- gzip (comprobado con la versión 1.2.4a)

- man (comprobado con la versión 1.5j)
    añade a las opciones de make: CFLAGS='-DNONLS'
      -> Eliminar el soporte para lenguaje nativo arreglará la compilación.
         Nota: CFLAGS es una variable vacía para las makefiles de los man.
	       Activarlo no desactivará ninguna de las opciones del compilador 
	       de C que estén en uso.

- nasm (comprobado con la versión 0.98.34)
    Nota: Al igual que zlib, nasm no forma parte en este momento del libro
          LFS (y puede que no lo haga nunca). sin embargo, si quieres
	  emplear un lilo reciente, puedes necesitarlo. Si usas lilo 22.2 o
	  anterior (o utilizas grub) obvia este paquete

    Puedes instalar nasm ejecutando las siguientes órdenes sencillas:

        ./configure --prefix=/usr &&
        make &&
        make install

- lilo (comprobado con la versión 22.2 y la 22.3.2)

- make 3.79.1
    añade a ./configure las opciones: --disable-nls

- modutils
    Obvia este paquete. Compilará, pero producirá violaciones de segmento en
    muchas operaciones, lo que lo hace inutilizable. Emplea un núcleo sin
    módulos o consigue un modutils estático (hasta que se arregle el
    problema). Se explicó con anterioridad en la sección 2.

- netkit-base (comprobado con la versión 0.17)

- patch (comprobado con la versión 2.5.4)

- procinfo (comprobado con la versión 18)

- procps (comprobado con la versión 2.0.7)
    ejecuta antes de empezar:
         patch -Np1 < ../uclibc-lfs-patches/procps-2.0.7-uClibc.patch

      -> Este parche hace que top.c deje de usar una función + de include
         que la uClibc no proporciona y que se relaciona con la creación
	 correcta de variables locales. 

- psmisc (comprobado con la versión 20.1)
    Nota: psmisc 20.2 y 21 tienen un soporte incompleto de la opción 
          '--disable-nls' y no compilarán con uClibc sin modificaciones.
	  Puesto que los programas de psmisc 20.1 funcionan correctamente y no
	  tienen soporte NLS en absoluto, lo instalaremos en su lugar. (Puedes
	  hacerlo utilizando las mismas órdenes que se describen el libro LFS.

- reiserfsprogs 3.x.1b
    ejecuta antes de empezar:
         patch -Np1 < ../uclibc-lfs-patches/reiserfsprogs-3.x.1b-uClibc.patch

      -> proporciona las funciones de la pila de objetos (obstack) de las que
         carece uClibc y los "include" que necesita reiserfs.

- shadow (comprobado con la versión 4.0.3)
    ejecuta antes de empezar: 
         patch -Np1 < ../uclibc-lfs-patches/shadow-4.0.3-uClibc.patch

      -> Shadow trata de utilizar la función putgrent que falta en uClibc, y
         este parche la proporciona. También trata de emplear 'innetgr', una
	 función relacionada con NIS que uClibc no soporta, por lo que
	 conviene desactivarla.
    añade a ./configure las opciones: --disable-nls

- sysklogd (comprobado con la versión 1.4.1)

- sysvinit (comprobado con la versión 2.84)

- tar (comprobado con la versión 1.13)
    añade a ./configure las opciones: --disable-nls

- util-linux (comprobado con la versión 2.11r and 2.11t)
    elimina de las opciones de 'make' y 'make install' la opción: HAVE_SLN=yes
      -> El libro LFS lo emplea debido a que glibc ya proporciona un sln
         (enlazado estáticamente). Dado que uClibc no lo hace, tenemos que
         crear el de las util-linux. 
         
- perl (comprobado con la versión 5.6.1)
    Nota: perl compila con uClibc pero "make test" falla en tres de sus
          pruebas. Aún así, es bastante probable que jamás necesites tales
          capacidades, por lo que puedes ignorarlo.

- gettext (comprobado con la versión 0.11.2)
    Nota: Sólo deberías instalar este paquete si lo necesitas para algo más
	  que dar soporte a lenguajes nativos (tal como ejecutar aclocal sobre
	  un código fuente que soporte gettext). Si lo instalas, puedes
	  pensar en hacerlo con un prefijo diferente a /usr (por ejemplo
	  /opt/gettext, quizá)
    añade a ./configure las opciones: --disable-nls

- Capítulo 7+ del libro LFS
    Puede completarse sin modificación alguna, hemos terminado con la receta,
    aunque tal vez quieras echar un vistazo a la sección 5 de las "Preguntas 
    frecuentes" (F.A.Q.) y a la 4 (Extras) si aún no lo has hecho.

=======================
4. Extras
=======================

- man2cat opcional (comprobado con la versión 0.1)
    SÓLO uses esto si no pudiste o no quisiste compilar groff. Esta es una
    forma alternativa de visualizar páginas man sin groff.

    Para instalar man2cat, descomprímelo sin más en el directorio que
    prefieras.

    man2cat convertirá automáticamente todas las páginas man de sus
    directorios y las colocará en los directorios de cat. Puedes convertir las 
    páginas man de tu sistema uClibc ejecutando esta órden en un sistema que 
    tenga instalado groff (recuerda volver a inicializar $LFS si aún no lo has
    hecho): 

        sh man2cat $LFS/usr/share/man

    Nota: Si quieres que las páginas cat se compriman de modo automático,
    emplea las opciones -gz o -bz2. Si quieres que funcione más rápido, prueba
    con la opción -jall que procesará todas las secciones simultáneamente
    (lanzará muchos procesos y utilizará más recursos, o sea que ten algo de
    cuidado). Mira man2cat -h si quieres más ayuda.

    Ahora que las has convertido, para hacer que "man" deje de intentar
    convertirlas de nuevo, tenemos que quitar las páginas man sin formatear 
    de su ubicación actual:

        cd $LFS/usr/share/man &&
        mkdir ../man.old &&
        mv man* ../man.old

    A continuación hay que indicarle a man dónde puede encontrar nuestras
    páginas cat, ya que por defecto las busca en /var/cache/man de acuerdo con
    la especificación del FHS, pero dado que nuestras páginas cat son estáticas
    y no necesitan estar en /var, creo que deberían colocarse en su ubicación
    anterior en /usr/share/man/cat*. Puedes actualizar tu fichero man.conf 
    haciendo:

        cd $LFS/etc &&
        mv man.conf man.conf~ &&
        sed -e 's/^# FSSTND/FSSTND/' -e 's/^FHS/# FHS/' < man.conf~ > man.conf

    Y ya está.

====================================
5. Preguntas más frecuentes (F.A.Q.)
====================================

P: Esta receta insiste en que "mantengas separados los capítulos 5 y 6", 
   usando un "estilo estático" y emplea a menudo un directorio /static.
   ¿Qué es eso?. ¿Cómo lo hago?
R: El LFS 4.0 (sólo disponible en el CVS cuando escribo esto) emplea un
   directorio especial ($LFS/static) para instalar todas las herramientas 
   compiladas estáticamente dle capítulo 5. Esta es una forma de poner en
   práctica la receta para "separar_el_capítulo_5_y_el_6.txt" (en el original
   inglés "keep_chap5_and_chap6_sep.txt"). Si quieres hacer lo mismo, lee la
   receta o crea la parte del capítulo 5 de la LFS siguiendo las instrucciones
   de la versión 4.0 de la LFS que encontrarás en el CVS. (Nota: La versión 
   LFS CVS/4.0+ emplea también gcc 3.1+. Si quieres seguir empleando el gcc
   2.95.3-2, sigue las instrucciones del libro de la LFS en su versión 3.3 y
   sustituye "/usr" por "/static" cada vez que aparezca en el capítulo 5).

P: ¿De verdad necesito crear un perl estático?
R: Por ahora, sí. uClibc necesita ejecutar un guión perl durante su proceso de
   creación. Sin embargo, debería ser fácil reescribirlo utilizando AWK en su 
   lugar; por lo que si deseas hacerlo así, encontrarás el dichoso guión en
   "extra/scripts/initfini.pl" dentro del código fuente de la uClibc. Se
   agradecen los parches (y en este caso, deberías enviarlos directamente a 
   la gente de la uClibc)

P: Sigo viendo el mensaje "the 'setlocale' function supports only C|POSIX 
   locales" con muchos paquetes. ¿Es un problema?
R: No. La uClibc puede compilarse con soporte para variables locales (es
   decir soporta otras locales que las C/POSIX), pero es algo horrible de
   hacer que además emplea partes de la glibc. Recomiendo encarecidamente 
   dejarlo estar.

P: ¿A qué fin tanto '--disable-nls' en un montón de paquetes?. Algunos 
   paquetes compilan sin problema usando soporte de lenguajes nativos.
R: Aunque compilen, la parte de soporte de lenguajes nativos (NLS) no 
   funciona. Lo único que se consigue es que los binarios y los ficheros
   compilados empleen algo más de espacio y de memoria RAM a cambio de 
   nada.

P: ¿Podré usar las XFree86?
R: Puedes, pero esta receta no te explica cómo (tendrás problemas)

P: ¿Puedo compilar binarios C++ enlazados con la uClibc usando una
   versión estática enlazada con la glibc del compilador GCC C++?
R: Si, pero puede dar malos resultados (por ejemplo, violaciones de segmento
   frecuentes) con algunos programas o paquetes. Evita C++ en lo posible.

P: La receta dice que de heco puedo compilar groff si tengo un compilador
   estático GCC C++. ¿Cómo creo uno?
R: Algunas versiones del libro LFS desactivan la creación del compilador
   de C++ en el capítulo 5 ya que no se emplea. Si quieres uno, crea de nuevo
   gcc de la misma forma que antes pero usando la opción 
   "--enable-languages=c,c++"

P: Ejecuté man2cat y ví un montón de mensajes de advertencia/error durante
   el proceso. ¿Me faltarán algunas páginas man?
R: Normalmente, son sólo mensajes de advertencia que indican errores de 
   sintaxis en algunas páginas man. Sin embargo, dichas páginas se formatean
   de todos modos y resultan legibles, algunas partes de las mismas pueden
   aparecer desajustadas o visualizarse de forma un tanto rara.

P: ¿Y que es eso de "warning: can't find character with input code ..."? No 
   quiero perder caracteres...
R: Trata de utilizar pues man2cat -roff "groff -mandoc -Tlatin1". -Tascii 
   por defecto para asegurar que se visualicen correctamente en cualquier
   terminal.

P: Ejecuté man2cat y emplea mucho más espacio que mis antiguas páginas man
   ¡incluso cuando las comprimo!
R: Por ahora, man2cat no crea enlaces simbólicos para páginas cat duplicadas,
   aunque probablemente lo haga en el futuro. (En otras palabras, tienes
   muchas páginas duplicadas ocupando espacio - Eres libre de crear un guión 
   para buscarlas y enlazarlas simbólicamente si el espacio es muy importante
   para tí)

P: Ejecuté man2cat pero no convirtió mis páginas en idioma .... "inserta el 
   que tú prefieras".
R: No se soporta en este momento y probablemente no se soporte jamás a menos
   que alguien mande un parche.

P: Esta receta me dice cómo crear un sistema LFS normal que use uClibc, pero 
   yo la quería emplear para crear un sistema de tamaño mínimo. ¿Qué paquetes
   tengo que quitar?
R: Un "sistema mínimo" es algo muy relativo en función de qué quieres hacer
   con él.
   El hecho es que puedes tener un sistema linux funcionando con nada más que 
   un núcleo y un procesador de órdenes (un shell). A partir de aquí: 
     - ¿Necesitas compilar binarios? (desarrollo)
     - ¿Te hace falta entrar en el sistema con un login?
     - ¿Quieres tener documentación?
     - ¿Quieres algún intérprete del lenguaje que sea?
     - etc...
   Pista: Tendrías que mirar el paquete busybox (http://www.busybox.net/)

======================
  Fin de la receta
======================