2- Cómo usar mock para compilar paquetes?

Imagen de Epe

Supongamos tenemos la misma situación que en este post: http://www.ecualug.org/2012/03/06/comos/como_actualizar_squid_en_centos_5x_how_update_squid_centos_5x_0

Ahora, queremos compilar el paquete squid-3.1.18-1.el5.src.rpm en centos-6 para 32 y para 64 bits, cómo hacemos? Bueno, lo primero es que nos convertimos en el usuario mock:

su - mock
whoami

Luego, desde el mismo usuario mock, nos bajamos el paquete de squid en formato src.rpm :

wget http://www.jur-linux.com/rpms/el-updates/5Client/SRPMS/squid-3.1.18-1.el5.src.rpm

Esto es un ejemplo, no es que este sea el paquete perfecto para compilar en centos-6 ni que tengas que hacerlo, es un simple y vulgar ejemplo, una vez bajado le compilamos así:

mock -v -r epel-6-i386 squid-3.1.18-1.el5.src.rpm

la -v significa "verbose". Este switch es opcional, si no le pones, no te sacará tanta info, será más suscinto todo.

con -r especifico la arquitectura y distro para la que quiero compilar, epel es para redhat, fedora para fedora, etc.. puedes ver la lista de arquitecturas que compila mock viendo en /etc/mock, te fijas que son varias? En este caso estoy compilando para centos-6 (epel-6) de 32bits (i386), si quisiera podría escoger una de las otras arquitecturas listadas en mock y compilar lo mismo para ellas.

Ahora el mock bajará todas las dependencias y las dejará en caché (por si le tiene que usar para otras cosas luego).. se demorará bajando un poco las dependencias, pero no tanto, con los 10mbit/s que tienes a internet, eso será un paseo.

Al finalizar de compilar verás que dice así:


INFO: Done(squid-3.1.18-1.el5.src.rpm) Config(epel-6-i386) 4 minutes 46 seconds
INFO: Results and/or logs in: /var/lib/mock/epel-6-i386/result
State Changed: end
DEBUG: kill orphans

y en efecto si miras en: /var/lib/mock/epel-6-i386/result te dirá algo así:

[mock@acer ~]$ ls /var/lib/mock/epel-6-i386/result
build.log squid-3.1.18-1.el6.i686.rpm squid-debuginfo-3.1.18-1.el6.i686.rpm
root.log squid-3.1.18-1.el6.src.rpm state.log

te fijas? ahi están los rpm compiladitos del src.rpm original!!

Te advierto algo, si compilas otra cosa para epel-6-i386, el sistema te borrará los contenidos del directorio "result" este... así que si quieres preservarle, le pones para otro lado, pero ahi no le dejes o lo borra.

Y si ahora quiero compilarle para 64bits? Ah pues simple, ahi mismo ejecuto:

mock -v -r epel-6-x86_64 squid-3.1.18-1.el5.src.rpm

y esperas que bajé y cree su caché (la primera vez será demorado, definitivamente) y luego al acabar, en el directorio result, ahi estará:


DEBUG: Child return code was: 0
INFO: Done(squid-3.1.18-1.el5.src.rpm) Config(epel-6-x86_64) 4 minutes 56 seconds
INFO: Results and/or logs in: /var/lib/mock/epel-6-x86_64/result
State Changed: end
DEBUG: kill orphans

mírale aqui:

[mock@acer ~]$ ls /var/lib/mock/epel-6-x86_64/result
build.log squid-3.1.18-1.el6.x86_64.rpm
root.log squid-debuginfo-3.1.18-1.el6.x86_64.rpm
squid-3.1.18-1.el6.src.rpm state.log

y listo..

y si le quieres para centos-5 de 64bits? y para centos5 de 32 bits? Lo mismo verdad? Sólo que en -r pones:


-r epel-5-x86_64

o

-r epel-5-i386

No hay que tener centos-5 instalado, con tener centos-6 de 64bits es suficiente... recuerda:

  1. mock se crea su propio ambiente (jaula) para compilar por lo que no recae en los paquetes externos de tu centos
  2. mock te compila para 64 y 32 bits, si el sistema es de 64bits. Si el sistema es de 32bits, entonces mock te compilará solamente 32bits.

La idea a la final es que tengas un src.rpm que compile para alguna versión de CentOS o Fedora, de alguna forma tienes que lograrle ese src.rpm, y luego ese src.rpm le compilas para las diversas versiones fácilmente con el mock.

Por ejemplo, y si yo no quiero el squid 3.1.18 sino una versión más moderna, por ejemplo la 3.1.19 que veo en el sitio del squid? Ah bien, de eso te explicaré en el siguiente post... pero en resumen verás que será obtener un src.rpm para poder construir un rpm.