NetBSD usa el término ports ("portes") para definir a las diferentes arquitecturas en las que funciona el sistema operativo. Su estructura de portes se llama packages ("paquetes").
make lib-depends-check, para verificar
dependencias de bibliotecas dinámicas (compartidas).
make update-patches, que debe
usarse siempre para regenerar los parches.
make update-plist. Se ocupa de
las cuestiones más importantes que afectan a la creación de listas
de empaquetado. Las listas de empaquetado de OpenBSD son significativamente
diferentes de los de otras proyectos BSD, en parte debido a que las
herramientas de empaquetado han sido completamente reescritas.
En OpenBSD, 'make' tiene soporte para ${VAR:U} y
${VAR:L} para transformar el valor de una variable a
mayúsculas o minúsculas.
De acuerdo con esto, las comprobaciones de 'make' se deberían
codificar de forma independiente del caso, v.g.:
.if ${NEED_XXX:L} == "yes"
do stuff if yes
.else
do other stuff
.endif
En teoría, todas las variables booleanas reconocidas por
bsd.port.mk deben siempre definirse,
de modo que al final código como
defined(USE_FOO) no deba ser necesario y
${USE_FOO:L} != "no" debería funcionar.
El fichero principal bsd.port.mk ha sido fuertemente
adaptado y se han solucionado algunos problemas.
En particular, está preparado para ir paralelo a 'make'.
La funcionalidad scripts/{pre,do,post}-* se ha perdido en
el proceso.
Para reemplazar esta funcionalidad, invoque el guión
("script") a mano desde el fichero Makefile.
Note que si invoca 'make' como make VAR=value, la
asignación anulará cualquier valor que VAR
obtenga de Makefile.
Por ello, muchos parches para Makefile no son necesarios, es mucho
mejor configurar correctamente MAKE_FLAGS para disminuir la carga del
mantenimiento.
Existen dos tipos de archivos de fuentes: DISTFILES y PATCHFILES. OpenBSD los procesa de un modo uniforme y, de modo predeterminado, lo saca todo de MASTER_SITES. No hay PATCH_SITES ni PATCH_SITES_SUBDIR.
Si todos los parches que se bajaran no provinieran del mismo grupo de sitios, OpenBSD permitiría las extensiones filename:0 a filename:9, en cuyo caso usaría MASTER_SITES0 hasta MASTER_SITES9 para bajar el fichero.
Es posible que algunas arquitecturas necesiten ficheros distfiles específicos. En el pasado, esto ha causado problemas en donde ha sido preciso replicar ("mirror") distfiles. OpenBSD dispone de soporte para un tercer grupo de ficheros: SUPDISTFILES. éstos serán considerados sólo para generar sumas de comprobación y réplicas. Nótese que es posible que SUPDISTFILES coincida en parte con DISTFILES o PATCHFILES. Por ejemplo:
DISTFILES=foo-1.0.tgz
.if ${ARCH} == "i386"
DISTFILES+=foo-i386.tgz
.elif ${ARCHI} == "sparc"
DISTFILES+=foo-sparc.tgz
.endif
SUPDISTFILES=foo-i386.tgz foo-sparc.tgz
WRKDIR
No queremos portes que usen NO_WRKDIR.
Todos los portes de OpenBSD deben tener un directorio de trabajo.
Los detalles sobre el nombre de estos directorios de trabajo no tienen
porqué ser la preocupación de un «portador».
Si necesita averiguar uno de estos nombres, mire en el fichero
Makefile: cd that_ports_dir && make show=WRKDIR
le dará una idea sobre el WRKDIR
(directorio de trabajo) de ese porte.
La principal razón detrás de esa prohibición es
que en OpenBSD, bsd.port.mk actúa como un fichero
Makefile real, con dependencias.
El paso fethc depende de los distfiles y patchfiles, y el
resto de los pasos dependen de ficheros reales ubicados en el
directorio de trabajo ("cookies"), así que no pueden
existir sin un directorio de trabajo.
EXTRACT_ONLY=
y lleve a cabo la extracción en post-extract.
Nota: NO_WRKSUBDIR ha sido eliminado; su funcionalidad se puede obtener configurando WRKDIST=$(WRKDIR).
Después de que una compilación se ha completado, otros BSD proceden con la instalación del porte y a continuación compilan un paquete con el porte instalado. En lugar de eso, OpenBSD usa una instalación simulada.
PREFIX, que suele ser
/usr/local).WRKINST, que suele ser un subdirectorio de
WRKDIR.
Los objetivos invocados para make fake son los objetivos
de instalación usuales, con la excepción de unas pocas
diferencias:
Los portes que usen imake deberían funcionar tal cual, ya que los fragmentos imake están configurados para usar DESTDIR. De forma parecida, los portes recientes que usen GNU configure no deberían necesitar ningún cambio.
Otra técnica útil es un truco de `ligado tardío': configure los portes para usar un prefijo $(DESTDIR)/usr/local, de modo que el fichero Makefile resultante tenga
prefix=$(DESTDIR)/usr/local
configurado.
Cuando el porte se compile, y puesto que DESTDIR está
configurado a nada, se usará /usr/local y la falsa
instalación pondrá todo en WRKINST/usr/local (v.g., para
portes que usen GNU configure, utilice
CONFIGURE_STYLE= gnu dest).
bsd.port.mk se dará cuenta de los
problemas en ese área.
Las herramientas de empaquetado conocen algunos tipos de fichero,
y pueden hacer muchas cosas de forma automática:
en la mayoría de los casos órdenes @exec o
scripts INSTALL son innecesarios.
Tenga en cuenta que todos los scripts que no sean necesarios deben
ser excluidos, ya que tienen problemas de escalabilidad. Es mucho más
fácil de depurar una infraestructura simple de empaquetado que
modificar cientos de scripts que generen nuevos problemas.
Por ejemplo:
@exec ldconfig no es necesario, pues las bibliotecas
compartidas están anotadas con @lib libfoo.so.1.0
y ldconfig es ejecutado cuando es necesario, y maneja
chroot con elegancia.@exec install-info no es necesario, pues los ficheros de
documentación son anotados con @info file.info. Se ocupa
igualmente de multiples ficheros info, y elimina la necesidad de
makeinfo --no-split.@font
y @fontdir.@newuser y
@newgroup en lugar de scripts de instalación. También son
creados lo suficientemente pronto para que la extracción de paquete
pueda usarse.@sample en lugar de scripts de instalación.
Diríjase a
pkg_create(1)
para obtener más detalles. En la mayoría de casos,
make update-plist escribirá una muy buena aproximación de la
lista de empaquetado completa, y se encargará de las mejoras de una versión
a otra.
Las opciones se han racionalizado como «sabores», para que
la construcción de paquetes pueda ser consistente.
Un porte con opciones debe configurar FLAVORS a la lista de todas las
opciones que tengan sentido para ese porte (v.g., FLAVORS=foo bar
zoinx), y entonces usar FLAVOR para verificar qué opciones han
sido seleccionadas (v.g., FLAVOR=zoinx foo).
bsd.port.mk provee algo de soporte:
Comprobar que un sabor dado ha sido seleccionado es tan simple como:
.if ${FLAVOR:L:Mzoinx}
Existe una extensión adicional denominada MULTI_PACKAGES.
En términos generales, MULTI_PACKAGES y FLAVORS son mecanismos ortogonales.
En conjunto, tratan de hacer el árbol de portes de OpenBSD algo más pequeño
que los otros BSD, al permitir un directorio único de portes para construir un
gran número de paquetes distintos. bsd.port.mk(5)
tiene una sección completa dedicada a FLAVORS y MULTI_PACKAGES.