lunes, 18 de octubre de 2010

Instalando aplicaciones en UNIX/Linux desde las fuentes.

Hace unos días instalaba en una de mis workstations el invaluable Midnight Commander, me gusta porque me ahorra bastante trabajo a la hora sobre todo de editar mis configuraciones (todavía reverencio a vi, porque es el histórico pero flojear de tanto en tanto no es pecado, y no hablo solo de ediciones, de hecho mc es una navaja suiza, se lo agradezco mas al autor que gnome). Me descargé las fuentes, lo compile y lo instalé y mientras el compilador arrojaba línea tras línea a mi pantalla un colega de los de Windows me preguntó ¿que haces? -- instalo una aplicación -- ¿y que es eso que pasa? -- es el compilador trabajando -- le expliqué y le describí en pocas palabras de que iba todo, pero si no lo han hecho nunca no van a entender, así que aquí les va ...
Para el mundo Windows es cuando menos raro instalar aplicaciones que no sean distribuidas en formato binario. En el otro extremo, Unix nació distribuyendo sus aplicaciones y el sistema mismo, a través de sus fuentes y todavía hoy es así. No quiere decir esto que no se instalen aplicaciones desde binarios sip, también, de hecho con algunas es preferible hacerlo (desde binarios) sino traten de instalar OpenOffice desde las fuentes en cualquier Linux o FreeBSD para que vean que probablemente después de 5 o 6 horas de compilación chances hay que los bote sin muchas explicaciones (no se porque, pero he instalado KDE completo desde las fuentes en FreeBSD y nunca dió problemas, en aquella época (y en aquella máquina) fueron como 12 hrs de chamba, pero salió más que bien). Pero si me dan a escoger, prefiero las fuentes.
Y es que instalar desde las fuentes tienen sus bondades. Para empezar puedes tunear las aplicaciones tanto como sea posible y finalmente hacer que sean específicas para AMD Athlon  Core 2 duo o lo que sea que tengas debajo del cofre, algo que no puedes hacer con los binarios o paquetes, que son precompilados con opciones conservadoras, tratando de que corran en el mayor número de sistemas. A veces la aplicación te obliga (GNU por ejemplo prohibe la distribución en binarios), a veces simplemente quieres ver el código y asegurarte de que no te van a colar un backdoor o cualquier fenómeno sin que sepas o cuando menos quieres tener la seguridad de que alguien lo hará por ti. Además (de nuevo), el mismo proceso de compilación depende del hardware que subyace, de modo que cuando instalas desde las fuentes obtienes un rendimiento en tu aplicación que no puedes lograr usando binarios, y eso es más que una ventaja.
Pero no todo son bondades, al menos en Linux, (FreeBSD tiene el sistema de ports que es una chulada (y Gentoo que tiene el portage)), hay dos puntos donde las fuentes se traban, ni mantienen el control de versiones, ni entienden de dependencias (el llamado dependency tracking) y son dos cosas que deberás atender manualmente tu mismo en caso de que las uses.
Habitualmente las fuentes se distribuyen en un formato llamado tarball, que no es más que un contenedor que toma todos los archivos que componen las fuentes que dependiendo de la aplicación pueden ser unos pocos o varios muchos y lo convierte en una entidad única para su distribución (amén de ser comprimidas con cualquier utilidad disponible). La extension que lo identifica (por convención, en Unix no existen las extensiones) es .tar y .tar.gz si es comprimida con gzip o .tar.bz2 si usas bzip2 (nop, tar no comprime). La figura ilustra la idea. 

El caso es entonces que deberás (primero) descargar (y por las dudas revisar lo que descargas con cualquier verificador de sumas, como md5sum.), extraer y descomprimir (el comando para manipular tarballs es tar, y te doy los detalles mas abajo en el vídeo). Debería quedarte algo así al final (estoy usando el mismo ejemplo del Midnight Commander):


Luego de eso deberías leerte el README (o INSTALL) que trae las instrucciones que debes seguir desde el punto en el que estás (y que casi nunca lo leemos, es la verdad, si te saltas este paso luego cuando te de un problema lo que sigue no te quejes). Entonces estás listo para configurar o modificar tu makefile en este caso usas el configure que va a cerciorarse de que todo este en orden y presente en tu sistema, que versión de compilador tienes, que librerías hay disponibles etc. y finalmente (atenido a su revisión) generara el makefile que no es más que el archivo de configuración que usará tu utilidad  make para hacer el proceso de compilación, make hará el trabajo por ti guiándose por el makefile y tendrás como resultado tu ejecutable disponible para ser usado desde el directorio local. Lo que sigue entonces es la instalación, que no es más que poner a disposición del sistema completo la aplicación que acabas de compilar, amén de poner ciertas cosas en su sitio como los manuales (la página del man), las librerías correspondientes en /usr/lib, los enlaces del ejecutable en /bin, /usr/bin, /usr/local/bin o donde sea que vaya de manera que todos los usuarios puedan usarlo (en freebsd deberás hacer un rehash antes de ejecutarlo, porque usa por defecto tcsh y no se entera de lo que sucedió, así que lo haces releer sus tablas de hash, si les interesa esta en la página del man de csh).
En general el procedimiento es así para casi todos los Unix. En otra entrada les explicaré como funciona el arbol de ports en FreeBSD, porque creo que es (hablando de fuentes) una de las mejores soluciones que existen dentro de Unix (incluido SystemV y BSD), de hecho resuelve los problemas de los que hablamos arriba acerca del control de versiones y del control de dependencias .El procedimiento del vídeo está hecho en un CentOS de pruebas que tengo, solo para propósitos didácticos. Un consejo, luego de que instalen algo desde las fuentes, no borren el directorio, regularmente incluye un archivo  makeuninstall o makedeinstall, los nombres son bien obvios, no les vayan a dar trabajo las desinstaladas. Les dejo con el vídeo, espero les resulte útil, si tienen dudas pregunten, la semana recién empieza así que muy buen inicio y hasta el próximo.