Go to file
2019-05-10 09:59:06 +03:00
repo puke: Build tarballs 2019-05-10 09:59:06 +03:00
.gitignore docs: update 2019-05-09 11:56:25 +03:00
puke puke: Build tarballs 2019-05-10 09:59:06 +03:00
README.md docs: update 2019-05-09 16:05:22 +03:00

KISS Package Experiment

This is an alternative package system I am experimenting with. Instead of the usual PKGBUILD, APKBUILD, xbps-template and Pkgfile format, this repository explores a more unixy approach.

Each Package is split into multiple files.

zlib/            # Package name.
├─ build         # Build script.
├─ depends       # Dependencies (one per line).
├─ sources       # Sources (one per line).
├─ version       # Package version.# Files generated by the package manager.
├─ manifest      # The built package's files and directories.
├─ checksums     # The checksums for the source files.# Optional files.
├─ post_install  # The script to run after install.

When a built package is installed, this entire directory tree is copied to /var/db/puke where it becomes a database entry. Listing the dependencies for a package is a simple as printing the contents of the depends file. Searching for which package owns a file is as simple as checking each manifest file.

This new structure also allows the package manager to be stupid simple. POSIX sh has no arrays. However, they are mimicked by looping over each line of each file. No more insecure depends="pkg pkg pkg" and for pkg in $depends.

Instead, the following can be done.

while read -r depend; do
    # do thing.
done < depends

TODO

  • Checksums.
  • Package installation.
  • Package listing.
  • Package removal.
  • Package dependencies.
  • Source extraction.
    • tar.*
    • git
    • zip
    • 7z

Table of Contents

Getting started with puke

Puke is a simple package manager written in POSIX sh. The package manager does not need to be added to your PATH. Instead it runs inside the packages repository, very similar to Void Linux's xbps-src.

Puke has 6 different "operators".

  • build: Build a package.
  • checksum: Generate checksums for a package.
  • install: Install a built package.
  • remove: Remove an installed package.
  • depends: List a package's dependencies .
  • list: List installed packages.

The package format

build

The build file should contain the necessary steps to patch, configure, build and install the package. When at the install step; the variable $pkg_dir is available. This variable points to the directory the package manager uses for built packages. Whatever is in this directory will become part of the package's manifest and will be copied to / (or $PUKE_ROOT).

./configure \
    --prefix=/usr \
    --libdir=/lib \
    --shared

make
make DESTDIR="$pkg_dir" install

manifest

The manifest file contains the built package's file and directory list. The full paths to files are listed first and the directories (in reverse) follow. This allows the package manager to remove the directories if they're empty without needing checks in-between.

/usr/share/man/man3/zlib.3
/usr/include/zconf.h
/usr/include/zlib.h
/lib/libz.so.1.2.11
/lib/libz.so.1
/lib/libz.so
/lib/libz.a
/lib/pkgconfig/zlib.pc
/usr/share/man/man3
/usr/share/man
/usr/share
/usr/include
/usr
/lib/pkgconfig
/lib

sources

The sources file contains the package's sources one per line. Sources can be local or remote.

https://www.openssl.org/source/openssl-X.X.X.tar.gz
patches/fix-musl.patch

depends

The depends file contains the package's dependencies one per line.

zlib
binutils
openssl

version

The version file contains the package's version as well as its release number. The format of this file is version release. The release portion allows a package upgrade without the modification of the version number.

1.2.11 1

checksums

The checksums file contains the sha256 sums of each entry in the sources file. This is generated and verified automatically.

c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1  zlib-1.2.11.tar.gz