Una suave introducción a Haikuporter # 2: escribir una receta para que GNU.


¡Bienvenido! En este segundo artículo de la serie, vamos a mirar un ejemplo de la vida real: GNU cuál. Iban a:

Tome las fuentes oficiales, y elaborar una receta para ello.
Construir eso en un paquete, que puede ser distribuido, y la receta puede ser utilizado por otros sistemas de Haiku para reconstruir el mismo paquete.
Último artículo, lo hicimos un poco de un curso acelerado en archivos de recetas. Espero que tomar algún tiempo para expandir sobre los temas que cubrimos brevemente hasta la fecha, en contra de una receta de trabajo que usted puede seguir junto con.

Una breve tangente.

En primer lugar, antes de sumergirse en, sólo quiero dar las gracias a todos por el tipo y la retroalimentación positiva hasta la fecha. Cuando escribí el primer artículo, no estaba seguro de lo que sería la respuesta de la comunidad. Hasta la fecha todo ha sido muy positiva, y creo que la comunidad le gustaría ver más: ¡excelente! :)

Esto es un poco de una curva de aprendizaje para mí, así que me verá cometer errores. Como se puede ver en los comentarios, algunos desarrolladores son muy amablemente proporcionar orientación y explicaciones, que estoy en constante actualización en los artículos. Me disculpo por cualquier inexactitud y si ve alguna, por favor hágamelo saber: Yo estaría muy agradecido.

Una llamada a las armas.

Ok, una nota más antes de ponerse en marcha: Me gustaría abrir esta serie hasta cualquier parte interesada, para comenzar a contribuir algunos temas. Estoy feliz de ser co-autor, o para que usted tome las ruedas completamente: en contacto conmigo para discutir. Creo que esta serie sería mucho más útil si teníamos algunas aportaciones de desarrolladores cualificados, los que trabajan en el código haikuporter y haikuports, y la comunidad en general. Por lo tanto, si usted piensa que podría escribir sobre cualquier tema que he mencionado anteriormente, dame un grito!

GNU "que"/ "wich".


GNU Wich, es una herramienta que muestra el camino a un comando. Es útil cuando se desea localizar rápidamente un comando, por ejemplo:



~> which lpe
/bin/lpe
~> 


Vemos aquí que "LPE" se puede encontrar en el directorio / bin /.

¿Cuáles son los pasos para escribir una receta entonces? Ok, aquí va:

Conozca a su fuente: se trata de una URL a un .tgz? Un repositorio git, tal vez?
Crear una receta base.
Actualización de la receta para GNU Wich.
Construir la receta.
Implementar / desinstalar el paquete.
Conozca a su fuente.



Haikuporter es flexible, y puede tomar diversas fuentes para descargar el código fuente de un paquete. Usted podría utilizar direcciones URL que son:


Los archivos de almacenamiento, como tar.gz o tar.bz2.


SRC_URI="http://ftp.gnu.org/gnu/which/which-2.20.tar.gz"



Repositorios Git, incluyendo específicamente hashtags comprometidos.




SRC_URI="git://github.com/cherokee/webserver.git#4119ec4e1b6ad29f0115c462d11ac20e36975f53"
 # 24 Oct 2013 commit.



Compruebe la página de BuildRecipes para obtener una lista completa de opciones compatibles, sino que incluyen soporte para URI como http: //, https: //, ftp: //, bzr ::, cvs ::, fossil ::, hg, y svn :. En nuestro ejemplo, vamos a utilizar el SRC_URI a la que a partir de los archivos de GNU arriba. Crear una receta base. Tendremos que crear un nuevo archivo de receta, en el lugar que le corresponde dentro de su $ TREE_PATH. Recordemos del último artículo: consulte http://packages.gentoo.org de orientación sobre dónde que sería presentada. Si ejecuta una búsqueda, verá que está en / sys-apps /. Por suerte para nosotros, el paquete 'which' ya existe en haikuports:



$TREE_PATH/sys-apps/which
~/ports/sys-apps/which> ls *.recipe
which-2.20.recipe
~/ports/sys-apps/which> 



Vamos a renombrar esta receta para este ejercicio:



~/ports/sys-apps/which> mv which-2.20.recipe which-2.20.recipe.orig
~/ports/sys-apps/which> ls *recipe*
which-2.20.recipe.orig
~/ports/sys-apps/which>


Genial, ahora, en cualquier editor, edite el nuevo archivo:




~/ports/sys-apps/which> lpe which-2.20.recipe


En este artículo, vamos a volver a escribir el archivo de receta which 2,20, pasando por cada parte en detalle y explicando las secciones en que avancemos. Tomemos nuestra receta base, desde el artículo anterior como punto de partida:




SUMMARY="ProjectX."
DESCRIPTION="ProjectX description."
HOMEPAGE="http://projectX"
SRC_URI="git://projectX/projectX.git"
REVISION="1"
LICENSE="GNU GPL v2"
COPYRIGHT=""
 
ARCHITECTURES="x86 x86_gcc2"
 
PROVIDES="
 projectX = $portVersion
 "
 
REQUIRES="
        haiku >= $haikuVersion
        "
 
BUILD_REQUIRES="
        haiku_devel
        "
 
#PATCHES="
# "
 
BUILD()
{ 
 ./autogen.sh
 runConfigure ./configure 
 make $jobArgs
}
 
INSTALL()
{
 make install
}



Eso fue fácil. Adelante ...

Actualización de la receta para which GNU.


Ahora vamos a actualizar la receta con valores específicos para GNU which. Vamos a ir a través de cada sección y su valores. Consulte el artículo # 1 para las explicaciones detalladas de las secciones / bloques si es necesario.



SUMMARY="Prints out location of specified executables that are in your path."
DESCRIPTION="GNU which is an utility that is used to find which executable
        (or alias or shell function) is executed when entered on the shell prompt.
"


RESUMEN ofrece una breve visión general del paquete. Tiene una longitud máxima de 70 caracteres. DESCRIPCIÓN proporciona una descripción más larga del paquete.




HOMEPAGE="http://carlo17.home.xs4all.nl/which/"


Página de inicio es una URL a la página web oficial para el paquete.





SRC_URI="http://ftp.gnu.org/gnu/which/which-2.20.tar.gz"
CHECKSUM_MD5="95be0501a466e515422cde4af46b2744"


SRC_URI define dónde GNU which 2,20 se puede descargar desde. CHECKSUM_MD5 contiene un hash MD5, cuando se utiliza SRC_URIs archivo. Haikuporter generará un aviso si este se encuentra en su .receta.



REVISION="3"



Si nos fijamos en la revisión del expediente que-2.20.recipe.orig, vemos que está establecido a 2. Vamos a aumentar por uno.



LICENSE="GNU GPL v2"
COPYRIGHT="Free Software Foundation"






LICENCIA define el modelo de licencia concreto utilizado por el paquete. Esto debe ser una definición válida.

COPYRIGHT muestra la información de la propiedad y los derechos de autor asociados con el paquete.





ARCHITECTURES="x86_gcc2 x86"


Arquitecturas para GNU que se define por apoyar tanto entornos GCC2 y gcc4.



PROVIDES="
        which = $portVersion
        cmd:which = $portVersion
"




PROPORCIONA aquí se define lo siguiente:

Proporciona el paquete "Which".

Proporciona el comando 'which'.



REQUIRES="
        haiku >= $haikuVersion
"


GNU which requiere el paquete básico 'haiku' instalado.



BUILD_REQUIRES="
"



El BUILD_REQUIRES se deja en blanco aquí: no requiere ninguna dependencia para construir.



BUILD_PREREQUIRES="
        haiku_devel >= $haikuVersion
        cmd:gcc
        cmd:make
"


BUILD_PREREQUIRES aquí define que: haiku_devel paquete requerido, mayor o igual a la versión actual Haiku. El comando 'gcc'. El comando 'make'.




PATCHES="which-2.20.patch"


PARCHES define qué parche (es) para aplicar a las fuentes descargadas a través SRC_URI. Tómese un momento para examinar este archivo de revisión, que se encuentra en $ TREE_PATH / sys-apps / which / parches / which-2.20.patch. Mientras escribía parches en el contexto de haikuporter serán cubiertos más adelante en esta serie, por ahora sólo en cuenta que se trata de un conjunto estándar de diferenciaciones. En este artículo no vamos a estar escribiendo un parche, pero estaremos aplicando uno ya proporcionado para nosotros. Tenga en cuenta que las definiciones PARCHES vacías aún no son compatibles: si usted no tiene ningún conjuntos de parches para aplicar, comente todo el bloque de definición:



#PATCHES="
# "
BUILD()
{
        runConfigure ./configure --disable-dependency-tracking
        make $jobArgs
}




BUILD () es en general un conjunto de pasos necesarios para construir el paquete. Tenga en cuenta que en el pasado, lo que se necesita para entrar en los directorios de origen de forma explícita. Esto ya no es el caso, por lo que si usted está convirtiendo recetas mayores o MPA recuerde quitar el "paquete cd 'comandos según sea necesario. Aquí nos encontramos dos comandos: runConfigure, y hacemos. runConfigure llama ./configure y pasa a ello el argumento --disable-dependencia de seguimiento. runConfigure hace un montón de gruñido-trabajo para nosotros, así que no es necesario especificar las ubicaciones Haiku-específicas para muchos argumentos de configure común. make se llama entonces, con $ jobArgs están aprobando. Si ejecutó haikuporter con -j4, esto se pasa a hacer a través de $ jobArgs.




INSTALL()
{
 make install
}



INSTALAR () es un conjunto de pasos necesarios para instalar el paquete. En este caso, simplemente corremos el estándar de 'make install'. Después de haber configurado la compilacion usando runConfigure, no necesitamos proporcionar pasos a instalar específicamente para Haiku, which para GNU. which-2.20.recipe Como referencia, el .recipe ahora debería contener:



SUMMARY="Prints out location of specified executables that are in your path."
DESCRIPTION="GNU which is an utility that is used to find which executable
        (or alias or shell function) is executed when entered on the shell prompt.
"
 
HOMEPAGE="http://carlo17.home.xs4all.nl/which/"
SRC_URI="http://ftp.gnu.org/gnu/which/which-2.20.tar.gz"
CHECKSUM_MD5="95be0501a466e515422cde4af46b2744"
REVISION="3"
LICENSE="GNU GPL v2"
COPYRIGHT="Free Software Foundation"
 
ARCHITECTURES="x86 x86_gcc2"
 
PROVIDES="
        which = $portVersion
        cmd:which = $portVersion
"
 
REQUIRES="
        haiku >= $haikuVersion
"
 
BUILD_REQUIRES="
"
 
BUILD_PREREQUIRES="
        haiku_devel >= $haikuVersion
        cmd:gcc
        cmd:make
"
 
PATCHES="which-2.20.patch"
 
BUILD()
{
        runConfigure ./configure --disable-dependency-tracking
        make $jobArgs
}
 
INSTALL()
{
 make install
}



Compruebe que el archivo .recipe coincide con lo anterior. Construir la receta. ¡Genial! Ahora que tenemos una receta, vamos a construirla.




~/ports/sys-apps/which> haikuporter -S which-2.20
Checking if any package-infos need to be updated ...
        updating package infos of which-2.20
        which_x86-2.20 is still marked as unsupported on target architecture
Looking for stale package-infos ...
======================================================================
sys-apps::which-2.20
======================================================================
----------------------------------------------------------------------
sys-apps::which-2.20
----------------------------------------------------------------------
Skipping download of source for which-2.20.tar.gz
* No CHECKSUM_MD5 key found in recipe for which-2.20.tar.gz
Skipping unpack of which-2.20.tar.gz
Skipping patchset for which-2.20.tar.gz
unsetting build flag, as recipe is newer
Populating source package ...
chroot has these packages active:
        /boot/home/src/haikuports/packages/bzip2-1.0.6-4-x86_gcc2.hpkg
        /boot/home/src/haikuports/packages/bzip2_devel-1.0.6-4-x86_gcc2.hpkg
        /boot/home/src/haikuports/packages/curl-7.26.0-5-x86_gcc2.hpkg
        /boot/home/src/haikuports/packages/freetype-2.5.0.1-1-x86_gcc2.hpkg
        /boot/home/src/haikuports/packages/gettext_libintl-0.18.1.1-5-x86_gcc2.hpkg
        /boot/home/src/haikuports/packages/libiconv-1.13.1-6-x86_gcc2.hpkg
        /boot/system/packages/binutils-2.17_2013_04_21-2-x86_gcc2.hpkg
        /boot/system/packages/ca_root_certificates-2012_12_29-1-any.hpkg
        /boot/system/packages/expat-2.0.1-7-x86_gcc2.hpkg
        /boot/system/packages/gcc-2.95.3_2013_08_15-2-x86_gcc2.hpkg
        /boot/system/packages/grep-2.14-5-x86_gcc2.hpkg
        /boot/system/packages/haiku-r1~alpha4_pm_hrev46368-1-x86_gcc2.hpkg
        /boot/system/packages/haiku_devel-r1~alpha4_pm_hrev46368-1-x86_gcc2.hpkg
        /boot/system/packages/icu-4.8.1.1-4-x86_gcc2.hpkg
        /boot/system/packages/jpeg-9-3-x86_gcc2.hpkg
        /boot/system/packages/libpng-1.5.12-3-x86_gcc2.hpkg
        /boot/system/packages/libsolv-0.3.0_haiku_2013_10_01-1-x86_gcc2.hpkg
        /boot/system/packages/make-3.82-5-x86_gcc2.hpkg
        /boot/system/packages/openssl-1.0.0j-4-x86_gcc2.hpkg
        /boot/system/packages/sed-4.2.1-6-x86_gcc2.hpkg
        /boot/system/packages/zlib-1.2.8-4-x86_gcc2.hpkg
----- Package Info ----------------
header size:                     80
heap size:                      643
TOC size:                        41
package attributes size:        581
total size:                     723
-----------------------------------
----- Package Info ----------------
header size:                     80
heap size:                      543
TOC size:                        41
package attributes size:        500
total size:                     623
-----------------------------------
waiting for build package which-2.20-3 to be activated
waiting for build package which_source-2.20-3 to be activated
Building ...
checking for a BSD-compatible install... /bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether to enable maintainer-specific portions of Makefiles... no
checking for gcc... gcc
checking for C compiler default output file name... conftest
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables... 
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... none
checking for a BSD-compatible install... /bin/install -c
checking how to run the C preprocessor... gcc -E
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking minix/config.h usability... no
checking minix/config.h presence... no
checking for minix/config.h... no
checking for xmalloc in libiberty.a... no
checking for ANSI C header files... (cached) yes
checking for unistd.h... (cached) yes
checking for string.h... (cached) yes
checking libiberty.h usability... no
checking libiberty.h presence... no
checking for libiberty.h... no
checking whether stat file-mode macros are broken... no
checking for an ANSI C-conforming const... yes
checking for size_t... yes
checking for uid_t in sys/types.h... yes
checking type of array argument to getgroups... gid_t
checking for strchr... yes
checking for memcpy... yes
checking for getopt_long... yes
checking for getcwd... yes
checking for getwd... no
checking for ar... ar
checking for ranlib... ranlib
checking for stdlib.h... (cached) yes
checking for memory.h... (cached) yes
checking pwd.h usability... yes
checking pwd.h presence... yes
checking for pwd.h... yes
checking for strings.h... (cached) yes
checking for getpwent... yes
checking for getpwnam... yes
checking for getpwuid... yes
checking whether programs are able to redeclare getpw functions... yes
configure: creating ./config.status
config.status: creating Makefile
config.status: creating maintMakefile
config.status: creating tilde/Makefile
config.status: creating config.h
config.status: config.h is unchanged
config.status: executing depfiles commands
make  all-recursive
make[1]: Entering directory `/sources/which-2.20'
Making all in tilde
make[2]: Entering directory `/sources/which-2.20/tilde'
make[2]: Nothing to be done for `all'.
make[2]: Leaving directory `/sources/which-2.20/tilde'
Making all in .
make[2]: Entering directory `/sources/which-2.20'
make[2]: Leaving directory `/sources/which-2.20'
make[1]: Leaving directory `/sources/which-2.20'
Collecting files to be packaged ...
make  install-recursive
make[1]: Entering directory `/sources/which-2.20'
Making install in tilde
make[2]: Entering directory `/sources/which-2.20/tilde'
make[3]: Entering directory `/sources/which-2.20/tilde'
make[3]: Nothing to be done for `install-exec-am'.
make[3]: Nothing to be done for `install-data-am'.
make[3]: Leaving directory `/sources/which-2.20/tilde'
make[2]: Leaving directory `/sources/which-2.20/tilde'
Making install in .
make[2]: Entering directory `/sources/which-2.20'
make[3]: Entering directory `/sources/which-2.20'
test -z "/packages/which-2.20-3/.self/bin" || /bin/mkdir -p "/packages/which-2.20-3/.self/bin"
  /bin/install -c 'which' '/packages/which-2.20-3/.self/bin/which'
test -z "/packages/which-2.20-3/.self/documentation/info" || /bin/mkdir -p "/packages/which-2.20-3/.self/documentation/info"
 /bin/install -c -m 644 './which.info' '/packages/which-2.20-3/.self/documentation/info/which.info'
test -z "/packages/which-2.20-3/.self/documentation/man/man1" || /bin/mkdir -p "/packages/which-2.20-3/.self/documentation/man/man1"
 /bin/install -c -m 644 './which.1' '/packages/which-2.20-3/.self/documentation/man/man1/which.1'
make[3]: Leaving directory `/sources/which-2.20'
make[2]: Leaving directory `/sources/which-2.20'
make[1]: Leaving directory `/sources/which-2.20'
name                    which
version                 2.20-3
architecture            x86_gcc2
summary                 "Prints out location of specified executables that are in your path."
description             "GNU which is an utility that is used to find which executable
(or alias or shell function) is executed when entered on the shell prompt."
packager                "Arfonzo J. Coward <art@poorcoding.com>"
vendor                  "Haiku Project"
licenses {
        "GNU GPL v2"
}
copyrights {
        "Free Software Foundation"
}
provides {
        which = 2.20
        cmd:which = 2.20
}
requires {
        haiku >= r1~alpha4_pm_hrev46368-1
}
urls {
        "http://carlo17.home.xs4all.nl/which/"
}
source-urls {
        "Download "
}

mimesetting files for package which-2.20-3-x86_gcc2.hpkg ...
creating package which-2.20-3-x86_gcc2.hpkg ...
----- Package Info ----------------
header size:                     80
heap size:                    26099
TOC size:                       459
package attributes size:        511
total size:                   26179
-----------------------------------
name                    which_source
version                 2.20-3
architecture            source
summary                 "Prints out location of specified executables that are in your path. (source files)"
description             "GNU which is an utility that is used to find which executable
(or alias or shell function) is executed when entered on the shell prompt."
packager                "Arfonzo J. Coward <art@poorcoding.com>"
vendor                  "Haiku Project"
licenses {
        "GNU GPL v2"
}
copyrights {
        "Free Software Foundation"
}
provides {
        which = 2.20
}
urls {
        "http://carlo17.home.xs4all.nl/which/"
}
source-urls {
        "Download "
}

mimesetting files for package which_source-2.20-3-source.hpkg ...
creating package which_source-2.20-3-source.hpkg ...
----- Package Info ----------------
header size:                     80
heap size:                   139170
TOC size:                      2727
package attributes size:        474
total size:                  139250
-----------------------------------
waiting for build package which-2.20-3 to be deactivated
waiting for build package which_source-2.20-3 to be deactivated
cleaning chroot folder
grabbing which-2.20-3-x86_gcc2.hpkg and putting it into /boot/home/src/haikuports/packages
grabbing which_source-2.20-3-source.hpkg and putting it into /boot/home/src/haikuports/packages
~/ports/sys-apps/which> 



Si todo va bien, debería ver una salida similar a la anterior. Al final, verá que dos paquetes se generan: el propio envase, y el paquete fuente. Puede confirmar que están en el lugar correcto:



~/ports/sys-apps/which> ls -l ~/ports/packages/which*
-rw-r--r-- 1 user root 139250 2013-11-22 16:57 /boot/home/ports/packages/which_source-2.20-3-source.hpkg
-rw-r--r-- 1 user root  26179 2013-11-22 16:57 /boot/home/ports/packages/which-2.20-3-x86_gcc2.hpkg
~/ports/sys-apps/which>



Tenga en cuenta que dentro de su directorio haikuports, el directorio de paquetes contiene los paquetes que ha construido. Desplegar / desinstalar el paquete. Para instalar el paquete, nos movemos al paquete en el directorio / home / config / packages




/> cd /tmp
/tmp> cp ~/src/haikuports/packages/which-2.20-3-x86_gcc2.hpkg .
/tmp> mv which-2.20-3-x86_gcc2.hpkg ~/config/packages/
/tmp> 

¿Por qué copiamos a / tmp antes de pasar? Tenga en cuenta la siguiente información de bonefish (¡gracias!), Con respecto a cómo el sistema de envasado Haiku detecta e instala los paquetes. Esto explica por qué es mejor para mover los paquetes de la unidad del sistema, en lugar de copiarlos. "El demonio paquete supervisa los directorios de paquetes y cuando ve un nuevo archivo de paquete, intenta activarlo. Cuando el demonio intenta procesar el paquete antes de que termine de copiar, será detectado como no válida y se ignorará. Hace un tiempo introduje un retraso de medio segundo antes de que el demonio toma ninguna acción para que, cuando se mueven varios archivos, que serán procesados juntos. Por lo tanto, siempre y cuando se terminó en menos de medio segundo de copia va a funcionar. simplemente no es seguro asumir que será y por lo tanto aún no apoyo oficial ". Para desinstalar el paquete, puede eliminarlo del directorio ~ / config / packages /:



~> rm ~/config/packages/which-2.20-3-x86_gcc2.hpkg
~>


Conclusion del articulo




Si has llegado hasta aquí, ¡enhorabuena! Ahora ha creado un archivo .recipe, sobre todo desde cero. Usted ha dado un GNU genérico que el código fuente del proyecto, aplicado parches Haiku-específicamente a través de su receta, y generó un paquete. Usted ha implementado el paquete, y desinstalado el paquete.

Con esto concluye el ciclo de vida básica de usar haikuporter. En los próximos artículos, comenzamos a explorar algunas cuestiones intermedias:


Artículo # 3: pasos hacia el éxito. Algunos pasos genéricos que pueden seguir a través del ciclo de vida de un archivo de receta. Parches escritura, conjuntos de parches que generan, y otra diversión.

gcc2 y gcc4.
Errores y soluciones comunes.
Gracias amigos, hasta la próxima!

Saludos,

arfonzo