SUSE Build Tutorial
Contenido
Introducción
Este documento es un primer contacto con la estructura del sistema SUSE build y un tutorial de cómo construir paquetes RPM en SUSE Linux. Esta información le ayudará a mantener su propio entorno de desarrollo Suse build temporal. Las cuatro primeras partes de este documento ofrecen una visión general de las instrucciones seguidas de ejemplos para que pueda practicar.
Prerequisitos
Debería tener experiencia en la creación de RPMs. Este documento no es un sustituto de la documentación sobre RPM. Ya hay demasiados HOWTOs,guías y libros sobre este tema, consulte recursos con enlaces relacionados con RPM.
También debería mostrar experiencia en herramientas relacionadas con PGP, especialmente GNU Privacy Guard (gpg) ya que es la implementación más utilizada de OpenPGP. Se dará cuenta de por qué es importante PGP posteriormente cuando comentemos la firma de los paquetes. Para firmar paquetes necesita su propia clave PGP antes de empezar a utilizar el entorno SUSE build.
Y, por supuesto, debería estar familiarizado con el entorno del código fuente en el que está escrito su proyecto que forma el paquete. La estructura SUSE build funciona solucionando algunos errores comunes efectuados por programadores de proyectos que manejan make, autoconf, imake u otros mecanismos de configuración de código fuente. Se agradece algo de ayuda cuando se trabaja con paquetes.
FYI: Stefan Hundhammer ha creado una presentación un buen repaso acerca de make y autoconf bajo las directrices de GFDL. Puede descargar la presentación desde aquí.
Requisitos
Es simple. Necesitas 3GB de espacio en el disco duro y nuestra herramienta de creación, y2pmbuild, actualmente reemplazada por build. Eso es todo.
Necesitas 3GB de espacio en el disco duro por que la estructura de instalación de SUSE está usando una instalación separada de Linux en tu disco duro, como el entorno de creación de tus paquetes. Este ambiente aislado tiene una ventaja grande: La constitución de paquetes no presenta conflictos con tu instalación actual de linux. La única desventaja es que necesitas 3GB de (temporal) espacio del dico duro para cada entorno de creación. Pero con la capacidad que actualmente tienen los discos duros esto no debería ser un problema.
La herramienta de creación (build) instala un entorno de creación en una localización dada y luego crea el paquete en ese entorno. La creación de entornos consiste en un sistema base y en cualquier paquete que espesifiques en el archivo RPM pec.
Flujo de trabajo
Los siguientes pasos perfilan un flujo de trabajo normal para construir un paquete. Desde luego en un caso real usted podría equivocarser en algún paso y tener que repetirlo hasta que esto no falle más. Esto solo es un ejemplo de lo que intentamos hacer.
Primer Paso - Requisitos para la Instalación
Instale los siguiente paquetes desde su instalación de SUSE usando YaST, si es que no los tiene ya instalados:
- y2pmbuild - reemplazado por build
- bzip2
- gpg
Paso Dos - Configure build
Configure la herramienta build (build). hay varias opciones que tiene que tener en cuenta. Por ejemplo:
- Donde conseguir los paquetes RPM para configurar el ambiente de construcción
- Cuál es el nombre base para construir en el directorio root
- Dónde están almacenados los paquetes RPM
y cosas como esas..
Paso Tres - Creando el directorio fuente
Cree un directorio en algún sitio que sea accesible a usted y al root. Este será el lugar donde usted pondrá sus archivos para construir el paquete. Usted puede usar cualquier directorio que desee. Sin embargo, este debe ser accesible para usted y el root, porque sólo él puede comenzar el sistema en ambiente para construir. Pero usted puede no querer trabajar como root todo el tiempo sobre el paquete, entonces necesita un directo compartido.
Paso Cuatro - Obtener los archivos para el proyecto
Obtenga los archivos necesarios para la construcción del proyecto. La mayor parte de las distros proporcionan archivos de la fuente en tarballs comprimidos.
Paso Cinco - Creando el archivo específico
Ahora que usted tiene la fuente puede seguir el proceso habitual de creación de RPM. Cree un archivo específico para el paquete. Usted puede encontrar la información relacionada sobre archivos de especificación en el capítulo 59494 de archivo de especificación.
Paso Seis - Creando el paquete
Tras crear el fichero RPM spec, es hora de ver si se construye el paquete. Cambia a una cuenta root y ponte en el directorio donde están tu fichero spec, las fuentes y los parches. A continuación, arranca build.
Paso Siete - Testea el paquete
Una vez completada con exito la construcción, y2pmbuild guardará los paquetes creados en su repositorio. Este repositorio es un repositorio de YaST plain-cache que puedes utilizar para la instalación. También, el repositorio y2pmbuild será usado como el repositorio primario para tu siguiente construcción. Esto asegura que tus recien construidos paquetes siempre serán usados en las próximas construcciones que dependan de ellos.
Ficheros spec
Los ficheros RPM spec deberían ser escritos de acuerdo a openSUSE Package Conventions. Como este es un tema lo suficientemente complejo por si mismo, hay documentación específica sobre ello. Por favor, sigue este Documento fielmente cuando desarrolles tu fichero spec.
Puedes encontrar algunos ejemplos de ficheros spec para diferentes paquetes en the Build Service SVN.
y2pmbuild Features (obsoleted by build Features)
Configuration
y2pmbuild Environment Variables
- BUILD_DIST
The Distribution you want to build for.
BUILD_DIST=10.1-i386 y2pmbuild
y2pmbuild Configuration Files
y2pmbuild configuration files are kept in
/etc/y2pmbuild
below that directory you have a common configuration file for all distributions
/etc/y2pmbuild/dists_common
and a directory that can have a distribution specific configuration file.
/etc/y2pmbuild/dists/DISTRONAME/
y2pmbuild first reads the common configuration file and then the distribution specific ones.
The configuration files are in fact shell scripts that are parsed by y2pmbuild. However, please do not use any special shell features so the files can still be parsed by other programs. Comments may be placed anywhere within the file (except within quotes). Comments begin with the # character and end at the end of the line. Empty lines, and lines containing only whitespace or comments are ignored. Heres a list of variables/values and their meaning.
How to setup the build root:
- url_*
You can specify various types of URLs for RPM package sources. The URLs can be any type supported by YaST such as FTP, HTTP, Samba/CIFS, NFS, CD, DVD and the local filesystem.
url_opensuse="file:/space/dist/opensuse/10.0/" url_kde4="http://opensuse.org/projects/kde4/packages/" url_gcc5="ftp://ftp.gcc.gnu.org/pub/releases/gcc5/RPMS/"
- add_sources
The installation sources to use for the build root setup is specified by:
add_sources="opensuse kde4 gcc5"
- buildrootbase
The buildrootbase tag specifies the location of the actual build directory. The final name will be $buildrootbase.$USER.$BUILD_DIST
buildrootbase="/space/build"
Package signing:
- rpm_sign_name
The identity you want to use to sign the RPM packages with.
rpm_sign_name="Tux Builder <tux@example.com>"
or just
rpm_sign_name="tux@example.com"
- rpm_sign_key
The key file to use for signing.
rpm_sign_key="/etc/y2pmbuild/signkey.asc"
Create the file with
gpg -a --export tux@example.com > signkey.asc gpg -a --export-secret-key tux@example.com >> signkey.asc
How to handle built RPM files:
- repository
The directory where to store built rpms.
repository="/space/done/$BUILD_DIST"
- regen_repository
To be able to use the built RPMs as installation source (e.g. for your next build) the directory with the RPM files has to be transformed into a installation source YaST understands. For this purpose you can use the genIS_PLAINcache (plain), createrepo (yum) or the create_package_descr (ul) tool. Support for the latter is currently broken though.
regen_repository="plain yum"
For details about YaST installation sources see Installation Sources
You can also give extra files y2pmbuild should copy into the build environment after its set up. Here you have a distribution specific directories. Note that rsync is used so you may want to think about when to append slashes to directory names.
/etc/y2pmbuild/files/DISTRONAME/
- extra_copy
extra directories that will be copied to the buildroot after packages have been installed.
extra_copy="/etc/profile"
Características de build
Son necesarias 3 fases para correr build:
- Montar el DVD de SuSE Linux (o copiar su contenido en un nuevo directorio)
- Especificar las variables de entorno.
- llamar a build.
Variables de entorno de build
- BUILD_RPMS
Aquí es donde se espera que estén los RPMS de SuSE Linux: si el solamente se ha montado el DVD de SuSE Linux, esta variable debería fijarse a <punto_montaje_DVD>/suse. Si el DVD ha sido copiado en un directorio, esta variable debería fijarse a <ese_directorio>/suse.
El valor por defecto de BUILD_RPMS es /media/dvd/suse
- BUILD_ROOT
El directorio raiz aislado donde el rpm será construido.
El valor por defecto de BUILD_BOOT es /var/tmp/build-root
- BUILD_RPM_BUILD_STAGE
Estas son las opciones actuales que serán pasadas a rpmbuild (ver la pagina man de rpmbuild para tener una lista completa de dichas opciones).
El valor por defecto de BUILD_RPM_BUILD_STAGE es '-ba' (construye el binario y el paguete fuente tras hacer las fases %prep, %build y %install).
Ejemplos
Aqui se muestran algunos ejemplos del mundo real para direntes grupos de paquetes y características especificas de paquetes.
Paquetes KDE
BuildRequires: kdelibs3-devel update-desktop-files
Name: kvpnc License: GPL Group: Productivity/Networking/System Summary: GUI frontend for openswan and vpnc Version: 0.7.2 Release: 1 URL: http://home.gna.org/kvpnc/ BuildRoot: %{_tmppath}/%{name}-%{version}-build Source0: %name-%{version}.tar.bz2
%description The application can create configurations for various kinds of VPN connections. You should install also the "vpnc" or "openswan" package.
%prep # extract the source and go into the kvpnc-0.7.2 directory %setup -q # source the standard build enviroment as defined in kdelibs3 package . /etc/opt/kde3/common_options # replace the admin/ folder with the version from kdelibs3 (will work for sure with # current autoconf and automake) and create Makefile.in and configure script. update_admin --no-unsermake
%build # source the standard build enviroment as defined in kdelibs3 package . /etc/opt/kde3/common_options ./configure $configkde --disable-final # do compile with the number of jobs given to the --jobs parameter of the build script. make %{?jobs:-j%jobs}
%install iconv -f iso8859-1 -t utf-8 src/kvpnc.desktop > w && mv w src/kvpnc.desktop # install all files into the BuildRoot make DESTDIR=$RPM_BUILD_ROOT install rm -rf $RPM_BUILD_ROOT/opt/kde3/share/doc/HTML/kvpnc # updates the .desktop file. It applys additional translations and Categories for a # proper position in the KDE menu %suse_update_desktop_file %name System Network # does find all localisation files and adds proper database attributes to them %find_lang %name
%clean # clean up the hard disc after build rm -rf $RPM_BUILD_ROOT
%files -f %name.lang %defattr(-,root,root) %dir /opt/kde3/share/icons/hicolor/16x16/apps %dir /opt/kde3/share/icons/hicolor/32x32/apps /opt/kde3/bin/kvpnc /opt/kde3/share/appl*/*/kvpnc.desktop /opt/kde3/share/apps/kvpnc /opt/kde3/share/icons/*/*/*/kvpnc*.png
Paquetes GNOME
# the following line is not a remark, but contains a macro for all # needed packages for a standard Gnome application: # neededforbuild gnome2-devel-packages
Name: gwget %define prefix /opt/gnome %define sysconfdir /etc%{prefix} License: GPL Group: Productivity/Networking/Web/Utilities Requires: wget Version: 0.95 Release: 1 Summary: Front-end for wget written in GTK+ URL: http://gnome.org/projects/gwget/ # the packages filesystem and gconf2 needs to be installed, before this # package gets installed. Otherwise the script in %post would fail. PreReq: filesystem gconf2 Source: %{name}-%{version}.tar.bz2 Source: %name.desktop BuildRoot: %{_tmppath}/%{name}-%{version}-build
%description Front-end for wget written in GTK+
# extract source tar ball %prep %setup -n %{_name}-%{version}
%build # use global compile flags and run configure script CFLAGS="$RPM_OPT_FLAGS" \ ./configure \ --prefix=%prefix \ --libexecdir=%prefix/lib/gwget \ --libdir=%prefix/%_lib \ --sysconfdir=%sysconfdir \ --datadir=%prefix/share \ --localstatedir=/var/lib \ --mandir=%{_mandir} \ --disable-schemas-install # do compile make
%install # install all files make DESTDIR=$RPM_BUILD_ROOT install # create file list of localized files into file %name.lang %find_lang %{name} # install the gwget.desktop file from %Source1 and apply Catgories (Network and FileTransfer) %suse_update_desktop_file -i gwget Network FileTransfer
# the calls which does get called after installing this package %post # update the gconf database export GCONF_CONFIG_SOURCE=`opt/gnome/bin/gconftool-2 --get-default-source` opt/gnome/bin/gconftool-2 --makefile-install-rule etc/opt/gnome/gconf/schemas/gwget.schemas >/dev/null
%clean # clean up the hard disc after build rm -rf $RPM_BUILD_ROOT
%files -f %{name}.lang %defattr(-,root,root) # the files to package
Paquetes Perl
Los paquetes de Perl son sencillos y bastante similares al paquete porque ya casi preparados para el archivo CPAN.
Name: perl-Curses Version: 1.12 Release: 1 # define the name from CPAN %define cpan_name Curses # do this package was known as "perl_cur" in old times. So we do need to Provide and Obsolete # this package. YaST will install this package during update instead of the old one in this way. Provides: %cpan_name # we better require the exact perl version, which was used to create this package Requires: perl = %{perl_version} Group: Development/Libraries/Perl License: Artistic License, Other License(s), see package URL: http://cpan.org/modules/by-module/Curses/ Summary: A Dynamic Loadable Curses Module for Perl5 Source: %cpan_name-%{version}.tar.bz2 BuildRoot: %{_tmppath}/%{name}-%{version}-build
%description This is a dynamic loadable curses module for Perl5. This package can be found at any CPAN archive.
%prep %setup -q -n %cpan_name-%{version}
%build perl Makefile.PL OPTIMIZE="$RPM_OPT_FLAGS -Wall" make make test
%install make DESTDIR=$RPM_BUILD_ROOT install_vendor %perl_process_packlist
%clean # clean up the hard disc after build rm -rf $RPM_BUILD_ROOT
%files %defattr(-,root,root) %doc Artistic Copying README %doc %{_mandir}/man3/* %{perl_vendorarch}/%cpan_name.pm %{perl_vendorarch}/auto/%cpan_name /var/adm/perl-modules/%{name}
Recursos
- Package Conventions
- Maximum RPM - A book about the RPM Package Manager
- RPM HOWTO
- RPM Guide by Eric Foster-Johnson
- build HOWTO By Paul MacKay
- rpmbuild(8) man pages
- build(1) man pages