====== 206.1 Make and install programs from source ======
Pertenece a [[informatica:certificaciones:lpic:lpic-2:206_system_maintenance|LPI Topic 206: System Maintenance]]
* **Weight**: 2
* **Description**: Candidates should be able to build and install an executable program from source. This objective includes being able to unpack a file of sources.
* **Key Knowledge Areas**:
* Unpack source code using common compression and archive utilities
* Understand basics of invoking make to compile programs
* Apply parameters to a configure script
* Know where sources are stored by default
* **Terms and Utilities**:
* ''/usr/src/''
* ''gunzip''
* ''gzip''
* ''bzip2''
* ''xz''
* ''tar''
* ''configure''
* ''make''
* ''uname''
* ''install''
* ''patch''
===== Introducción =====
Los programas que se utilizan en informática generalmente pertenecen a dos familias:
* **Programas interpretados**: se escriben en un lenguaje de programación (perl, shell, etc) y son llamados por un interprete cada ejecución.
* **Programas compilados**: se escriben en un lenguaje de programación (Pascal, C, C++) y a continuación pasa a un compilador. El compilador lee el código del programa y genera un ejecutable.
¿Cuándo hay que compilar? La mayoría de las ocasiones se proporcionan las aplicaciones en forma de paquete ya compilado y listo para su uso.
Sin embargo, otras ocasiones necesita una versión más reciente de una aplicación o configurada con opciones
personalizadas. En este caso, **debemos compilar e instalar el programa desde el código fuente**.
===== Procedimiento de compilación GNU =====
==== Obtención de las fuentes ====
Descargaremos las fuentes de los ficheros desde el sitio en el que se encuentren.
Generalmente en las webs de los programas obtendremos los enlaces de descarga correspondientes. Con la herramienta ''wget'' podemos descargar desde la línea de comandos:
wget http://apache.rediris.es/httpd/httpd-2.2.29.tar.gz
==== Desempaquetar los codigos fuentes ====
Las fuentes de los programas suelen venir empaquetadas y compprimidas en diferentes formatos.
Utilizaremos ''tar'' o las herramientas especificas de cada formato
GZIP:
* ''tar zxf httpd-2.2.29.tar.gz''
* ''gunzip httpd-2.2.29.tar.gz''
Bzip2:
* ''tar jxf httpd-2.2.29.tar.bz2''
* ''bunzip2 httpd-2.2.29.tar.bz2''
XZ:
* ''tar Jxf httpd-2.2.29.tar.bz2''
* ''unxz httpd-2.2.29.tar.bz2''
El archivo resultante lo desempaquetamos con ''tar'':
tar xf httpd-2.2.29.tar
==== Configuración de la compilación ====
La compilación tiene una serie de requisitos:
* Existencia de un compilador.
* Presencia de las bibliotecas necesarias.
* Haber generado el archivo ''Makefile''.
El archivo ''Makefile'' suele estar disponible en la carpeta de las fuentes.
El procedimiento habitual tiene los siguientes pasos:
- ''tar zxvf snow-2.0.3.tar.gz''
- ''cd snow-2.0.3''
- ''./configure''
- ''make''
- ''su''
- ''make install''
El paquete ''build-essential'' incluye los programas y bibliotecas básicos para realizar la compilación de programas en Linux. No viene instalado por defecto.
''.configure'' lo que hace es chequear las dependencias y adapta el código fuente a la arquitectura de la máquina. Nos instalará el programa en la ubicación definida por defecto (normalmente ''/usr/local/'').
''./configure –prefix=/usr/local/httpd'' nos permite definir otra ruta de instalación.
''./configure –help'' nos muestra todos los posibles argumentos de configuración.
==== Compilación ====
''make'' utiiliza los archivos ''Makefile'' creados por ''.configure'' para hacer la instalación
==== Instalación de binarios ====
make install
Necesario ejecutar el comando de instalación con permisos de administrador.
De acuerdo al estándar GNU, la aplicación se instalará en el directorio ''/usr/local'' por defecto.
Desinstalación de binarios:
make uninstall
Limpieza de elementos compilados:
make clean
Limpieza de elementos compilados y archivos de configuración (Makefile):
make mrproper
===== Ejemplo compilación e instalación de nmap =====
Obtenemos las fuentes de https://nmap.org/download.html
wget https://nmap.org/dist/nmap-7.91.tar.bz2
Descomprimimos:
tar xjvf nmap-7.91.tar.bz2
Obtenemos una carpeta llamada ''nmap-7.70''
Entramos en la carpeta y ejecutamos el script ''configure'':
./configure
Esto revisará las dependencias y generará el archivo ''Makefile''. Si falta algo para poder realizar la configuración, dará un error indicando el problema.
Realizamos la compilación:
make
Nos convertimos en usuario con privilegios:
su
Finalmente realizamos la instalación en el sistema:
make install
===== Aplicación de parches =====
=== diff ===
''diff'': comando que compara 2 archivos y muestra las diferencias entre ellos. Podemos utilizar dicho
comando para generar un parche.
diff programa1.c programa2.c > patch-x.y.z
=== patch ===
Comando que nos permite aplicar o retirar un parche sobre un código fuente.
Aplicar parche:
patch –pnum < path-x.y.z
Retiramos parche:
path –pnum –R < path-x.y.z
* ''-pnum'': se utiliza cuando hay parches en directorios diferentes, sirve para omitir las / y la ruta superior.
===== Tests =====
**Which command would you use to apply a diff file to an original?**
* ''patch > diff-file''
* ''patch < diff-file'' (**Solución**)
* ''patch %%<<%% diff-file''
* ''cat diff-file %%>>%% kernel''
* ''cat diff-file %%<<%% kernel''
**If the current directory is /root and the kernel source is located in /usr/src/linux, which of the following commands should be used to apply the patch /tmp/foopatch?**
* ''cat /tmp/foopatch | patch -p0''
* ''cd /usr/src/linux; cat/tmp/foopatch | patch -p0''
* ''cd /usr/src/linux; cat/tmp/foopatch | patch''
* ''cd /usr/src/linux; patch -p1 /tmp/foopatch''