lunes, 12 de septiembre de 2011

Capitulo 5


Capítulo 5. Construir un sistema temporal
5.1. Introducción

Este capítulo muestra cómo compilar e instalar un sistema Linux mínimo. Este sistema contendrá sólo las herramientas necesarias para poder iniciar la construcción del sistema LFS definitivo en el Capítulo 6, permitiendo un entorno de trabajo algo más amigable para el usuario que el que un entorno mínimo ofrecería.
La construcción de este sistema mínimo se hará en dos etapas. La primera es construir un conjunto de herramientas independiente del sistema anfitrión (compilador, ensamblador, enlazador, librerías y unas pocas herramientas útiles).
La segunda etapa utiliza estas herramientas para construir el resto de herramientas esenciales.
Los ficheros compilados en este capítulo se instalarán bajo el directorio $LFS/Tools para mantenerlos separados de los ficheros que se instalen en el siguiente capítulo y de los directorios de producción de tu anfitrión. Puesto que los paquetes compilados aquí son puramente temporales, no queremos que estos ficheros contaminen el futuro sistema LFS.

5.2. Notas técnicas sobre las herramientas

Esta sección explica algunos de los razonamientos y detalles técnicos que hay detrás del sistema de construcción.
No es esencial que entiendas todo esto inmediatamente. La mayor parte tendrá sentido cuando hayas hecho una construcción real. Puedes consultar esta sección en cualquier momento durante la construcción.
El principal objetivo del Capítulo 5 es proporcionar un entorno temporal al que podamos entrar con chroot y a partir del cual podamos generar una construcción limpia y libre de problemas del sistema LFS en el Capítulo 6. Por el camino intentaremos independizarnos todo lo posible del sistema anfitrión, y para eso construimos unas herramientas principales autocontenidas y autohospedadas. Debería tenerse en cuenta que el proceso de construcción ha sido diseñado de forma que se minimice el riesgo para los nuevos lectores y, al mismo tiempo, se proporcione el máximo valor educacional.
Importante
Antes de continuar, deberías informarte del nombre de tu plataforma de trabajo, conocido con frecuencia como target triplet (triplete del objetivo). Para muchos el “target triplet” posiblemente sea i686-pc-linux-gnu. Una forma simple de determinar tu “target triplet” es ejecutar el guión config.guess que se incluye con las fuentes de muchos paquetes. Desempaqueta las fuentes de Binutils, ejecuta el guión ./config.guess y anota el resultado.
Igualmente necesitarás saber el nombre del enlazador dinámico de tu plataforma, también conocido como cargador dinámico (no debe confundirse con el enlazador estándar ld, que es parte de Binutils). El enlazador dinámico suministrado por Glibc encuentra y carga las librerías compartidas necesarias para un programa, prepara el programa y lo ejecuta. Usualmente el nombre del enlazador dinámico


es  ld-linux.so.2. En plataformas menos conocidas puede ser ld.so.1 y en las nuevas plataformas de 64 bits puede que incluso sea algo totalmente diferente. El nombre del enlazador dinámico de tu plataforma puede determinarse mirando en el directorio /lib de tu sistema anfitrión. Un modo seguro es inspeccionar un binario cualquiera de tu sistema anfitrión ejecutando: readelf -l <nombre del binario> | grep interpreter y anotar la salida. La referencia autorizada que cubre todas las plataformas está en el fichero shlib- versions en la raíz del árbol de las fuentes de Glibc.

Algunas claves técnicas sobre cómo funciona el método de construcción del Capítulo 5:
• Similar en principio a la compilación cruzada, donde las herramientas instaladas dentro del mismo prefijo trabajan en cooperación y utilizan una pequeña “magia” de GNU.
• Cuidada manipulación de la ruta de búsqueda de librerías del enlazador estándar para asegurar que los programas se enlazan sólo contra las librerías que elegimos.
• Cuidada manipulación del fichero specs de gcc para indicarle al compilador cuál es el enlazador dinámico a usar.

Se instala primero Binutils debido a que, tanto en GCC como en Glibc, la ejecución de configure realiza varias pruebas sobre el ensamblador y el enlazador para determinar qué características del software deben activarse o desactivarse.
Esto es más importante de lo que uno podría pensar. Un GCC o una Glibc incorrectamente configurados puede provocar unas herramientas sutilmente rotas cuyo impacto podría no notarse hasta casi finalizada la construcción de una distribución completa. Un fallo en el banco de pruebas normalmente resaltará dicho error antes de perder demasiado tiempo.
Binutils instala tanto su ensamblador como su enlazador en dos ubicaciones,   /tools/bin y /tools/$TARGET_TRIPLET/bin. Las herramientas de una ubicación son enlaces duros a la otra. Un aspecto importante del enlazador es su orden de búsqueda de librerías. Puede obtenerse información detallada de ld pasándole la opción - - verbose. Por ejemplo, un ld --verbose | grep SEARCH mostrará las rutas de búsqueda actuales y su orden. Puedes ver qué ficheros son realmente enlazados por ld compilando un programa simulado y pasándole la opción
--verbose.
Por ejemplo, gcc dummy.c -Wl,--verbose 2>&1 | grep succeeded te mostrará todos los ficheros abiertos con éxito durante el enlazado.

El siguiente paquete instalado es GCC y durante su fase configure verás, por ejemplo:
checking what assembler to use...
/tools/i686-pc-linux-gnu/bin/as
checking what linker to use...
/tools/i686-pc-linux-gnu/bin/ld

comprobando qué ensamblador usar...
/tools/i686-pc-linux-gnu/bin/as
comprobando qué enlazador usar...
/tools/i686-pc-linux-gnu/bin/ld

Esto es importante por la razón mencionada antes. También demuestra que el guión configure de GCC no explora los directorios del PATH para encontrar las herramientas a usar. Sin embargo, durante la operación real del propio gcc, no se utilizan necesariamente las mismas rutas de búsqueda. Para saber cuál es el enlazador estándar que utilizará gcc, ejecuta: gcc -print-prog-name=ld.
Puedes obtener información detallada a partir de gcc pasándole la opción - v mientras compilas un programa simulado. Por ejemplo: gcc -v dummy.c te mostrará los detalles sobre las fases de preprocesamiento, compilación y ensamblado, incluidas las rutas de búsqueda de gcc y su orden.
A continuación se instala Glibc. Las consideraciones más importantes para la construcción de Glibc son el compilador, las herramientas de binarios y las cabeceras del núcleo. Normalmente el compilador no es problema, pues Glibc siempre utilizará el gcc que se encuentre en un directorio del PATH. Las herramientas de binarios y las cabeceras del núcleo pueden ser algo más problemáticas, así que no nos arriesgaremos y haremos uso de las opciones disponibles de configure para forzar las opciones correctas. Después de ejecutar configure puedes revisar el contenido del fichero config.make en el directorio glibc-build para ver todos los detalles importantes. Encontrarás algunas cosas interesantes, como el uso de CC="gcc - B/tools/bin/" para controlar qué herramientas de binarios son usadas, y también el uso de las opciones
-nostdinc -isystem para controlar la ruta de búsqueda de cabeceras del compilador. Estos detalles ayudan a resaltar un aspecto importante del paquete Glibc: es muy autosuficiente en cuanto a su maquinaria de construcción y generalmente no se apoya en las opciones por defecto de las herramientas.
Después de la instalación de Glibc, haremos algunos ajustes para asegurar que la búsqueda y el enlazado tengan lugar solamente dentro de nuestro directorio /tools. Instalaremos un ld ajustado, que tiene limitada su ruta de búsqueda interna a
/tools/lib. Entonces retocaremos el fichero specs de gcc para que apunte a nuestro nuevo enlazador dinámico en /tools/lib. Este último paso es vital para el proceso completo. Como se mencionó antes, dentro de cada ejecutable compartido ELF se fija la ruta a un enlazador dinámico. Puedes verificar esto mediante: readelf
-l <nombre del binario> | grep interpreter. Retocando el ficheros specs de gcc estaremos seguros de que todo binario compilado desde aquí hasta el final de este capítulo usará nuestro nuevo enlazador dinámico en /tools/lib.
La necesidad de utilizar el nuevo enlazador dinámico es también la razón por la que aplicamos el parche Specs en la segunda fase de GCC. De no hacer esto los propios programas de GCC incluirían dentro suyo el nombre del enlazador dinámico del directorio /lib del sistema anfitrión, lo que arruinaría nuestro objetivo de librarnos del anfitrión.
Durante la segunda fase de Binutils podremos usar la opción --with-lib-path de configure para controlar la ruta de búsqueda de librerías de ld. A partir de este punto el corazón de las herramientas está autocontenido y autohospedado. El resto de los paquetes del Capítulo 5 se construirán todos contra la nueva Glibc en / tools.
Tras entrar en el entorno chroot en el Capítulo 6, el primer gran paquete a instalar es Glibc, debido a su naturaleza autosuficiente. Una vez que esta Glibc se instale dentro de /usr, haremos un rápido cambio en las opciones por defecto de las herramientas y entonces procederemos a la construcción real del sistema LFS.

5.3. Instrucciones generales de compilación
Durante la construcción de paquetes hay varias suposiciones hechas dentro de las instrucciones:

• Varios de los paquetes están revisados ​​antes de la compilación, pero sólo cuando el parche es necesario para evitar una  problema. Un parche es a menudo necesario, tanto en este capítulo y el siguiente, pero a veces en sólo uno o el otro.
Por lo tanto, no se preocupe si las instrucciones para descargar el parche parecen estar ausentes. Los mensajes de advertencia 
 de desplazamiento o pelusa también se pueden encontrar al aplicar un parche. No se preocupe por estas advertencias, ya que el parche fue aplicado con éxito.

Durante la compilación de la mayoría de los paquetes, habrá varias señales de advertencia que se desplazan por la pantalla. Estas son normales y pueden ser ignoradas. Estas advertencias son como parecen, las advertencias sobre obsoleta, pero no válida, el uso de la C o C + + la sintaxis. El estándar  C cambia con bastante frecuencia, y algunos paquetes todavía utilizan el antiguo estándar. Esto no es un problema, pero es una advertencia.

Importante 
Después de instalar cada paquete, eliminar la fuente y los directorios de construcción, a menos que se especifique 
 lo contrario. Eliminar las fuentes evita errores de configuración cuando el mismo paquete se reinstale más adelante.

Comprobar una vez más que la variable de entorno LFS está correctamente configurado:
echo $LFS

Asegúrese de que la salida muestra la ruta al punto de la partición LFS montaje, que es /mnt /lfs, utilizando nuestro ejemplo.

Por último, dos cuestiones importantes último hay que destacar:

Importante 
Las instrucciones de construcción asumen que el intérprete de comandos bash está en uso.


Importante 
Antes de emitir las instrucciones de compilación de un paquete, el paquete debe ser descomprimido como usuario lfs, y un cd en el directorio creado se debe realizar.

Para volver a insistir en el proceso de construcción:

1. Coloque todos los fuentes y parches en un directorio que sea accesible
desde el entorno chroot como / mnt / lfs / sources /. No ponga
fuentes en / mnt / lfs / tools /.
2. Cambiar al directorio de fuentes.
3. Para cada paquete:
a. Utilizando el programa tar, extraer el paquete que se construirá.
b. Cambie el directorio creado cuando el paquete sea extraido.
c. Siga las instrucciones del libro para la construcción del paquete.
d. Volver al directorio de fuentes.
e. Eliminar el directorio con las fuentes y los directorios(paquete) que fueron creados en el proceso de 
 construcción.



5.4. Binutils-2.21 - Paso 1
El paquete Binutils contiene un enlazador, un ensamblador y otras utilidades para trabajar con ficheros objeto.
Tiempo estimado de construcción: 1 SBU
Espacio requerido en disco: 248 MB

5.4.1Instalación de Binutils

Nota
Volver atrás y volver a leer las notas en la sección anterior. Entender las notas etiquetadas importante le ahorrará 
 un montón de problemas más adelante.

Es importante que Binutils sea el primer paquete que compiles, pues tanto Glibc como GCC llevan a cabo varias comprobaciones sobre el enlazador y el ensamblador disponibles para determinar qué características activar.
La documentación de Binutils recomienda construirlo en un directorio dedicado, fuera del árbol de las fuentes:
mkdir -v ../binutils-build
cd ../binutils-build

Nota
A fin de que los valores SBU mostrados en el resto del libro sean de utilidad, mide el tiempo que se tarda en construir este paquete desde la compilación, hasta e incluyendo la primera instalación. Para ello, envuelve los comandos dentro de un comando time como este: time { ./configure ... && make && make install; }.

Nota 
El estimado de construcción valores SBU y espacio en disco necesario en el capítulo 5 no incluye los datos del conjunto de pruebas.

Prepara Binutils para su compilación:
../binutils-2.21/configure \
--target=$LFS_TGT --prefix=/tools \
--disable-nls --disable-werror

Significado de las opciones de configuracion:

--target=$LFS_TGT
Debido a que la descripción de la máquina en la variable de LFS_TGT es un poco diferente que el valor devuelto por el script  config.guess, este parámetro le dirá el script de configuración para ajustar el sistema de construcción Binutil para construir una cruz enlazador.

--prefix=/tools
Esto le indica al guión configure que los programas de Binutils se instalarán en el directorio / tools.

--disable-nls
Esta opción desactiva la internacionalización, pues i18n no es necesario en las herramientas temporales.

--disable-werror
Esto evita que la construcción se pare en el caso de que el compilador del anfitrión genere avisos.

Compila el paquete:

make

La compilación se ha completado. Normalmente deberíamos ejecutar ahora el banco de pruebas, pero en esta temprana fase el entorno de trabajo para los bancos de pruebas (Tcl, Expect y DejaGnu) todavía no está en su sitio. Los beneficios de ejecutar las pruebas ahora son mínimos, pues los programas de esta primera fase pronto serán sustituidos por los de la segunda.


Si se construye 
 en x86_64, crea un enlace para asegurar la sanidad de las herramientas principales:

case $(uname -m) in
x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;;
esac

Instala el paquete:
make install

Los detalles sobre este paquete se encuentran en la Sección 6.12.2, "Contenido de Binutils".

5.5. GCC-4.5.2 - Paso 1
El paquete GCC contiene la colección de compiladores GNU, que incluye los compiladores C y C++.
Tiempo estimado de construcción: 5.0 SBU
Espacio requerido en disco: 809MB

5.5.1. La instalación de la Cruz del CCG

GCC requiere ahora que los paquetes de GMP, MPFR y MPC. Como estos paquetes no pueden ser incluidos en tu sistema anfitrión, que se construirá con GCC. Descomprima cada paquete en el directorio de las fuentes del CCG y cambie el nombre del los directorios resultantes para los procedimientos de construcción del CCG que automáticamente utilizará:

tar -jxf ../mpfr-3.0.0.tar.bz2
mv -v mpfr-3.0.0 mpfr
tar -jxf ../gmp-5.0.1.tar.bz2
mv -v gmp-5.0.1 gmp
tar -zxf ../mpc-0.8.2.tar.gz
mv -v mpc-0.8.2 mpc


La documentación de GCC recomienda construirlo fuera del directorio de la fuente en un directorio de construcción dedicado:

mkdir -v ../gcc-build
cd ../gcc-build

Prepara GCC para su compilación:

../gcc-4.5.2/configure \
--target=$LFS_TGT --prefix=/tools \
--disable-nls --disable-shared --disable-multilib \
--disable-decimal-float --disable-threads \
--disable-libmudflap --disable-libssp \
--disable-libgomp --enable-languages=c \
--with-gmp-include=$(pwd)/gmp --with-gmp-lib=$(pwd)/gmp/.libs \
--without-ppl --without-cloog

El significado de las opciones de configuración:

--disable-shared
Esta opción fuerza que GCC  vincula sus bibliotecas internas estática. Hacemos esto para evitar posibles problemas con el sistema anfitrión.

--disable-decimal-float,--disable-threads,
--disable-libmudflap,--disable-libssp, --disable-libgomp

Estos interruptores para desactivar el soporte para la extensión de coma flotante, threading, libmudflap, libssp y libgomp respectivamente. Estas características no se compilarán en la construcción de un compilador cruzado y no son necesarias
para la tarea de compilación cruzada de la libc temporal.

--disable-multilib

En x86_64, LFS no es compatible aún con una configuración multilib. Este interruptor es inofensivo para la arquitectura x86.

--enable-languages=c
Esta opción nos asegura que sólo se construya el compilador de C. Este es el único lenguaje que se necesita ahora.

--with-gmp-include=...
Esta opción le indica a GCC en las cabeceras de GMP se encuentran.

--with-gmp-lib=...
Esta opción le indica a GCC en la librería GMP se encuentra.

--without-ppl, --without-cloog
Estos interruptores de prevencion de  la construcción de GCC contra las bibliotecas  PPL y CLooG s que pueden estar presentes en el  sistema anfitrion, pero no estará disponible en el entorno chroot.

Compilar GCC ejecutando:

Make

La compilación está completa. En este punto, el conjunto de pruebas que normalmente se corren, pero, como se mencionó antes, el marco de  prueba
no es todavía en su lugar. Los beneficios de ejecutar las pruebas en este momento son mínimos, pues los programas de esta primera fase pronto serán sustituidos.

Instala el paquete:

make install

Usando - - disable-shared significa que el libgcc_ eh. un archivo no es creado e instalado. El paquete Glibc  depende de esta biblioteca, ya que utiliza - lgcc_ eh dentro de su sistema de construcción. Esta dependencia puede ser satisfecha por la creación de un  enlace simbólico a libgcc. a, desde que el fichero que contiene el resultado final será la contenida en los objetos que normalmente libgcc_ eh. a:
ln -vs libgcc.a `$LFS_TGT-gcc -print-libgcc-file-name | \
sed 's/libgcc/&_eh/'`

Los detalles sobre este paquete se encuentran en la Sección 6.16.2, "Contenido de GCC".

5.6. Cabeceras API de Linux-2.6.37

Las cabeceras API de Linux exponen la API del núcleo para ser usada por Glibc.
Tiempo estimado de  construcción: 0.1 SBU
Espacio requerido en disco: 485MB

5.6.1. Instalación de las cabeceras API de Linux

El núcleo Linux necesita exponer una Interfaz de Programación de Aplicaciones (API) para ser usada por la librería C del sistema (Glibc en LFS). Esto se hace desinfectando los diversos ficheros de cabecera incluidos en el paquete del núcleo Linux de código.


Asegúrese de que no hay archivos obsoletos y dependencias por ahí por la actividad anterior:
make mrproper

Ahora la prueba y el extracto de las cabeceras del núcleo visible para el usuario de la fuente. Se colocan en un directorio local intermedio y copia en la ubicación necesaria porque el proceso de extracción elimina todos los archivos existentes en el directorio de destino.

make headers_check
make INSTALL_HDR_PATH=dest headers_install
cp -rv dest/include/* /tools/include

Los detalles sobre este paquete se encuentran en la Sección 6.7.2, "Contenido de Linux encabezados API".

5.7. Glibc-2.13

El paquete Glibc contiene la librería C principal. Esta librería proporciona todas las rutinas básicas para la ubicación de memoria, búsqueda de directorios, abrir y cerrar ficheros, leerlos y escribirlos, manejo de cadenas, coincidenciade patrones, aritmética, etc...
Tiempo estimado de construcción: 6.9 SBU
Espacio requerido en disco: 371mb

5.7.1. Instalación de Glibc
Corregir un error que impide la construcción de Glibc con GCC-4.5.2:

patch -Np1 -i ../glibc-2.13-gcc_fix-1.patch

La documentación de Glibc recomienda construirlo fuera del directorio de la fuente en un directorio de compilación dedicada:

mkdir -v ../glibc-build
cd ../glibc-build


Porque Glibc no soporta i386, sus desarrolladores dicen utilizar el indicador del compilador - march = i486, cuando la construcción para las máquinas de X86. Hay varias maneras de lograr eso, pero las pruebas muestran que la bandera es el mejor situado dentro de la variable de construcción "CFLAGS". En lugar de anular completamente el sistema interno de lo que es construir 
 Glibc utiliza para CFLAGS, añadir la nueva bandera para el contenido existente de CFLAGS, haciendo uso del archivo especial configparms. La  -Mtune bandera = nativo también es necesario restablecer un valor razonable para-mtune que se cambia cuando establece –march.

case `uname -m` in
i?86) echo "CFLAGS += -march=i486 -mtune=native" > configparms ;;
esac

Prepara Glibc para su compilación:

../glibc-2.13/configure --prefix=/tools \
--host=$LFS_TGT --build=$(../glibc-2.13/scripts/config.guess) \
--disable-profile --enable-add-ons \
--enable-kernel=2.6.22.5 --with-headers=/tools/include \
libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes

Significado de las opciones de configure:

--host=$LFS_TGT, --build=$(../glibc-2.13/scripts/config.guess)

El efecto combinado de estos interruptores es un sistema que es construir Glibc se configura automáticamente para una compilación cruzada, utilizando el
enlazador 
 y compilador cruzado en / tools.

--disable-profile
Esto construye las librerías sin información de perfiles. Omite esta opción si planeas usar perfiles en las herramientas temporales.

--enable-add-ons
Esto le indica a Glibc que utilice el añadido NPTL como su librería de hilos.

--enable-kernel=2.6.22.5

Esto le indica a Glibc para compilar la librería con soporte para kernels 2.6.22.5 y posteriores Linux. Soluciones para los núcleos antiguos no están habilitadas.



--with-headers=/tools/include
Esto le indica a Glibc que se compile contra las cabeceras recién instaladas en el directorio de herramientas, para que conozca exactamente las características que tiene el núcleo y pueda optimizarse correctamente.

libc_cv_forced_unwind=yes

El enlazador 
 instalado en la Sección 5.4, "Binutils-2.21 - Fase 1" era compilador cruzado  y como tal no puede ser  utilizado hasta Glibc se ha instalado. Esto significa que la prueba para el soporte force-unwind va a fracasar, ya que se basa en un enlazador trabajando. La variable  libc_cv_forced_unwind = yes se pasa para informar a configurar el soporte force-unwind  está disponible  sin que tenga que ejecutar la prueba.

libc_cv_c_cleanup=yes

Del mismo modo, se pasa a través de  libc_cv_c_cleanup = yes al script de configuración para que la prueba se salte  y la limpiar el soporte de manipulación C está configurado.

Durante esta fase puede que veas el siguiente mensaje de aviso:

configure: WARNING:
*** These auxiliary programs are missing or
*** incompatible versions: msgfmt
*** some features will be disabled.
*** Check the INSTALL file for required versions.
configure: AVISO:
*** Versión incompatible o ausente de estos
*** programas auxiliares: msgfmt
*** algunas características serán desactivadas.
*** Comprueba en el fichero INSTALL las versiones requeridas.

La  ausencia o incompatibilidad  del programa msgfmt es generalmente inofensiva. El programa msgfmt es parte del paquete Gettext  que el sistema anfitrión debe proporcionar.

Compila el paquete:

Make

Este paquete viene con un conjunto de pruebas, sin embargo, no se puede ejecutar en este momento porque no tenemos un  compilador  C + + todavía.

Nota 
El conjunto de pruebas también se requiere información de localización para ser instalado con el fin de ejecutar correctamente.
 Los datos de configuración regional proporcionan información al sistema con respecto a cosas tales como la fecha, hora, y los formatos de moneda aceptada por la producción y las utilidades del sistema. Si los conjuntos de pruebas no se ejecutan en este capítulo (de acuerdo con la recomendación), no hay necesidad de instalar ahora las locales. Los lugares adecuados se instalarán en el próximo capítulo. Para cualquiera de las locales de Glibc , use las instrucciones de la Sección 6.9, "Glibc-2.13".


Instala el paquete:

make install

Los detalles sobre este paquete se encuentran en la Sección 6.9.4, "Contenido de Glibc".

5.8. Ajustar las herramientas

Ahora que se han instalado las librerías de C temporales, todas las herramientas que compilemos en el resto de este capítulo deberían enlazarse contra ellas. Para conseguirlo, deben ajustarse el enlazador y el fichero specs del compilador.

Esto se hace poniendo el archivo "specs" del compilador en una ubicación donde lo buscará por defecto. Una  sustitución sed  simple, entonces altera el enlazador dinámico de GCC que va a utilizar. El principio aquí es encontrar todas las referencias de archivos  del enlazador dinámico en / lib o posiblemente lib64 / si el sistema anfitrión es compatible con 64 bits, y ajustarlos para que apunte a la nueva ubicación en / tools.

Por precisión, se recomienda utilizar el método de copiar y pegar al emitir el comando siguiente.
Asegúrese de inspeccionar visualmente el fichero de especificaciones para comprobar que se ha ajustado correctamente todas las referencias a la ubicación de del enlazador dinámico. Consulte la Sección 5.2, "Notas técnicas sobre las herramientas", por el nombre por defecto del enlazador dinámico, si es necesario.

SPECS=`dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/specs
$LFS_TGT-gcc -dumpspecs | sed \
-e 's@/lib\(64\)\?/ld@/tools&@g' \
-e "/^\*cpp:$/{n;s,$, -isystem /tools/include,}" > $SPECS
echo "New specs file is: $SPECS"
unset SPECS

Atención
En este punto es obligatorio parar y asegurarse de que las operaciones básicas (compilación y enlazado) de las nuevas herramientas funcionan como se espera. Para esto vamos a hacer una simple comprobación:

echo 'main(){}' > dummy.c
$LFS_TGT-gcc -B/tools/lib dummy.c
readelf -l a.out | grep ': /tools'

Si todo funciona correctamente, no debe haber errores y la salida del último comando debe ser:

[Requesting program interpreter: /tools/lib/ld-linux.so.2]

Tenga en cuenta que / tools / lib o / tools / lib64 para equipos de 64 bits aparece como el prefijo del enlazador dinámico.

Si la salida no se muestra como arriba, o no hay salida alguna, entonces algo está mal. Investigar y seguir los pasos para encontrar el origen del problema y corregirlo. Este problema se debe resolver antes de  continuar. Algo puede haber ido mal con el arreglo del fichero specs. En este caso, repite el arreglo del archivo specs, asegurándote de copiar y pegar los comandos.

Una vez que todo está bien, borra los archivos de prueba:
rm -v dummy.c a.out

Nota 
La construcción de Binutils en la siguiente sección servirá como comprobación adicional de que el conjunto de herramientas se ha construido correctamente. Si no Binutils para construir, es una indicación de que algo ha ido mal con el anterior
Binutils, GCC, Glibc o instalaciones.

5.9. Binutils-2.21 - Paso 2

El paquete Binutils contiene un enlazador, un ensamblador, y otras herramientas para trabajar con ficheros objeto.
Tiempo estimado de construcción: 1.3 SBU
Espacio requerido en disco: 259 MB

5.9.1. Instalación de Binutils

Crear un directorio de construcción por separado una vez más:

mkdir -v ../binutils-build
cd ../binutils-build

Prepara Binutils para su compilación:

CC="$LFS_TGT-gcc -B/tools/lib/" \
AR=$LFS_TGT-ar RANLIB=$LFS_TGT-ranlib \
../binutils-2.21/configure --prefix=/tools \
--disable-nls --with-lib-path=/tools/lib


El significado de las nuevas opciones de configure:

CC="$LFS_TGT-gcc -B/tools/lib/" AR=$LFS_TGT-ar RANLIB=$LFS_TGT-ranlib

Porque esto es realmente una construcción natural de Binutils, el establecimiento de estas variables asegura que el sistema de generación utiliza el compilador cruzado y herramientas asociadas en lugar de las del sistema anfitrión.

--with-lib-path=/tools/lib

Esto le indica al script de configuración que especifique la ruta de búsqueda de la biblioteca durante la compilación de Binutils, resultando en / tools / lib que se pasa al enlazador. Esto evita que el enlazador busque en los directorios de la biblioteca en el host.

Compila el paquete:

Make


Instala el paquete:

make install

Ahora Prepara el enlazador para la fase de "Re-ajuste" en el siguiente capítulo:

make -C ld clean
make -C ld LIB_PATH=/usr/lib:/lib
cp -v ld/ld-new /tools/bin

El significado de los parámetros de make:

-C ld clean

Esto indica al programa make que elimine todos los archivos compilados en el subdirectorio ld.

-C ld LIB_PATH=/usr/lib:/lib

Esta opción reconstruye todo en el subdirectorio ld. Especificando la ruta LIB_ PATH en la variable Makefile  de comandos nos permite obviar el valor por defecto de las herramientas temporales y el punto a la ruta final adecuada.
El valor de esta variable especifica el enlazador de librerías por defecto la ruta de búsqueda. Esta preparación se utiliza en el 
 próximo capítulo.

Los detalles sobre este paquete se encuentran en la Sección 6.12.2, "Contenido de Binutils".

5.10. GCC-4.5.2 - Paso 2

El paquete GCC contiene la colección de compiladores GNU, que incluye los compiladores C y C++.
Tiempo estimado de construcción: 9.0 SBU
Espacio requerido en disco: 1003 mb

5.10.1. Instalación de GCC

Las versiones de GCC hasta 4.3 tratarán esta construcción como si se tratara de un compilador reubicado y deshabilita  la búsqueda de ficheros de inicio en la ubicación especificada por - - prefix. Dado que esto no será un compilador reubicado, y los ficheros de inicio en /tool son fundamentales para la construcción de un compilador de trabajo vinculado a las librerias en / tools, el siguiente parche revierte  GCC  a su  comportamiento anterior:

patch -Np1 -i ../gcc-4.5.2-startfiles_fix-1.patch

En circunstancias normales el script fixincludes GCC se ejecuta con el fin de corregir posibles ficheros de cabecera rotos. Como  GCC-4.5.2 y Glibc 2.13-ya se han instalado en este punto, y sus respectivos ficheros de no necesitan ser corregidos, el script  fixincludes no es necesario. De hecho, la ejecución de este script en realidad pueden contaminar el entorno de construcción al instalar ficheros de cabecera corregidos procedentes del anfitrión en el directorio privado dentro de GCC. La ejecución del script fixincludes puede eliminarse mediante los siguientes comandos:

cp -v gcc/Makefile.in{,.orig}
sed 's@\./fixinc\.sh@-c true@' gcc/Makefile.in.orig > gcc/Makefile.in

Para máquinas x86, un arranque de construcción de GCC usa el indicador del compilador - fomit-frame-pointer. No arranque la construcción omitiendo dicha opción, y el objetivo debe ser producir un compilador que es exactamente el mismo como si hubiese arrancado. Aplique el siguiente comando sed para que el compilador a use la bandera:

cp -v gcc/Makefile.in{,.tmp}
sed 's/^T_CFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in.tmp \
> gcc/Makefile.in

El siguiente comando va a cambiar la localización del enlazador dinámico de GCC para usar la instalada en / tools. También elimina / usr / include de la ruta de búsqueda incluida en  GCC. Haciendo esto en lugar de ajustar el fichero specs después de la instalación asegura que el nuevo enlazador dinámico es usado durante la construcción actual de GCC. Es decir, todos los binarios creados durante la construcción se enlazarán con la nueva edición Glibc.:

for file in \
$(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
do
cp -uv $file{,.orig}
sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
-e 's@/usr@/tools@g' $file.orig > $file
echo '
#undef STANDARD_INCLUDE_DIR
#define STANDARD_INCLUDE_DIR 0
#define STANDARD_STARTFILE_PREFIX_1 ""
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
touch $file.orig
done

En el caso anterior parece difícil de seguir, vamos a descomponer un poco. En primer lugar nos encontramos con todos los archivos bajo el directorio gcc / config  en el que se nombran o linux. h, linux64. h o sysv4. h. Para cada archivo encontrado, lo copia en un archivo del mismo nombre pero con un sufijo añadido de ". orig". Entonces la expresión sed primero añade "/ tools" a todas las instancias de "/ Lib / ld", "/ lib64/ld" o "/ lib32/ld", mientras que el segundo reemplaza en el código las instancias de "/ usr". A continuación, añadimos nuestra definición de estados que alteran la ruta de búsqueda y el prefijo startfile al final del archivo. Por último, use touch para actualizar la fecha y hora en los archivos copiados. Cuando se  conjuntamente a cp-u, esto evita que los cambios inesperados  en los archivos originales en caso de que los comandos se ejecuten dos veces sin darnos cuenta.

En x86_64, borramos la especificación multilib para GCC asegura que no tratará de enlazar con las bibliotecas en el sistema anfitrión:

case $(uname -m) in
x86_64)
for file in $(find gcc/config -name t-linux64) ; do \
cp -v $file{,.orig}
sed '/MULTILIB_OSDIRNAMES/d' $file.orig > $file
done
;;
Esac

Al igual que en la construcción del primer GCC requiere que los paquetes de GMP, MPFR y MPC. Desempaquete los archivos de código y muévalos  los  directorios necesarios:

tar -jxf ../mpfr-3.0.0.tar.bz2
mv -v mpfr-3.0.0 mpfr
tar -jxf ../gmp-5.0.1.tar.bz2
mv -v gmp-5.0.1 gmp
tar -zxf ../mpc-0.8.2.tar.gz
mv -v mpc-0.8.2 mpc

Crear un directorio de construcción por separado otra vez :

mkdir -v ../gcc-build
cd ../gcc-build

Antes de iniciar la construcción de GCC, recuerde desactivar cualquier variable de entorno que modifique las opciones de optimización.

Prepara GCC para su compilación:

CC="$LFS_TGT-gcc -B/tools/lib/" \
AR=$LFS_TGT-ar RANLIB=$LFS_TGT-ranlib \
../gcc-4.5.2/configure --prefix=/tools \
--with-local-prefix=/tools --enable-clocale=gnu \
--enable-shared --enable-threads=posix \
--enable-__cxa_atexit --enable-languages=c,c++ \
--disable-libstdcxx-pch --disable-multilib \
--disable-bootstrap --disable-libgomp \
--with-gmp-include=$(pwd)/gmp --with-gmp-lib=$(pwd)/gmp/.libs \
--without-ppl --without-cloog

El significado de las nuevas opciones de configure:

--enable-clocale=gnu

Esta opción asegura que el modelo local correcto es seleccionado para las librerías C + + en todas los casos. Si el script configure encuentra instalada la configuración regional  de_DE, seleccionará el modelo correcto de gnu. Sin embargo, si de_DE no está instalado, se corre el riesgo de construcción de interfaces binarias de aplicación (ABI)- incompatibles con las bibliotecas de C++ porque el modelo de  configuración regional genérico incorrecto puede ser seleccionado.

- Enable-threads = posix

Esto permite el manejo de excepciones C + + para código multihilo.

--enable-__cxa_atexit
Esta opción permite el uso de _ cxa_ atexit, en vez de atexit, para registrar destructores C + + para objetos estáticos locales y objetos globales. Esta opción resulta esencial para el manejo totalmente compatible con los estándares de los destructores. También afecta a  C + + ABI, y por lo tanto los resultados obteniendo librerías compartidas en C + + y programas C + + que son interoperables con otras distribuciones Linux.
-enable-languages=c,c++

Esta opción garantiza que tanto el compilador C y C + + están construidos.

--disable-libstdcxx-pch

No construye la cabecera precompilada (PCH) para libstdc + +. Ocupa mucho espacio, y no es necesario usarlo.

--disable-bootstrap

Para las versiones nativas de GCC, el valor por defecto consiste en  hacer un "arranque" de construcción. Esto no sólo compila GCC, sino que lo hace varias veces. Utiliza los programas compilados en una primera instancia que se compile una segunda vez, y luego nuevo por tercera vez. Las iteraciones de la segunda y tercera se comparan para asegurarse de que puede reproducirse sin problemas. Esto también implica que se ha compilado correctamente. Sin embargo, el método de construcción de LFS debe proporcionar un compilador sólido  sin necesidad de arrancar cada vez.


Compila el paquete:

Make

Instala el paquete:

make install

Como toque final, crea un enlace. Muchos programas y scripts ejecutan cc en vez de gcc, que se utiliza para mantener programas genéricos y por lo tanto, utilizable en todo tipo de sistemas UNIX, donde el compilador GNU C no siempre es instalado. Ejecutar cc deja al administrador del sistema libre de decidir qué compilador de C instalar:

ln -vs gcc /tools/bin/cc

Precaución 
En este punto, es obligatorio parar y asegurarse de que las funciones básicas (compilación y enlazado) de las nuevas herramientas funcionan como se espera. Para llevar a cabo una comprobación de validez, ejecute los siguientes comandos:

echo 'main(){}' > dummy.c
cc dummy.c
readelf -l a.out | grep ': /tools'

Si todo funciona correctamente, no debe haber errores y la salida del último comando debe ser de la forma:

[Requesting program interpreter: /tools/lib/ld-linux.so.2]


Observe que / tools / lib o / tools / lib64 para equipos de 64 bits aparece como el prefijo del 
 enlazador dinámico.
Si la salida no se muestra como arriba, o no hay salida alguna, entonces algo está mal. Investigar y seguir los pasos para encontrar el origen del problema y corregirlo. Este problema se debe resolver antes de continuar. En primer lugar, la comprobar de nuevo, usando gcc en vez de cc. Si esto funciona, entonces el / tools / bin / cc es el enlace que falta. Instale el enlace 
 anterior. A continuación, asegúrese de que la ruta es correcta. Esto puede ser comprobado ejecutando echo $ PATH y verificando que / tools / bin está primero en la lista. Si el PATH está mal puede significar que no se ha registrado como usuario lfs o que algo salió mal en la
Sección 4.4, "Configuración del entorno".

Una vez que todo está bien, borre los archivos de prueba:

rm -v dummy.c a.out


Los detalles sobre este paquete se encuentran en la Sección 6.16.2, "Contenido de GCC".

5.11. Tcl-8.5.9

El paquete Tcl contiene el Tool Command Language.

Tiempo estimado de construcción: 0.5 SBU
Espacio requerido en disco: 32 MB

5.11.1. Instalación de Tcl 

Este paquete y los dos siguientes (Expect y DejaGNU) se instalan para permitir la ejecución del conjunto de pruebas de GCC y Binutils. Instalar 
 tres paquetes para propósitos de prueba puede parecer excesivo, pero es muy alentador, si no esencial,  para saber que las herramientas más importantes están funcionando correctamente. Incluso si el conjunto de pruebas no se ejecutan en este capítulo (que no son obligatorias), los paquetes son necesarios para ejecutarlas en el capítulo 6.

Prepara Tcl para su compilación:

cd unix
. / Configure - prefix = / tolos

Construye el paquete:

make

La compilación está completa. Como se señaló anteriormente, la ejecución del conjunto de pruebas no es obligatoria para las herramientas temporales  en este capítulo. Para ejecutar el conjunto de pruebas de Tcl todos modos,use el siguiente comando:

TZ=UTC make test

El conjunto de pruebas Tcl  puede experimentar fallos bajo ciertas condiciones del anfitrión que no se entienden completamente. Por lo tanto, las fallas del conjunto de pruebas no son una sorpresa, y no se consideran críticos. El parámetro TZ = UTC establece la zona horaria de Tiempo Universal Coordinado (UTC), también conocido como meridiano de Greenwich (GMT), pero sólo por la duración de la ejecución de pruebas. Esto asegura que las pruebas del reloj se ejercen correctamente. Los detalles sobre la variable de entorno TZ se proporcionan en el Capítulo 7.
Instala el paquete:

make install

Hacer de la biblioteca instalada para escribir los símbolos de depuración se puede quitar más adelante:

chmod -v u+w /tools/lib/libtcl8.5.so

Instala cabeceras de Tcl. El siguiente paquete, Expect, les obliga a construir.

make install-private-headers

Ahora haga un enlace simbólico necesario:

ln -sv tclsh8.5 /tools/bin/tclsh

5.11.2. Contenido de Tcl

Programas instalados: tclsh (enlace a tclsh8.5) y tclsh8.5
Librería instalada: libtcl8.5.so, libtclstub8.5.a

Descripción corta
tclsh8.5 
 el comando tcl shell
tclsh un enlace a tclsh8.5
libtcl8.5.so La biblioteca Tcl
libtclstub8.5.a la biblioteca auxiliar Tcl

5.12. Expect-5.45

El paquete Expect contiene un programa para llevar a cabo diálogos entre scripts con otros programas interactivos.
Tiempo estimado de construcción: 0.1 SBU
Espacio requerido en disco: 4.1 MB

5.12.1. La instalación de Expect 

En primer lugar, configurar el script para usar / bin / stty en vez de a / usr / local / bin / stty puede encontrar en el sistema anfitrión. Esto asegurará que nuestras herramientas de pruebas se mantengan para las compilaciones finales de nuestras herramientas principales:

cp -v configure{,.orig}
sed 's:/usr/local/bin:/bin:' configure.orig > configure

Ahora, prepara Expect para su compilación:
. / Configure - prefix = / tools - with-tcl = / tools / lib \
- With-tclinclude = / tools / include

El significado de las opciones de configuración:

- With-tcl = / tools / lib

Esto asegura que el script configure encuentre la instalación de Tcl en el de herramientas temporales en lugar de, posiblemente, la localización de uno ya existente en el sistema anfitrión.


- With-tclinclude = / tools / include


Explícitamente dice a Expect dónde encontrar las cabeceras internas de Tcl. Usando esta opción se evita que las condiciones donde configure falle porque no pudo detectar automáticamente la ubicación de las cabeceras de Tcl.

Construye el paquete:

Make

La compilación está completa. Como se señaló anteriormente, la ejecución del conjunto de pruebas no es obligatoria para las herramientas temporales en este capítulo. Para ejecutar el test suite esperar de todos modos, el siguiente comando:

Make test


Tenga en cuenta que el conjunto de pruebas se sabe que esperar experimenta fallos bajo ciertas condiciones del anfitrión que no están bajo nuestro
de control. Por lo tanto, las fallas del banco de pruebas no son una sorpresa y no se consideran críticos.
Instala el paquete:
make SCRIPTS = "" install

El significado del parámetro de make:
SCRIPTS = ""
Esto evita la instalación de los scripts suplementarios esperar, que no son necesarios.

5.12.2. Contenido de Expect

Programa instalado: Expect
Librería instalada: libexpect-5.45.a

Descripción corta
Expect                     
 Comunica con otros programas interactivos según el script
libexpect-5.45.a   
 Contiene funciones que permiten esperar para ser utilizado   
como una extensión de Tcl o usada directamente de C o C + + (sin Tcl)

5.13. DejaGNU-1.4.4 

El paquete contiene DejaGNU un marco para las pruebas de otros programas.
Tiempo estimado de construcción: menos de 0.1 SBU
El espacio necesario en disco: 6.1 MB

5.13.1. La instalación de DejaGNU 

La versión más reciente de este paquete fue lanzado en 2004. Aplicar algunas correcciones que se han acumulado desde entonces:

patch -Np1 -i ../dejagnu-1.4.4-consolidated-1.patch

Prepare DejaGNU para su compilación:
. / Configure - prefix = / tools

Construir e instalar el paquete:

Make install

Para probar los resultados, ejecuta:

make check

5.13.2. Contenido de DejaGNU

Programa instalado: runTest
Descripción corta
runTest Un wrapper script que encuentra el adecuado shell Expect y ejecuta DejaGNU

5.14. Ncurses-5.7 

El paquete Ncurses contiene librerías para el manejo independiente del terminal de pantallas de caracteres.
Tiempo estimado de construcción: 0.7 SBU
Espacio requerido en disco: 30 MB

5.14.1. Instalación de Ncurses

Prepara Ncurses para su compilación:

./configure --prefix=/tools --with-shared \
--without-debug --without-ada --enable-overwrite

El significado de las opciones de configuración:


- Without-ada
Esto asegura que Ncurses no conseguir apoyo para el compilador de Ada que pueden estar presentes en el sistema anfitrión, pero no estará disponible una vez que entramos en el entorno chroot.

- Enable-overwrite
Esto le indica a Ncurses que instale sus ficheros de cabecera en / tools / include, en lugar de
/ Tools / include / ncurses para asegurar que otros paquetes puedan encontrar las cabeceras de Ncurses con éxito.

Compila el paquete:

Make


Este paquete tiene un conjunto de pruebas, pero sólo se puede ejecutar después de que el paquete haya sido instalado. Las pruebas residen en el 
 directorio test /. Consulte el archivo README en ese directorio para obtener más detalles.


Instala el paquete:

Make install

Los detalles sobre este paquete se encuentran en la Sección 6.19.2, "Contenido de Ncurses".

5.15. Bash-4.2 

El paquete Bash contiene el Bourne-Again SHell.
Tiempo estimado de construcción: 0.5 SBU
Espacio requerido en disco: 35 MB

5.15.1. Instalación de Bash 

Prepara Bash para su compilación:

./configure --prefix=/tools --without-bash-malloc

El significado de las opciones de configuración:
- Without-bash-malloc
Esta opción desactiva el uso de la asignación de memoria de Bash (malloc), la cual se sabe que causa fallos de segmentación. Al desactivar esta opción, Bash utilizará la función malloc de Glibc, que son más estable.
Compila el paquete:

Make


La compilación está completa. Como se señaló anteriormente, la ejecución del conjunto de pruebas no es obligatoria para las herramientas temporales
en este capítulo. Para ejecutar el test suite Bash , use el siguiente comando:

Make tests

Instalar el paquete:

Make install

Hacer un vínculo para los programas que usan sh por un shell:

ln -vs bash /tools/bin/sh

Los detalles sobre este paquete se encuentran en la Sección 6.29.2, "Contenido de Bash".

5.16. Bzip2-1.0.6 

El paquete Bzip2 contiene programas para comprimir y descomprimir archivos. La compresión de archivos de texto con bzip2 se obtiene un mayor porcentaje de compresión que el tradicional gzip.
Tiempo estimado de construcción: menos de 0.1 SBU
Espacio requerido en disco: 4.8 MB

5.16.1. Instalación de Bzip2 

El paquete Bzip2 no contiene un script de configuración. Compile 
 y pruebe con:

Make

Instalar el paquete:
make PREFIX=/tools install

Los detalles sobre este paquete se encuentran en la Sección 6.36.2, "Contenido de Bzip2".

5.17. Coreutils-8.10 

El paquete contiene utilidades Coreutils para mostrar y establecer las características básicas del sistema.
Tiempo estimado de construcción: 0.7 SBU
Espacio requerido en disco: 88 MB


5.17.1. La instalación de Coreutils 

Prepare Coreutils para su compilación:
./configure --prefix=/tools --enable-install-program=hostname


El significado de las opciones de configuración:

--enable-install-program=hostname
Esto permite que el binario hostname para ser construido e instalado - que está desactivado por defecto, pero es requerido por el conjunto de pruebas Perl.
Compilar el paquete:

Make

La compilación está completa. Como se señaló anteriormente, la ejecución del conjunto de pruebas no es obligatoria para las herramientas temporales
en este capítulo. Para ejecutar el conjunto de pruebas Coreutils, use el siguiente comando:

make RUN_EXPENSIVE_TESTS=yes check

El parámetro  RUN_ EXPENSIVE_ TESTS =YES indica al conjunto de pruebas a ejecutar varias pruebas adicionales que se consideran relativamente costosas (en términos de potencia de CPU y memoria) en algunas plataformas, pero por lo general no son un problema en Linux.
Instala el paquete:

Make install

El comando anterior se niega a instalar su porque el programa no puede ser instalado con setuid root como usuario sin privilegios.
Mediante la instalación de forma manual con otro nombre, podemos usarlo para ejecutar las pruebas en sistema final como un usuario sin privilegios y mantener un su posible útil a nuestro anfitrión por primera vez en nuestro PATH. Instalarlo con:

cp -v src/su /tools/bin/su-tools

Los detalles sobre este paquete se encuentran en la Sección 6.22.2, "Contenido de Coreutils".

5.18. Diffutils-3.0

El paquete Diffutils contiene programas que muestran las diferencias entre archivos o directorios.
Tiempo estimado de construcción: 0.1 SBU
El espacio necesario en disco: 6.1 MB

5.18.1. La instalación de Diffutils 

Prepare Diffutils para su compilación:

./configure --prefix=/tools

Compilar el paquete:

Make

La compilación está completa. Como se señaló anteriormente, la ejecución del conjunto de pruebas no es obligatoria para las herramientas temporales
en este capítulo. Para ejecutar el conjunto de pruebas Diffutils de todos modos, use el siguiente comando:

Make check

Instalar el paquete:

Make install

Los detalles sobre este paquete se encuentran en la Sección 6.37.2, "Contenido de Diffutils".

5.19. File-5.05 

El paquete contiene un archivo de utilidad para determinar el tipo de un archivo o archivos.
Tiempo estimado de construcción: 0.2 SBU
Espacio requerido en disco: 9.5 MB


5.19.1. Instalación de archivos 

Preparar archivos para su compilación:

./configure --prefix=/tools

Compilar el paquete:

Make

La compilación está completa. Como se señaló anteriormente, la ejecución del conjunto de pruebas no es obligatoria para las herramientas temporales
en este capítulo. Para ejecutar el conjunto de pruebas de File de todos modos, use el siguiente comando:

Make check

Instalar el paquete:

Make install

Los detalles sobre este paquete se encuentran en la Sección 6.39.2, "Contenido de archivo".

5.20. Findutils-4.4.2 

El paquete contiene Findutils programas para buscar archivos. Estos programas se ofrecen para buscar de forma recursiva a través de un árbol de directorios y de crear, mantener y buscar una base de datos (a menudo más rápido que la búsqueda recursiva, pero poco fiable si la base de datos no ha sido actualizada recientemente).
Tiempo estimado de construcción: 0.3 SBU
Espacio requerido en disco: 20 MB

5.20.1. La instalación de Findutils 

Prepare Findutils para su compilación:

./configure --prefix=/tools

Compilar el paquete:

Make


La compilación está completa. Como se señaló anteriormente, la ejecución del conjunto de pruebas no es obligatoria para las herramientas temporales
en este capítulo. Para ejecutar el conjunto de pruebas Findutils de todos modos, use el siguiente comando:

Make check

Instalar el paquete:

Make install

Los detalles sobre este paquete se encuentran en la Sección 6.40.2, "Contenido de Findutils".


5.21. Gawk-3.1.8 

El paquete Gawk contiene programas para manipular archivos de texto.
Tiempo estimado de construcción: 0.2 SBU
Espacio requerido en disco: 19 MB

5.21.1. Instalación de Gawk 

Prepare Gawk para su compilación:

./configure --prefix=/tools

Compilar el paquete:

Make

La compilación está completa. Como se señaló anteriormente, la ejecución del conjunto de pruebas no es obligatoria para las herramientas temporales
en este capítulo. Para ejecutar el conjunto de pruebas 
 Gawk  de todos modos, use el siguiente comando:

Make check

Instalar el paquete:

Make install

Los detalles sobre este paquete se encuentran en la Sección 6.38.2, "Contenido de Gawk".

5.22. Gettext-0.18.1.1 

El paquete Gettext contiene utilidades para la internacionalización y localización. Estas permiten que los programas que se compilan con NLS (Native Language Support), que permite que los mensajes salgan en el idioma nativo del usuario.
Tiempo estimado de construcción: 0.8 SBU
Espacio requerido en disco: 82 MB

5.22.1. Instalación de Gettext

Para nuestro conjunto de herramientas de temporal, sólo tenemos que construir e instalar un binario de Gettext.
Prepara Gettext para su compilación:

cd gettext-tools
./configure --prefix=/tools --disable-shared

El significado de la opción de configuración:

- Disable-shared
No es necesario instalar cualquiera de las bibliotecas Gettext compartido en este momento, por lo tanto no hay necesidad de construir.

Compilar el paquete:

make -C gnulib-lib
make -C src msgfmt

Ya que sólo un binario ha sido compilado, no es posible ejecutar el conjunto de pruebas sin compilar librerías de soporte adicionales del paquete Gettext. Por ello no es recomendable intentar conjunto de pruebas en esta etapa.
Instala el binario msgfmt:

cp -v src/msgfmt /tools/bin

Los detalles sobre este paquete se encuentran en la Sección 6.42.2, "Contenido de Gettext".

5.23. Grep-2.7 

El paquete contiene los programas de grep para buscar a través de archivos.
Tiempo estimado de construcción: 0.1 SBU
Espacio requerido en disco: 6.7 MB


5.23.1. Instalación de Grep
Prepare grep para su compilación:

./configure --prefix=/tools \
--disable-perl-regexp

El significado de los interruptores de configuración:
- Disable-perl-regexp
Esto asegura que el programa grep no se enlaza contra una librería Expresión Perl Compatible Regular (PCRE) que puede estar presente en el sistema anfitrión, pero no estará disponible una vez que entramos en el entorno chroot.
Compila el paquete:

Make

La compilación está completa. Como se señaló anteriormente, la ejecución del conjunto de pruebas no es obligatoria para las herramientas temporales
en este capítulo. Para ejecutar el conjunto de pruebas de 
 grep de todos modos, use el siguiente comando:

Make check

Instalar el paquete:

Make install

Los detalles sobre este paquete se encuentran en la Sección 6.27.2, "Contenido de Grep".


5.24. Gzip-1.4 

El paquete Gzip contiene programas para comprimir y descomprimir archivos.
Tiempo estimado de construcción: menos de 0.1 SBU
Espacio requerido en disco: 3.3 MB

5.24.1. Instalación de Gzip 

Prepara Gzip para su compilación:

./configure --prefix=/tools

Compilar el paquete:

Make

La compilación está completa. Como se señaló anteriormente, la ejecución del conjunto de pruebas no es obligatoria para las herramientas temporales
en este capítulo. Para ejecutar el conjunto de pruebas Gzip de todos modos, use el siguiente comando:

Make check

Instalar el paquete:

Make install

Los detalles sobre este paquete se encuentran en la Sección 6.45.2, "Contenido de Gzip".

5.25. M4-01/04/15 

El paquete M4 contiene un procesador de macros.
Tiempo estimado de construcción: 0.2 SBU
Espacio requerido en disco: 11.6 MB

5.25.1. Instalación de M4

Prepara M4 para su compilación:

./configure --prefix=/tools

Compilar el paquete:

Make

La compilación está completa. Como se señaló anteriormente, la ejecución del conjunto de pruebas no es obligatoria para las herramientas temporales
en este capítulo. Para ejecutar el conjunto de pruebas de 
 M4 de todos modos, use el siguiente comando:


Make check


Instala el paquete:


make install


Los detalles sobre este paquete se encuentran en la Sección 6.24.2, "Contenido de M4."


5.26.Make 3.82 

Haga el paquete contiene un programa para compilar paquetes.
Tiempo estimado de construcción: 0.1 SBU
Espacio requerido en disco: 9.6 MB

5.26.1. Instalación de Make

Prepare hacer para su compilación:

./configure --prefix=/tools

Compilar el paquete:

Make

La compilación está completa. Como se señaló anteriormente, la ejecución del conjunto de pruebas no es obligatoria para las herramientas temporales
en este capítulo. Para ejecutar conjunto de pruebas de Make de todas formas, use el siguiente comando:


Make check


Instala el paquete:


make install


Los detalles sobre este paquete se encuentran en la Sección 6.49.2, "Contenido de Make".

5.27. Patch 2.6.1 

El paquete Patch contiene un programa para modificar o crear ficheros mediante la aplicación de un "parche" del archivo general creada por el programa diff.
Tiempo estimado de construcción: menos de 0.1 SBU
Espacio requerido en disco: 1.9 MB

5.27.1. La instalación del parche

Prepara Patch para su compilación:

./configure --prefix=/tolos

Compilar el paquete:

Make

La compilación está completa. Como se señaló anteriormente, la ejecución del conjunto de pruebas no es obligatoria para las herramientas temporales
en este capítulo. Para ejecutar el conjunto de pruebas de Patch de todos modos, use el siguiente comando:


Make check

Instala el paquete:


make install


Los detalles sobre este paquete se encuentran en la Sección 6.53.2, "Contenido de Patch".

5.28. Perl-5.12.3 

El paquete Perl contiene el Lenguaje Práctico de Extracción e Informe.
Tiempo estimado de construcción: 0.8 SBU
Espacio requerido en disco: 106 MB

5.28.1. La instalación de Perl

En primer lugar aplicar el siguiente parche para adaptar algunas de las rutas de cableados a la biblioteca de C:

patch -Np1 -i ../perl-5.12.3-libc-1.patch

Prepara Perl para la compilación (asegúrese de obtener el 'Data / Dumper Fcntl IO "parte del comando correcto-son todas letras):

sh Configure -des -Dprefix=/tools \
-Dstatic_ext='Data/Dumper Fcntl IO'

El significado de las opciones de configuración:
'Data / Dumper Fcntl IO-Dstatic_ext =
Esto le indica a Perl para generar el conjunto mínimo de extensiones estáticas necesarias para instalar y probar el Coreutils y Paquetes de Glibc en el siguiente capítulo.
Sólo algunas de las utilidades incluidas en este paquete, y una de sus bibliotecas, hay que construir:

make perl utilities ext/Errno/pm_to_blib


Aunque Perl viene con un conjunto de pruebas, no se recomienda ejecutarlo en este momento. Sólo una parte de Perl fue construido y ejecuta make test hará que el resto de Perl que se construirá bien, así, que no es necesario en este momento. El conjunto de pruebas se puede ejecutar en el próximo capítulo, si lo desea.
Instalar estas herramientas y sus bibliotecas:

cp -v perl pod/pod2man /tools/bin
mkdir -pv /tools/lib/perl5/5.12.3
cp -Rv lib/* /tools/lib/perl5/5.12.3

Los detalles sobre este paquete se encuentran en la Sección 6.33.2, "Contenido de Perl".

5.29. Sed-4.2.1 

El paquete Sed contiene un editor de flujo.
Tiempo estimado de construcción: 0.1 SBU
Espacio requerido en disco: 8.0 MB

5.29.1. Instalación de Sed

Prepara Sed para su compilación:

./configure --prefix=/tolos

Compilar el paquete:

Make

La compilación está completa. Como se señaló anteriormente, la ejecución del conjunto de pruebas no es obligatoria para las herramientas temporales
en este capítulo. Para ejecutar el conjunto de pruebas Sed de todos modos, use el siguiente comando:

Make check

Instalar el paquete:

Make install

Los detalles sobre este paquete se encuentran en la Sección 6.17.2, "Contenido de Sed"

5.30. Tar-1.25 

El paquete Tar contiene un programa de archivo.
Tiempo estimado de construcción: 0.3 SBU
Espacio requerido en disco: 20.9 MB


5.30.1. Instalación de Tar

Prepara Tar para su compilación:

./configure --prefix=/tolos

Compilar el paquete:

Make

La compilación está completa. Como se señaló anteriormente, la ejecución del conjunto de pruebas no es obligatoria para las herramientas temporales
en este capítulo. Para ejecutar el conjunto de pruebas de Tar de todos modos, use el siguiente comando:

Make check

Instalar el paquete:

Make install

Los detalles sobre este paquete se encuentran en la Sección 6.58.2, "Contenido de Tar."

5.31. Texinfo-4.13a 

El paquete Texinfo contiene programas usados
 ​​para leer, escribir y convertir información de páginas.
Tiempo estimado de construcción: 0.2 SBU
Espacio requerido en disco: 20 MB

5.31.1. Instalación de Texinfo 

Prepara Texinfo para su compilación:

./configure --prefix=/tolos

Compilar el paquete:

Make

La compilación está completa. Como se señaló anteriormente, la ejecución del conjunto de pruebas no es obligatoria para las herramientas temporales
en este capítulo. Para ejecutar el conjunto de pruebas de Texinfo de todos modos, use el siguiente comando:

Make check

Instalar el paquete:

Make install


Los detalles sobre este paquete se encuentran en la Sección 6.59.2, "Contenido de Texinfo".


5.32. Xz 5.0.1 

El paquete Xz contiene programas para comprimir y descomprimir ficheros. Proporciona capacidades para la lzma y los nuevos formatos de compresión xz. La compresión de archivos de texto con xz se obtiene un porcentaje de compresión mejor que el tradicional gzip o bzip2 comandos.
Tiempo estimado de construcción: 0.3 SBU
Espacio requerido en disco: 14 MB


5.32.1. La instalación de Xz-Utils 

Prepare Xz para su compilación:

./configure --prefix=/tolos

Compilar el paquete:

Make


La compilación está completa. Como se señaló anteriormente, la ejecución del conjunto de pruebas no es obligatoria para las herramientas temporales
en este capítulo. Para ejecutar el conjunto de pruebas Xz todos modos, use el siguiente comando:

Make check

Instalar el paquete:

Make install


Los detalles sobre este paquete se encuentran en la Sección 6.50.2, "Contenido de Xz."

5.33. Stripping

Los pasos de esta sección son opcionales, pero si la partición LFS es pequeña, es conveniente saber que los elementos innecesarios se pueden quitar. Los ejecutables y bibliotecas construidas hasta la fecha contienen alrededor de 70 MB de símbolos de depuración que no sean necesarios.
Eliminar aquellos símbolos con:
strip --strip-debug /tools/lib/*
strip --strip-unneeded /tools/{,s}bin/*

Estos comandos se salta un número de archivos, información que no reconoce el formato de archivo. La mayoría de estos son
scripts en vez de binarios. 
Tenga cuidado de no utilizar - - strip- unneeded  en las bibliotecas. Las estáticas se destruirían y cadena de herramientas del
paquetes que hay que construir todo de nuevo.
Para ahorrar cerca de 25 MB más, retire la documentación:

rm -rf /tools/{,share}/{info,man}

En este punto, usted debe tener por lo menos 850 MB de espacio libre en $ LFS que se pueden utilizar para construir e instalar Glibc en la siguiente fase. Si usted puede construir e instalar Glibc, usted puede construir e instalar el resto también.

5.34. Cambio del propietario

Nota 
Los comandos en el resto de este libro se debe realizar mientras está conectado como usuario root y no 
 como usuario lfs. Además, vuelve a comprobar que $ LFS se encuentra en el entorno de root.


En la actualidad, los $ LFS / tools pertenece al usuario lfs, un usuario que sólo existe en el sistema host. Si los $ LFS / tools se mantiene como está, los archivos son propiedad de un ID de usuario sin tener una cuenta correspondiente. Este
es peligroso porque una cuenta de usuario creada posteriormente podría tener este ID de usuario y la misma será la propietaria del directorio $ LFS / tools 
 y todos los archivos de la misma, exponiendo así a estos archivos a la manipulación maliciosa posible.

Para evitar este problema, se podría añadir el usuario lfs al nuevo sistema LFS más tarde cuando se crea el fichero / etc / passwd, teniendo cuidado de asignar el mismo usuario y de grupo como en el sistema anfitrión. Mejor aún, cambie la propiedad de los $ LFS / tools al usuario root ejecutando el siguiente comando:

chown -R root:root $LFS/tools

Aunque el directorio $ LFS / herramientas se pueden eliminar una vez que el sistema LFS se ha terminado, puede ser contratado para construir sistemas LFS adicionales de la versión del libro mismo. La mejor manera de copia de seguridad de $ LFS / tools es una cuestión de personal preferencia.

Precaución 
Si la intención de mantener las herramientas temporales para el uso en la construcción de los futuros sistemas de LFS, ahora es el momento de volver
para arriba. Comandos siguientes en el capítulo 6 se alteran las herramientas actualmente en vigor, haciéndolos inútiles
para futuras versiones