# 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. ```sh 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. ├─ release # Force a package update for the same version. ┘ ``` 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. ```sh while read -r depend; do # do thing. done < depends ``` ## Table of Contents * [`build`](#build) * [`manifest`](#manifest) * [`sources`](#sources) * [`depends`](#depends) ## `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`). ```sh ./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 ```