RPMS

Forums: 

Hola..
Me llamo Sonia. Necesito ayuda con la creacion de RPM.
Encontre al ayuda de Epe que me sirvio mucho para aclarar algunas.
Mi dudas son las sgtes.
Tengo una aplicacion en un directori llamado Tone el mismo cuenta con varios subdirectorios. Tengo un makefile general.
Por lo que pude entender este dir debe ser comprimido y llevado al directorio correspondiente rpm/SOURCES
Y luego debo crear el spec y llevarlo tb al directorio correspondiente rpm/SPECS.
El specs luego lo tengo que ejecutar.
Es necesario que mis fuentes esten en un solo directorio o pueden mantener la estructura original?
En caso de que quiera varias versiones como indicarle que version es y donde se debe guardar?
Necesito guardar macros debo crear otro archivo o agregarlo al que tiene el centos?
Espero que puedan ayudarme. Estoy atenta a la respuesta.
Gracias..
PD. Uso Centos 5.3

Si fuera openSUSE...

No tengo mucha experiencia con centos pero talvez esto te pueda ayudar. He venido usando el build service de openSUSE desde hace ya algún buen tiempo armando algunos paquetes rpm. Con el build service también puedes crear paquetes para otras distribuciones (incluyendo centos). Te facilita un poco el proceso y además publica los rpms resultantes en un repositorio compatible con yum además de compilarte para varias arquitecturas. Puedes encontrarlo en http://build.opensuse.org

En todo caso deberías leer las políticas de empaquetamiento de centos para estar más familiarizada con donde se debe colocar cada tipo de archivo. En general si el software que estás tratando de instalar contiene un archivo configure es solo cuestión de llamar al macro %configure dentro del spec para que te lo configure para su instalación correcta. En caso contrario tienes varias opciones como instalar los binarios en /usr/bin, configuracion en /etc, o si no instalar todo el paquete bajo /opt.

[quote]Es necesario que mis fuentes esten en un solo directorio o pueden mantener la estructura original?[/quote]

Se acostumbra a no topar los fuentes que vienen del desarrollador. Lo que se hace es proveer junto al archivo original de fuentes uno o más archivos .patch para cualquier cambio que tengas que hacer en los fuentes.

[quote]En caso de que quiera varias versiones como indicarle que version es y donde se debe guardar?[/quote]

Podrías manejar el versionamiento de varias maneras. Una manera es solo permitiendo una version del software a la vez (ya que los scripts y archivos de configuración se sobreescribirían). La otra es permitiendo la instalación de varias versiones del mismo software y usar update-alternatives para poder permitir al usuario la selección de la version que está activa al momento (como se lo suele hacer con java y otros). Esto se lo puede lograr renombrando los ejecutables como lo hace python que instala /usr/bin/python, /usr/bin/python2.5, /usr/bin/python2.6, /usr/bin/python3.0 y algunas otras variantes con una combinacion con update-alternatives. Tambien se puede instalar varias versiones como lo hace java en openSUSE en /usr/lib/jvm/java-1.5 y variantes e igualmente usa update-alternatives para escoger una versión activa.

[quote]Necesito guardar macros debo crear otro archivo o agregarlo al que tiene el centos?[/quote]

Estos macros que funcionalidad tendrían? Nunca deberías sobreescribir o modificar un archivo instalado por otro rpm asi que supongo que la respuesta es que debes crear otro archivo.

Espero haber sido claro. Cualquier duda avisame.

http://caih.org

Hola Cesarizu, Gracias por la

Hola Cesarizu,
Gracias por la informacion!!.Voy a leer mas porque sinceramente me siento perdida con este tema.Soy un desastre con Linux.
No se si voy a poder usar el software que dijiste :(. Trabajo con un servidor remoto.Uso Putty acceder al mismo.
Creo que si hay alguna manera masssss tradicional seria buenisimo..
Por ahi lei que es muy interesante y "COMPLEJO"hacer rpm. Pero los quiero aprender a hacer.
Me podes guiar paso a paso?
GRACIASSSS...por las aclaraciones.

RPMS

Hola,

Armar un RPM no es de ninguna manera algo extremadamente complejo, aunque si requiere un poco de atención a los detalles. En resumen se puede decir que necesitas esto:

  1. Un archivo de fuentes, que suele ser un .tar.gz o un .tar.bz2 o el formato que sea tal como lo consigues del desarrollador de programa.
  2. Opcionalmente, archivos .patch para aplicar cualquier cambio necesario sobre los fuentes. Esto se lo hace así para tener bien documentados los cambios que tiene tu paquete frente al paquete original.
  3. Un archivo .spec que indica los pasos a seguir para compilar e instalar el software.

Lo primero que tienes que hacer es anotar todos los pasos que TU haces para instalar el software en una computadora. Por ejemplo para instalar un paquete foo-0.1.tar.gz estos serían talvez los pasos:


tar xf foo-0.1.tar.gz
cd foo-0.1
./configure
make
make install

Obviamente no podrías ejecutar el ultimo paso como un usuario normal si no como root. Si tu paquete no usa autotools para la compilación es bastante probable que tengas que hacer otros pasos.

En el caso de usar autotools de una manera estandar el software se instalará en /usr/local/bin, /usr/local/lib, etc. Si cambias la linea


./configure

por


./configure --prefix=~/

Se instalará en ~/bin, ~/lib, ~/etc . Cada distribución tiene sus políticas especiales de donde se tienen que instalar los paquetes. La mayoría de ellas usan /usr como prefix. Aunque hay otras como gobo linux que instalan en /Programs/paquete/version.

Como tu estás creando un paquete para tu distribucion entonces lo que deberías usar es


tar xf foo-0.1.tar.gz
cd foo-0.1
./configure --prefix=/usr
make
make install

Eso es lo que debe ir en el archivo spec. El archivo spec tiene varias secciones, aqui te pongo uno de ejemplo:


Name: foo
Summary: Paquete foo
Version: 0.1
Release: 1
License: GPL
Vendor: Desarrolladores de foo
Packager: Yo
Source0: %{name}-%version.tar.gz2

%description
Descripcion del paquete

%prep
%setup -q

%build
%configure --prefix=${RPM_BUILD_ROOT}
make

%install
make install

%clean
rm -rf ${RPM_BUILD_ROOT}

%files
%defattr(-,root,root)
%{_bindir}/foo
%{_libdir}/foo.a

Hay varias secciones. Te recomiendo que leeas http://www.rpm.org/max-rpm/ para familiarizarte más con cada sección. Las lineas que empiezan con % son macros como por ejemplo %setup que descomprime el paquete e ingresa al directorio resultante. Al final del archivo spec tambien se define que archivos fueron instalados por "make install" para que pasen a ser parte del rpm resultante.

En el build service de openSUSE necesitarías subir foo-0.1.tar.gz, foo.spec y llamar al proceso de build para ver el resultado.

Bueno espero haberte ayudado un poco. Si aun tienes dudas avisame.

César

http://caih.org

RPM

Hola César,
Gracias por tomarte la molestia y explicarme como lo hiciste.
Hoy voy a crear mis propios paquetes :). Vamos a ver que sale :)
Cualquier duda .... te pregunto.
Que tengas un buen dia :).

RPM

Hola César..

Antes que empieze me olvide de contarte que mi aplicacion es un demonio. No se si esto influye en la creacion
de RPM.

Tengo algunas consultas. Son las sgtes.

1- En estos dias me he fijado que los fuentes de la aplicacion que desarrollamos
estan distribuidas en varios servidores. Esto es un riesgo ya que los mismos pueden ser copiados o modificados
Con los rpms podemos evitar este tipo de problemas? Cuales serian las soluciones?
2- En algunos casos la copia del ejecutable de la aplicacion llevado a otro servidor con las mismas carateristicas
no funciona. En estos casos por lo poco que pueder ver los rpm pueden crear versiones para las distintas distribuciones
en caso de que no funciones el rpm hay posibilidades de compilarde nuevo la aplicacion?

Mis fuentes estan distribuidos de la sgte manera

Directorio Principal Aplicacion
Aplicacion tiene los subdirectorios Lib y Fuentes
*Lib
confreader (subdir de Lib) tiene .c, .o, .h
parserUtils (subdir de Lib) tiene .c, .o, .h
ss7socket (subdir de Lib) tiene .c, .o, .h
*Fuentes
acciones (subdir de Fuentes) tiene .c, .o, .h Estos .o son utilizados para crear librerias dinamicas)
actionlibs (subdir de Fuentes) Estan las librerias dinamicas
Makefile (Make Principal )
Source.c (Fuente principal)
Configuracion.conf(archivo de configuracion con algunos datos ej. puerto, ip)
Source (ejecutable principal)
Source.o (objeto principal)

Por lo que puede encontrar algunos personas sugieren crear directorios para que sea organizado
RPM
BUILD
SOURCES
SPECS
RPMS
SRPMS (es el directorio nuestro paquete rpm pero en su estilo de fuentes?)

BUILD programa descomprimido
SOURCES mi aplicacion comprimida (Tone.tar.gz2)
SPECS mi archivo que lo voy a crear mas abajo
RPMS paquete rpm creado al final del proceso

Mi spec sería el sgte (OBS: se que ha de ser un desastre pero vale la pena el intento :))

Name: foo
Summary: Paquete foo
Version: 0.1
Release: 1
License: GPL
Vendor: Desarrolladores de foo
Packager: Yo
Source0: %{name}-%version.tar.gz2

%description
Descripcion del paquete

%prep
%setup -q -a 0 ?? Si el debe descomprimir en BUILD como lo indico?

%build
make

La opcion %build deberia ejecutar Makefile(Make Principal )? En ese caso es necesario tener la estructura original
de los fuentes ya que le makefile depende de ello.

%install
mkdir Tone
cd tone
mkdir Ejecutable
mkdir Librerias
cp BUILD/Aplicaciones/Fuentes/Source ..../Ejecutable (copiar el ejecutable)
cp BUILD/Aplicaciones/Fuentes/Configuracion.conf ..../Ejecutable (copiar el archivo de configuracion)
cp BUILD/Aplicaciones/Fuentes/actionlibs .../Librerias(copiar las librerias completas)

Como uso librerias compartidas creo en el directorio /etc/ld.so.conf. un archivo con el path de
donde va encontrar las librerias dinamicas
sh scriptPath.sh (supongamos que el script ya esta echo)

%post
ldconfig (por las librerias dinamicas)

%clean
rm -rf Tone

Si supuessstamente esto esta bien despues ejecutaria

CD RPM
cd SPECS
rpmbuild -ba vertv.spec

La opción -ba especifica que construya el paquete y el paquete fuente src-rpm del programa?

Se que faltan opciones pero creo que para empezar esta bien :)

Desde ya MUCHAS GRACIAS por ayudarme.

Disculpa la tardanza en

Disculpa la tardanza en responder. Recientemente me mude y no tuve tiempo para entrar aquí. Más abajo te pongo mis comentarios

[quote]
Antes que empieze me olvide de contarte que mi aplicacion es un demonio. No se si esto influye en la creacion
de RPM.
[/quote]

Bueno en ese caso tienes que tener bien claro como se registra un demonio en tu distribución. Generalmente se crea un archivo /etc/init.d/nombredelservicio pero de ahi depende de la distribucion mucho para saber como registrarlo para que pueda ser iniciado automáticamente y las dependencias. En openSUSE se crea un archivo /sbin/rcnombredelservicio con la información necesaria.

[quote]
1- En estos dias me he fijado que los fuentes de la aplicacion que desarrollamos
estan distribuidas en varios servidores. Esto es un riesgo ya que los mismos pueden ser copiados o modificados
Con los rpms podemos evitar este tipo de problemas? Cuales serian las soluciones?
[/quote]

Es un software opensource? Si es opensource puedes concentrar el desarrollo en sorceforge o google code o tu preferido o en el caso de usar un sistema descentralizado puedes usar github o algun servicio similar. Para poder asegurarte que el código que vas a compilar es lo que esperas tendrías que implementar un sistema de control de acceso a los fuentes para saber quien cambia que o donde. Ahi el mismo sistema que usas para control de versiones te puede ayudar (subversion, bazaar, git).

[quote]
2- En algunos casos la copia del ejecutable de la aplicacion llevado a otro servidor con las mismas carateristicas
no funciona. En estos casos por lo poco que pueder ver los rpm pueden crear versiones para las distintas distribuciones
en caso de que no funciones el rpm hay posibilidades de compilarde nuevo la aplicacion?
[/quote]

Digamos que armas un paquete para openSUSE 11.1 i586 entonces debería correr en cualquier computadora que tenga instalada la misma distribución con la misma arquitectura. No deberías necesitar recompilar nunca para una computadora en específico a menos que esa computadora tenga paquetes no estandares o compilados a mano de los que dependa tu aplicación. Si no es ese el caso y aun tienes problemas deberías revisar cual es la fuente del problema que puede ser por compilar dinamicamente o estaticamente contra alguna librería no estandar de la distribución. Es bien importante que tengas muy claro cuales son las librerías de la distribución que necesitas y que versiones. Esto debería ser parte del archivo .spec.

[quote]
Mis fuentes estan distribuidos de la sgte manera

Directorio Principal Aplicacion
Aplicacion tiene los subdirectorios Lib y Fuentes
*Lib
confreader (subdir de Lib) tiene .c, .o, .h
parserUtils (subdir de Lib) tiene .c, .o, .h
ss7socket (subdir de Lib) tiene .c, .o, .h
*Fuentes
acciones (subdir de Fuentes) tiene .c, .o, .h Estos .o son utilizados para crear librerias dinamicas)
actionlibs (subdir de Fuentes) Estan las librerias dinamicas
Makefile (Make Principal )
Source.c (Fuente principal)
Configuracion.conf(archivo de configuracion con algunos datos ej. puerto, ip)
Source (ejecutable principal)
Source.o (objeto principal)

Por lo que puede encontrar algunos personas sugieren crear directorios para que sea organizado
RPM
BUILD
SOURCES
SPECS
RPMS
SRPMS (es el directorio nuestro paquete rpm pero en su estilo de fuentes?)

BUILD programa descomprimido
SOURCES mi aplicacion comprimida (Tone.tar.gz2)
SPECS mi archivo que lo voy a crear mas abajo
RPMS paquete rpm creado al final del proceso

Mi spec sería el sgte (OBS: se que ha de ser un desastre pero vale la pena el intento Smiling)

Name: foo
Summary: Paquete foo
Version: 0.1
Release: 1
License: GPL
Vendor: Desarrolladores de foo
Packager: Yo
Source0: %{name}-%version.tar.gz2

%description
Descripcion del paquete

%prep
%setup -q -a 0 ?? Si el debe descomprimir en BUILD como lo indico?
[/quote]

Esto lo va a hacer automáticamente si no me equivoco, toma los sources de SOURCES y los descomprime en ${RPM_BUILD_ROOT}. Toma en cuenta que ${RPM_BUILD_ROOT} podría ser cualquier directorio entonces tienes que pensar que estas trabajando en un directorio cualquiera.

[quote]
%build
make

La opcion %build deberia ejecutar Makefile(Make Principal )? En ese caso es necesario tener la estructura original
de los fuentes ya que le makefile depende de ello.

%install
mkdir Tone
cd tone
mkdir Ejecutable
mkdir Librerias
cp BUILD/Aplicaciones/Fuentes/Source ..../Ejecutable (copiar el ejecutable)
cp BUILD/Aplicaciones/Fuentes/Configuracion.conf ..../Ejecutable (copiar el archivo de configuracion)
cp BUILD/Aplicaciones/Fuentes/actionlibs .../Librerias(copiar las librerias completas)
[/quote]

En este punto puedes agregar comandos de shell para irte guiando. Por ejemplo trata de usar pwd o ls para saber en que directorio estas y cuales son los contenidos. Al momento de ejecutar la compilación va a aparecer cualquier salida como parte de la salida normal del build.

[quote]
Como uso librerias compartidas creo en el directorio /etc/ld.so.conf. un archivo con el path de
donde va encontrar las librerias dinamicas
sh scriptPath.sh (supongamos que el script ya esta echo)

%post
ldconfig (por las librerias dinamicas)

%clean
rm -rf Tone

Si supuessstamente esto esta bien despues ejecutaria

CD RPM
cd SPECS
rpmbuild -ba vertv.spec

La opción -ba especifica que construya el paquete y el paquete fuente src-rpm del programa?
[/quote]

Te va a generar los dos paquetes un .src.rpm y un .rpm de tu propia arquitectura.

[quote]
Se que faltan opciones pero creo que para empezar esta bien Smiling

Desde ya MUCHAS GRACIAS por ayudarme.
[/quote]

De ahí en general creo que vas por buen camino solo hay que pulir un poco el spec.

http://caih.org