Descripción general
Instalar un paquete empaquetado consiste en extraerlo directamente sobre el sistema real. Tras la instalación, todos los archivos extraídos quedan registrados en un directorio índice: starkpm hace un seguimiento completo de los archivos instalados, resuelve automáticamente el orden de las dependencias y lee el script de compilación (sbuild) del directorio de puertos para obtener las variables y funciones necesarias antes de compilar.
Formato de sbuild
sbuild es el script de compilación que usa portbuild para generar el paquete. Ejemplo:
description="This is example package"
homepage="https://example.com/"
maintainer="starkOS Team, starkos at disroot dot org"
name=foobar
version=1.0.0
release=1
backup="etc/example.conf etc/foobar.conf"
noextract="foobar.tar.xz"
source="https://dl.example.com/foobar.tar.xz
$name-$version.tar.gz::https://github.com/archive/$version.tar.gz
example.conf"
nostrip="lib.*/ld-.*\.so$
lib.*/libc-.*\.so$
lib.*/libpthread-.*\.so$
lib.*/libthread_db-.*\.so$"
build() {
cd $name-$version
./configure --prefix=/usr
make
make DESTDIR=$PKG install
install -d $SRC/example.conf $PKG/etc/example.conf
}
depends se define en un archivo aparte, con una dependencia por línea. Antes de crear un puerto nuevo, se recomienda compilarlo primero con fakeroot para asegurarse de que el script no falla y no deja archivos sin registrar en el sistema.
| Campo | Descripción |
|---|---|
| description | Descripción corta del puerto. |
| homepage | URL de la web del software. |
| maintainer | Nombre y correo del mantenedor. |
| name | Nombre del puerto; debe coincidir con el nombre del directorio del puerto. |
| version | Versión del puerto. |
| release | Versión de release del puerto, útil cuando el script cambia sin que cambie la versión. |
| backup | Archivos que deben respaldarse al actualizar el puerto (sin '/' inicial). |
| noextract | Archivos que no deben extraerse, separados por espacio. |
| source | URLs de las fuentes, separadas por espacio. Puede usarse <nuevo-nombre>::<url> para guardar el archivo con otro nombre. |
| depends | Todas las dependencias necesarias, una por línea, en un archivo aparte. |
Configuración global
Se define en /etc/starkpm.conf. Valores por defecto (comentados):
#
# Configuration file for starkpm
#
export CFLAGS="-O2 -march=x86-64 -pipe"
export CXXFLAGS="${CFLAGS}"
export FCFLAGS="${CFLAGS}"
export FFLAGS="${CFLAGS}"
export MAKEFLAGS="-j$(nproc)"
export LDFLAGS="-Wl,-O1 -Wl,--as-needed -Wl,-z,pack-relative-relocs"
# SOURCE_DIR="/var/cache/starkpm/sources"
# PACKAGE_DIR="/var/cache/starkpm/packages"
# WORK_DIR="/var/cache/starkpm/work"
# CBUILD_DIR="/var/lib/starkpm/cbuild"
# CURL_OPTS=""
# COMPRESSION_MODE="xz"
# NO_STRIP="no"
# IGNORE_CHECKSUM="no"
# KEEP_DOC="no"
# KEEP_GOING="no"
# KEEP_LIBTOOL="no"
# KEEP_LOCALE="no"
# NOCOLOR="no"
# THEME="starkos" # variants: 'dracula', 'nord', 'starkos'
Alias de puertos
Un alias hace que instalar o actualizar un puerto instale otro en su lugar, sin cambiar el
nombre por el que lo conoces en el resto del sistema. Se define en /etc/starkpm.alias,
un alias por línea, con el formato <nombre real> <nombre alias>:
#
# /etc/starkpm.alias : starkpm alias file
#
# format:
# <real package> <aliased package>
#
# example:
# openssl libressl
#
rust rust-bin
También puedes gestionar los alias directamente con stark alias, sin necesidad de editar el archivo manualmente:
$ stark alias help
Usage:
stark alias <command> [args]
Commands:
list list aliased ports
add <real> <alias> add/update alias: <real> is a dep of <alias> (installed port)
rm <real> remove alias for <real>
help show this help
Paquetes enmascarados
Excluye puertos de stark sysup, útil para congelar temporalmente una versión problemática sin desinstalarla. Se define en /etc/starkpm.mask, un puerto por línea:
#
# /etc/starkpm.mask : exclude packages from sysup
#
ffmpeg
firefox
webkitgtk
También puedes gestionar los paquetes enmascarados directamente con stark mask:
$ stark mask help
Usage:
stark mask <command> [args]
Commands:
list list masked ports (excluded from 'stark sysup')
add <ports> add ports to mask
rm <ports> remove ports from mask
help show this help
Archivo de repositorios
/etc/starkpm.repo define los directorios y URLs de los repositorios de puertos usados para sincronizar y actualizar. Puedes añadir directorios, sin una URL para definir repositorios locales.
#
# /etc/starkpm.repo : starkpm repo file
#
# format:
# <repo directory> <repo url> <repo branch, "main" by default>
#
/usr/ports/local
/usr/ports/main https://codeberg.org/stark-OS/main
/usr/ports/community https://codeberg.org/stark-OS/community
#/usr/ports/kde-lxqt https://codeberg.org/stark-OS/kde-lxqt
#/usr/ports/mate https://codeberg.org/stark-OS/mate
#/usr/ports/xfce https://codeberg.org/stark-OS/xfce
#/usr/ports/multilib https://codeberg.org/stark-OS/multilib
#/usr/ports/nonfree https://codeberg.org/stark-OS/nonfree
#/usr/ports/s6 https://codeberg.org/stark-OS/s6
#/usr/ports/testing https://codeberg.org/stark-OS/testing
La URL es opcional: solo hace falta indicarla si quieres poder sincronizar ese repositorio.
Herramientas principales
-
01
portadd
Instala y actualiza paquetes ya compilados por portbuild. Instalar consiste en extraer el paquete <name>-<version>-<release>.spkg.xz con tar sobre el sistema real y guardar la lista de archivos extraídos. Actualizar hace lo mismo, sustituye los archivos antiguos y elimina los que ya no existan en el paquete nuevo (como el pkgtool de Slackware).
Usage: portadd [ <options> <package.spkg.txz> ] Options: -u, --upgrade actualizar paquete -r, --reinstall reinstalar paquete -c, --ignore-conflict ignorar conflictos al instalar -v, --verbose mostrar archivos instalados -h, --help mostrar esta ayuda --no-backup omitir respaldo al actualizar --print-dbdir mostrar ruta de la base de datos de paquetes --root=<path> instalar en un directorio raíz personalizado Example: portadd foobar-1.0-1.spkg.txz -uc --no-backup actualiza foobar-1.0-1 sin respaldar su configuración anterior y sin comprobar conflictos -
02
portbuild
Compila un paquete a partir de un puerto. Lee sbuild para obtener la información de compilación antes de generar el paquete, con formato <name>-<version>-<release>.spkg.xz. Debe ejecutarse dentro del directorio del puerto.
Usage: portbuild [ <options> <arguments> ] Options: -q, --quiet mostrar solo mensajes de estado y errores -i, --install instalar el paquete en el sistema -u, --upgrade actualizar paquete -r, --reinstall reinstalar paquete -c, --ignore-conflict ignorar conflictos al instalar -v, --verbose instalación detallada -f, --force-rebuild forzar recompilación -m, --skip-checksum omitir comprobación de checksum -g, --genchecksum generar checksum -o, --download descargar solo las fuentes -x, --extract extraer solo las fuentes -p, --pkgfiles generar lista de archivos del paquete -w, --keep-work mantener el directorio de trabajo -h, --help mostrar esta ayuda -C, --clean eliminar fuentes descargadas y paquetes compilados --config=<config> usar archivo de configuración personalizado --srcdir=<path> sobrescribir ruta de las fuentes --pkgdir=<path> sobrescribir ruta del paquete compilado --workdir=<path> sobrescribir ruta del directorio de trabajo --no-backup omitir respaldo de configuración al actualizar --jobs=N override parallel build jobs (default: JOBS in config, or nproc) Example: portbuild -iw compila, instala el paquete y conserva el directorio de trabajo Nota: sin opciones, portbuild solo descarga las fuentes y compila el paquete con el resto de opciones por defecto. -
03
portdel
Elimina un paquete del sistema leyendo la lista de archivos registrada en PKGDB_DIR.
Usage: portdel [ <options> <package name> ] Options: -h, --help mostrar esta ayuda -v, --verbose mostrar archivos eliminados --root=<path> eliminar el paquete de un directorio raíz personalizado Example: portdel firefox -v elimina firefox, muestra los archivos eliminados. -
04
portrebuild
Recompila los paquetes base en el orden correcto incluyendo la toolchain.
Usage: portrebuild <options> Options: -t, --toolchain recompilar el toolchain -b, --base recompilar los puertos base -h, --help mostrar esta ayuda Example: portrebuild recompila toolchain y base, en ese orden portrebuild -t recompila solo el toolchain portrebuild -b recompila solo los puertos base -
05
portbase
Elimina todos los paquetes salvo los del sistema base y los que indique el usuario.
Usage: portbase <options> Options: -n simulación (dry-run) -y no pedir confirmación -h mostrar esta ayuda -
06
portsync
Sincroniza los puertos y mantiene los repositorios del sistema al día.
Usage: portsync [options] Options: -p, --prune limpiar el repositorio git local -r, --reset reiniciar los repositorios git -s, --source <repos> sincronizar solo los repos indicados (separados por espacio) -h, --help mostrar esta ayuda Examples: portsync sincroniza todos los repos portsync --source main sincroniza solo 'main' portsync -s main custom sincroniza 'main' y 'custom' portsync -r -s main reinicia y sincroniza solo 'main' -
07
portnews
Gestor de noticias del sistema para starkpm. Se invoca como portnews o mediante stark news.
portnews - system news manager for starkpm Usage: run 'portnews' or 'stark news' wrapper portnews List your unread news portnews status Show your news statistics portnews check Notify if you have unread news; exit 0 only if it did portnews unread List unread news portnews read List read news portnews ignore List ignore news portnews cat N Show unread news item N portnews cat read N Show read news item N portnews cat ignore N Show ignore news item N portnews N Show unread news item N (shortcut) portnews mv N <dst> Move unread news N to destination category portnews mv all <dst> Move all unread news to destination portnews mv <src> N <dst> Move news N from source to destination category portnews mv <src< all <dst< Move all news from source to destination portnews sync Sync news from ports repository (requires root) portnews restore Mark all news as unread again portnews purge orphan Remove from your agenda news no longer in source portnews create NAME Create news template file portnews help Show this help Directories: /usr/ports/main/NEWS Ports repository news (from git) /var/lib/starkpm/news/source Synced copy shared by all users (root writes, read-only for users) $XDG_STATE_HOME/portnews Your agenda: unread/ read/ ignore/ (per user) (default: ~/.local/state/portnews) Workflow: 1. News are maintained in git at /usr/ports/main/NEWS 2. Run 'doas portnews sync' to copy them to the shared source directory 3. Each user manages their own agenda: new news start as unread. Run portnews as your own user (not through doas) 4. 'restore' marks every news as unread again in your agenda Examples: doas portnews sync # Sync from ports repo portnews # List your unread news portnews 1 # Show first unread news item portnews cat 1 # Show first unread news item portnews cat read 1 # Show first read news item portnews cat ignore 2 # Show second ignored news item portnews mv 1 read # Move unread #1 to read (short form) portnews mv all ignore # Ignore all unread news (short form) portnews mv read 2 unread # Move read #2 back to unread (full form) portnews mv ignore all unread # Move all ignored back to unread (full form) portnews read # List read news portnews ignore # List ignore news portnews restore # Mark all news as unread again portnews purge orphan # Drop news that no longer exist in source portnews create icu-update # Create news template -
08
stark
stark es el front-end de portbuild, portadd y portdel: cambia de directorio dentro de los puertos, llama a portbuild para compilar y después a portadd para instalar. También añade funciones extra, como buscar paquetes, comprobar dependencias y dependientes, huérfanos, puertos duplicados o listar lo instalado.
Usage: stark <options> [<arg>] Options: search <pattern> find ports in repo -n, --name search in port names only sync <arg> update ports database (use portsync arg) -p, --prune prune local git repository -r, --reset reset git repositories build <ports> <arg> build ports (use portbuild arg, except '-i', '-u', '-r', '-g', & '-p') -f force rebuild package -k keep going building next package on error -m skip checksum checking -o fetch sources only -q, --quiet show only status messages and errors -w keep working directory -y skip ask user confirmation -C, --clean remove downloaded sources and prebuilt packages --log log build process (/var/log/name-version-release-date.log) --jobs=<N> override parallel build jobs (default: JOBS in config, or nproc) install <ports> <arg> install ports (use portbuild arg, except '-i' & '-u') -c ignore conflict when installing package -f force rebuild package -k keep going installing next package on error -m skip checksum checking -n skip dependencies -o fetch sources only -q, --quiet show only status messages and errors -r reinstall -w keep working directory -y skip ask user confirmation --exclude=* exclude dependencies, comma separated --no-backup skip backup when reinstalling package --jobs=<N> override parallel build jobs (default: JOBS in config, or nproc) upgrade <ports> <arg> upgrade ports (use portbuild arg, except '-i' & '-r') -c ignore conflict when installing package -f force rebuild package -k keep going upgrading next package on error -m skip checksum checking -n skip dependencies -o fetch sources only -q, --quiet show only status messages and errors -w keep working directory -y skip ask user confirmation --exclude=* exclude dependencies, comma separated --no-backup skip backup when upgrading package --jobs=<N> override parallel build jobs (default: JOBS in config, or nproc) sysup <arg> full system upgrade (use portbuild arg, except '-i', '-r' & '-u') -c ignore conflict when installing package -f force rebuild package -k keep going upgrading next package on error -m skip checksum checking -n skip dependencies -o fetch sources only -q, --quiet show only status messages and errors -w keep working directory -y skip ask user confirmation --exclude=* exclude dependencies, comma separated --no-backup skip backup when upgrading package --jobs=<N> override parallel build jobs (default: JOBS in config, or nproc) remove <ports> <arg> remove installed ports (use portdel arg) -y skip ask user confirmation deplist <ports> print all dependencies for ports -q skip installed ports --exclude=* exclude dependencies, comma separated redeps <ports> <arg> find redundant dependencies -w, --world check redundant entries in world -f, --fix fix (remove) redundant port deps / world entries cache (no args) clean packages AND sources cache -p, --pkg clean packages cache only -s, --src clean sources cache only alias <arg> manage aliased ports (run 'stark alias help' for usage) cat <port> print sbuild config print starkpm config depends <port> print dependencies dup print duplicate ports files <port> print files installed foreign print foreign ports help print this help hook <stage> <action> <port> run port hook on demand (run 'stark hook' for help) info <port> print information installed print all installed ports integrity check installed port integrity isinstalled <port> check whether port is installed (status 0=installed, 1=not installed) locate <file> print location of file in ports repo mask <arg> manage masked ports (run 'stark mask help' for usage) missingdep print missing dependencies news <args> news manager (run 'stark news help' for usage) orphan print orphan installed ports outdate print outdated ports path <port> print path in repo provide <file> print ports provided file purge <ports> remove installed ports and its orphan dependencies required <port> print reverse dependencies (required by) trigger <ports> run system trigger world <ports> print/add/remove world list Global options: --append-repo=<repo path> append custom local repo path (lowest priority, multiple) --prepend-repo=<repo path> prepend custom local repo path (highest priority, multiple) --override-repo=<repo path> override repo in $REPO_FILE with custom local repo (only these repos are used, multiple) --repo-file=<repo file> use custom repo file (default: $REPO_FILE) --config-file=<config file> use custom config file (default: $CONFIG_FILE) --alias-file=<alias file> use custom alias file (default: $ALIAS_FILE) --mask-file=<mask file> use custom mask file (default: $MASK_FILE)
Opciones globales disponibles en la mayoría de comandos: --append-repo, --prepend-repo y --override-repo (para añadir, anteponer o sobrescribir repos locales personalizados), --repo-file, --config-file, --alias-file y --mask-file para usar archivos alternativos a los definidos por defecto.
# stark install -cv firefox
Compila e instala firefox y sus dependencias, ignorando conflictos de archivos
y con salida detallada
Continuidad ante fallos (KEEP_GOING)
KEEP_GOING permite continuar si un puerto falla en la compilación durante una actualización o instalación en lote, starkpm no detiene toda la operación: continúa con el resto de la cola y presenta un resumen de los fallos al final, evitando perder el trabajo ya realizado.
Compilación personalizada (cbuild)
cbuild permite sobrescribir la configuración de compilación de un puerto sin modificar los puertos del repositorio. Tres funciones están disponibles dentro de cualquier build() de un sbuild:
-
01
cbuild_restore <dest> [name]
Copia un archivo de configuración guardado al árbol de fuentes antes de compilar. Devuelve 1 si no existe ninguna configuración, para que el puerto pueda usar sus valores por defecto. Ejemplo con el puerto "linux":
cbuild_restore "$SRC/$name-${version%.*}/.config" || cp $SRC/x86_64-dotconfig .config -
02
cbuild_save <src> [name]
Guarda un archivo de configuración para futuras compilaciones. Útil tras ejecutar herramientas interactivas como make menuconfig. Ejemplo con el puerto "linux":
cbuild_save "$SRC/$name-${version%.*}/.config" -
03
cbuild_options [name]
Carga un fragmento de shell para sobrescribir variables de compilación: flags de configure, opciones de cmake, targets de LLVM, etc. Ejemplo con "llvm", "clang" y "lld":
llvm: cbuild_options usa "llvm" por defecto (archivo llvm.opt) clang y lld: cbuild_options "llvm" usa el perfil "llvm", sobrescribiendo el nombre del puerto
Los archivos de configuración se guardan en /var/lib/starkpm/cbuild/ con extensiones explícitas:
| Extensión | Contenido |
|---|---|
| name.cfg | Archivos de configuración a copiar en el árbol de fuentes. |
| name.opt | Fragmentos de shell con opciones o variables de compilación. |
| name.dep | Lista de dependencias personalizada que sobrescribe el archivo depends del puerto. |
El override .dep se gestiona de forma transparente en la resolución de dependencias de stark: si existe un archivo .dep para un puerto, se usa en lugar de su archivo depends, permitiendo eliminar dependencias que ya no hagan falta por las opciones de compilación elegidas. Un puerto puede combinar .cfg, .opt y .dep de forma independiente.
Ejemplo con el kernel de Linux — tras ejecutar make menuconfig, copia el .config aquí:
/var/lib/starkpm/cbuild/linux.cfg El puerto lo usará automáticamente en la siguiente compilación: cbuild_restore "$SRC/linux-$version/.config" || make defconfig cbuild_save "$SRC/linux-$version/.config"
Ejemplo para los targets de LLVM:
$ cat /var/lib/starkpm/cbuild/llvm.opt
BUILD_LLVM_TARGETS="AMDGPU;X86"
La ruta de CBUILD_DIR puede sobrescribirse en /etc/starkpm.conf:
CBUILD_DIR="/tu/ruta/personalizada"
Para filtrar los puertos que usan cbuild:
grep cbuild_ /usr/ports/*/*/sbuild | awk -F/ '{print $5}' | sort -u
CBUILD_JOBS
Sobrescribe en tiempo de ejecución el número del hilos paralelos de compilación de tu procesador con
--jobs=<número>. Por defecto, CBUILD_JOBS lee MAKEFLAGS
exportado desde starkpm.conf si no se especifica nada. Si se especifica, sobrescribe los
valores de todos los constructores compatibles mediante variables de entorno y además exporta
la variable de entorno CBUILD_JOBS, que puede usarse específicamente dentro de un
puerto. El objetivo principal es gestionar puertos que consumen muchos recursos, como
webkitgtk o qt6-webengine, limitando el número de jobs en
hardware que no tenga capacidad para compilar el puerto con éxito.
# portbuild --jobs=4
# stark sysup --jobs=4
# stark build|install|upgrade <puerto1> <puerto2> <puerto3> --jobs=4
Herramientas extra
Además, starkpm incluye varios scripts para facilitar tareas comunes.
-
01
schroot
Monta los sistemas de archivos necesarios y entra en un entorno chroot. Monta automáticamente /dev, /proc, /sys, /run, /tmp y /etc/resolv.conf. Si no se indica un comando, lanza /bin/sh.
Usage: schroot
[command] If 'command' is unspecified, schroot will launch /bin/sh. Arguments: Directory to use as new root filesystem [command] Command to execute inside chroot (optional) Description: This script mounts necessary filesystems and enters a chroot environment. It automatically mounts: /dev, /proc, /sys, /run, /tmp, and /etc/resolv.conf Several sessions on the same directory share the mounts; they are removed when the last session exits. Examples: schroot /mnt/mysystem schroot /mnt/mysystem portsync schroot /mnt/mysystem stark sysup -y schroot /mnt/mysystem /bin/bash schroot /mnt/mysystem /bin/mksh -c portsync Notes: - If you want to run a command using a specific shell, use: shell -c 'command' - Arguments are passed directly to the command, preserving their structure schroot <chroot-dir> [command] -
02
portcreate
Script para crear la plantilla de un puerto nuevo.
Usage: portcreate [-b builder]
Create a port template directory with sbuild file. Options: -b Specify build system (default: autotools) Available: autotools, meson, cmake, go, python, rust -h Show this help message Examples: portcreate myport # Creates autotools template portcreate -b meson myport # Creates meson template portcreate -b cmake myport # Creates cmake template portcreate -b go myport # Creates go template portcreate -b python myport # Creates python template portcreate -b rust myport # Creates rust template -
03
updateconf
Script para actualizar archivos de configuración pendientes (*.snew).
Usage: updateconf [-h|--help] Review the .snew files that starkpm leaves when an update would overwrite a configuration file listed in 'backup='. For each one the differences against the installed file are shown and you choose what to do: U Update replace the current file with the new .snew version (your local changes are lost) D Discard delete the .snew and keep the current file (the new defaults are lost) E Edit open the current file in $EDITOR to merge by hand, then show the diff again; if it ends up identical, the .snew is removed K Keep leave both files as they are; the .snew shows up again the next time you run updateconf A .snew identical to the current file, or whose current file does not exist, is removed without asking. A summary of what was done is printed at the end. Environment: EDITOR editor used by Edit, arguments allowed (default: vim) SNEW_DIRS directories searched for .snew files (now: /etc /boot /opt /usr /var) Examples: updateconf review every pending .snew file EDITOR=nano updateconf use nano for Edit SNEW_DIRS=/etc updateconf look only in /etc -
04
revdep
Script de dependencias inversas que conviene ejecutar tras actualizar o eliminar paquetes, para detectar paquetes rotos. Indica un nombre de paquete si quieres comprobar solo ese.
Usage: revdep [option] [arg] Options: -a, --all mostrar todos los archivos afectados -r, --rebuild recompilar e reinstalar el paquete roto -p, --package <pkg> comprobar solo un paquete concreto -f, --no-filter omitir el filtro de directorios, archivos y bibliotecas excluidos -e, --exclude <pkg1 pkg2 pkgN> excluir paquetes al recompilar (con -r/--rebuild) -y, --yes no pedir confirmación al recompilar (con -r/--rebuild) -h, --help mostrar esta ayuda -
05
hook
Un hook es un script de shell con los comandos que deben ejecutarse antes (pre) o después (post) de instalar, actualizar o eliminar un paquete. Se coloca en el directorio del puerto y stark lo ejecuta automáticamente en esos momentos. También puede lanzarse manualmente:
Usage: stark hook <stage> <action> <port> Options: stark hook <pre|post> <install|remove> <port> Example: stark hook post install linux
Compilar starkpm desde el código fuente
starkpm forma parte del sistema base de starkOS, pero puede compilarse e instalarse manualmente ejecutando el script de instalación:
# ./INSTALL.sh
Si vas a empaquetarlo para instalarlo en otra ubicación, antepone DESTDIR al comando: DESTDIR=/tmp/ruta ./INSTALL.sh