repo/README.md

124 lines
3.3 KiB
Markdown
Raw Normal View History

2019-05-09 08:14:38 +00:00
# KISS Package Experiment
2019-05-09 07:59:27 +00:00
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.
```
2019-05-09 08:05:09 +00:00
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
```
2019-05-09 08:12:31 +00:00
2019-05-09 09:20:42 +00:00
## TODO
- [ ] Checksums.
- [ ] Package installation.
- [ ] Package listing.
- [ ] Package removal.
- [ ] Package dependencies.
- [ ] Source extraction.
- [x] `tar.*`
- [ ] `git`
- [ ] `zip`
- [ ] `7z`
2019-05-09 08:12:31 +00:00
## Table of Contents
<!-- vim-markdown-toc GFM -->
* [`build`](#build)
2019-05-09 08:33:24 +00:00
* [`manifest`](#manifest)
2019-05-09 08:44:02 +00:00
* [`sources`](#sources)
* [`depends`](#depends)
2019-05-09 08:52:34 +00:00
* [`version`](#version)
2019-05-09 08:12:31 +00:00
<!-- vim-markdown-toc -->
## `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`).
2019-05-09 08:33:24 +00:00
```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
```
2019-05-09 08:44:02 +00:00
## `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
```
2019-05-09 08:52:34 +00:00
## `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
```