diff options
| author | emmett1 <me@emmett1.my> | 2026-06-02 23:52:35 +0800 |
|---|---|---|
| committer | emmett1 <me@emmett1.my> | 2026-06-02 23:52:35 +0800 |
| commit | bfb2eac6d9bf99f3b00910252df8d0fda915ae7d (patch) | |
| tree | c4b8de7a8ae3600cd608a349f61fcb3683fa48fc /docs | |
| parent | cde4ac9cad12e1d5e4bc5b2336f43ca3fff323e4 (diff) | |
| download | alicelinux-bfb2eac6d9bf99f3b00910252df8d0fda915ae7d.tar.gz alicelinux-bfb2eac6d9bf99f3b00910252df8d0fda915ae7d.zip | |
docs updated
Diffstat (limited to 'docs')
| -rw-r--r-- | docs/apkg_helpers.md | 86 | ||||
| -rw-r--r-- | docs/bootloader.md | 88 | ||||
| -rw-r--r-- | docs/install.md.new | 312 | ||||
| -rw-r--r-- | docs/networking.md | 27 | ||||
| -rw-r--r-- | docs/packagemanager.md.new | 397 | ||||
| -rw-r--r-- | docs/readme.md | 3 | ||||
| -rw-r--r-- | docs/using_autils.md | 245 | ||||
| -rw-r--r-- | docs/writing_abuild.md | 229 |
8 files changed, 1367 insertions, 20 deletions
diff --git a/docs/apkg_helpers.md b/docs/apkg_helpers.md new file mode 100644 index 00000000..bbc54648 --- /dev/null +++ b/docs/apkg_helpers.md @@ -0,0 +1,86 @@ +# apkg helper scripts + +autils includes several helper scripts that work alongside `apkg` for package inspection, cleanup, and maintenance. See `man <program>` for full details on each command. + +## apkg-chroot + +Enter a chroot environment with virtual filesystems mounted. Useful for building packages or performing system maintenance inside an alternative root. + +```sh +apkg-chroot /mnt/alice # launch interactive shell +apkg-chroot /mnt/alice apkg -i mypkg # run a command inside the chroot +``` + +Must be run as root. Mounts `/dev`, `/proc`, `/sys`, `/run`, copies `/etc/resolv.conf`, and cleans up all mounts on exit. + +## apkg-clean + +List stale `.spm` package files and orphaned source tarballs that are no longer referenced by any current package recipe. Pipe to `xargs rm` to actually clean up. + +```sh +apkg-clean # list all unreferenced files +apkg-clean -p # list only stale packages +apkg-clean -s # list only stale sources +apkg-clean | xargs rm # remove them +``` + +## apkg-deps + +Show runtime library dependencies of an installed package. Uses `ldd` to find shared libraries needed by the package's binaries, then maps those libraries back to the packages that provide them. + +```sh +apkg-deps mypkg +``` + +Useful for discovering implicit runtime dependencies not listed in the formal `depends` file. Excludes the package itself and base system packages (gcc, musl, binutils, glibc). + +## apkg-foreign + +List installed packages that are not found in any configured repository. These may have been installed from an external source or had their recipes removed. + +```sh +apkg-foreign +``` + +Takes no arguments; outputs one package name per line. + +## apkg-genabuild + +Scaffold a new package recipe from a source URL. Parses the name and version from the URL and creates a directory with skeleton `abuild` and `info` files. + +```sh +apkg-genabuild https://example.com/mypkg-1.2.3.tar.gz +apkg-genabuild https://github.com/user/repo/archive/v1.0.tar.gz myname +``` + +Special handling for GitHub tag archives, PyPI packages (prefixes `python-`), and CPAN packages (prefixes `perl-`). An optional second argument overrides the derived package name. + +## apkg-orphan + +List orphan packages: packages that are installed and exist in a repository, but have no other installed package depending on them. These may be safe to remove. + +```sh +apkg-orphan +``` + +Takes no arguments; outputs one package name per line. + +## apkg-purge + +Remove a package and all its dependencies that are no longer needed by any other installed package. This is a "deep" removal compared to `apkg -r` which only removes the specified package. + +```sh +apkg-purge mypkg # dry-run: show what would be removed +apkg-purge -p mypkg # actually purge from the system +``` + +## apkg-redundantdeps + +Find redundant entries in `depends` files. A dependency is redundant if another listed dependency already pulls it in transitively. + +```sh +apkg-redundantdeps mypkg # check one package +apkg-redundantdeps # check all packages +apkg-redundantdeps -f mypkg # fix by removing redundant entries +apkg-redundantdeps -f # fix all packages +``` diff --git a/docs/bootloader.md b/docs/bootloader.md new file mode 100644 index 00000000..bc6bbd47 --- /dev/null +++ b/docs/bootloader.md @@ -0,0 +1,88 @@ +# Bootloader + +This document covers installing and configuring the two bootloaders available in Alice Linux: Limine and GRUB. + +## Limine + +Limine is a modern, lightweight bootloader supporting BIOS and UEFI. + +Install the package: + +``` +# apkg -I limine +``` + +### BIOS + +Deploy Limine to the target disk: + +``` +# limine bios-install /dev/sdX +``` + +### UEFI + +Copy the Limine EFI executable to the EFI system partition: + +``` +# mkdir -p /boot/EFI/BOOT +# cp /usr/share/limine/BOOTX64.EFI /boot/EFI/BOOT +``` + +### Configuration + +Create `/boot/limine.conf`: + +``` +timeout: 5 + +/Alice Linux + protocol: linux + kernel_path: boot():/vmlinuz + cmdline: root=/dev/sda2 rw loglevel=3 quiet + module_path: boot():/initrd-linux +``` + +Use `boot()` to reference the partition where `/boot` resides, or specify the partition directly with `uuid()` or a path like `hd(0,2)`. + +For full configuration options, see the [Limine documentation](https://github.com/limine-bootloader/limine/blob/trunk/CONFIG.md). + +## GRUB + +GRUB is the GNU Grand Unified Bootloader, supporting UEFI on x86_64 only. + +Install the package: + +``` +# apkg -I grub +``` + +### Install + +Install GRUB for UEFI (requires the EFI system partition mounted at `/boot`): + +``` +# grub-install --target=x86_64-efi --efi-directory=/boot +``` + +### Configuration + +Generate the GRUB configuration file: + +``` +# grub-mkconfig -o /boot/grub/grub.cfg +``` + +GRUB settings are controlled by `/etc/default/grub`. Key options: + +- **`GRUB_DEFAULT`**: Default menu entry (default: `0`) +- **`GRUB_TIMEOUT`**: Seconds before booting the default entry (default: `5`) +- **`GRUB_CMDLINE_LINUX_DEFAULT`**: Kernel command line arguments +- **`GRUB_GFXMODE`**: Framebuffer resolution (default: `auto`) +- **`GRUB_DISABLE_OS_PROBER`**: Disable probing for other operating systems (default: enabled for security) + +After editing `/etc/default/grub`, regenerate the config: + +``` +# grub-mkconfig -o /boot/grub/grub.cfg +``` diff --git a/docs/install.md.new b/docs/install.md.new new file mode 100644 index 00000000..b0322b5c --- /dev/null +++ b/docs/install.md.new @@ -0,0 +1,312 @@ +# Install Alice + +Here is a guide to installing Alice Linux on your computer using the chroot method. You can do this from your existing Linux distribution or from a live environment, such as Alice Live or another Linux distribution. Make sure your chosen environment has the necessary partitioning tools, filesystem tools, and extraction tools. + +## Get Alice rootfs tarball + +Download the Alice rootfs tarball from the [release](https://codeberg.org/emmett1/alicelinux/releases) page, along with its `sha256sum` file. +``` +$ curl -O <url> +$ curl -O <url>.sha256sum +``` + +Verify the checksum of the Alice rootfs tarball. +``` +$ sha256sum -c alicelinux-rootfs-20240525.tar.xz.sha256sum +alicelinux-rootfs-20240525.tar.xz: OK +``` + +## Prepare the partition and filesystem + +Prepare the partition and filesystem of your choice. In this guide, I will use `ext4` as an example. +``` +# cfdisk /dev/sdX +# mkfs.ext4 /dev/sdXY +``` + +Mount your created partition somewhere. In this guide, I will use `/mnt/alice` as the mount point. +``` +# mkdir /mnt/alice +# mount /dev/sdXY /mnt/alice +``` + +## Extract the Alice rootfs tarball + +Extract the Alice rootfs into the mounted partition. +``` +$ tar xvf alicelinux-rootfs-*.tar.xz -C /mnt/alice +``` + +## Enter chroot + +First, chroot into Alice. (Replace `/mnt/alice` with your chosen mount point) +``` +# /mnt/alice/usr/bin/apkg-chroot /mnt/alice +``` + +Any further commands after this will be executed inside the Alice environment. + +## Configure apkg.conf + +Once we have the repositories cloned, we need to configure `apkg`. `apkg` is Alice's package build system (or package manager). By default, Alice does not provide an `apkg` config file (yes, `apkg` can work without a config file), but we need to create one. The `apkg` config file should be located at `/etc/apkg.conf` by default. Let's create one. + +First, we set `CFLAGS` and `CXXFLAGS`. Alice base packages are built using `-O3 -march=x86-64 -pipe`. You can use these settings or change them to your preference. +``` +# echo 'export CFLAGS="-O3 -march=x86-64 -pipe"' >> /etc/apkg.conf +``` + +And use whats in `CFLAGS` for `CXXFLAGS`. +``` +# echo 'export CXXFLAGS="$CFLAGS"' >> /etc/apkg.conf +``` + +Next set `MAKEFLAGS`. I will use `6` for my `8 threads` machine. +``` +# echo 'export MAKEFLAGS="-j6"' >> /etc/apkg.conf +``` + +I'm also going to set `NINJAJOBS` here. Without it, `ninja` will use all threads of your machine when compiling. +``` +# echo 'export NINJAJOBS="6"' >> /etc/apkg.conf +``` + +Next, we need to set the package's build scripts path (I'll call it `package repos`) so `apkg` can find them. The `APKG_REPO` variable can accept multiple values for multiple `package repos`. + +Alice provides two (2) `package repos` (at the time of this writing): `core` and `extra`. `core` contains all base packages, and `extra` includes other packages beyond the base. + +I'm gonna use directory `/var/lib/repos/core` and `/var/lib/repos/extra` for `core` and `extra` repos respectively. +``` +# echo 'APKG_REPO="/var/lib/repos/core /var/lib/repos/extra"' >> /etc/apkg.conf +``` + +You can also create a directory the community repo. +> NOTE: The community repo is not held to the same standards as the official repos. +> Additionally all repo paths must be declared in the APKG_REPO variable, separated by a single space. +``` +# echo 'APKG_REPO="/var/lib/repos/core /var/lib/repos/extra /var/lib/repos/community"' >> /etc/apkg.conf +``` + +Next, we will set up directories for `packages`, `sources`, and `work`. By default, these directories are inside the package template, but we will change them to `/var/cache/pkg`, `/var/cache/src`, and `/var/cache/work` respectively. You can change these to any location where you want to store these files. + +First, create the directories. +``` +# mkdir -p /var/cache/pkg +# mkdir -p /var/cache/src +# mkdir -p /var/cache/work +``` + +Then add these paths to `/etc/apkg.conf`. +``` +# echo 'APKG_PACKAGE_DIR=/var/cache/pkg' >> /etc/apkg.conf +# echo 'APKG_SOURCE_DIR=/var/cache/src' >> /etc/apkg.conf +# echo 'APKG_WORK_DIR=/var/cache/work' >> /etc/apkg.conf +``` + +## Configure reposync.conf + +`reposync` is a tool to sync package templates from git repositories. Add remote repos for `core` and `extra` into `/etc/reposync.conf`. The format of remote repos in `reposync.conf` is `<gitrepo>|<branch>|<localpath>`. +``` +# echo 'https://codeberg.org/emmett1/alicelinux|core|/var/lib/repos/core' >> /etc/reposync.conf +# echo 'https://codeberg.org/emmett1/alicelinux|extra|/var/lib/repos/extra' >> /etc/reposync.conf +``` + +If you also want the community repo, add it as well. +> NOTE: The community repo is not held to the same standards as the official repos. +``` +# echo 'https://codeberg.org/emmett1/alicelinux|community|/var/lib/repos/community' >> /etc/reposync.conf +``` + + +Now run `reposync` to sync latest package templates. +``` +# reposync +``` + +After setting up our `package repos`, make sure `apkg` can find the packages. We can use `apkg -s <pattern>` to search for packages. +``` +# apkg -s sway +swayidle +swaybg +swaylock +sway +``` + +Lets combine with `-p` flags to show path or package templates. +``` +# apkg -p $(apkg -s sway) +/var/lib/repos/extra/sway +/var/lib/repos/extra/swaylock +/var/lib/repos/extra/swaybg +/var/lib/repos/extra/swayidle +``` + +If the output appears, then we are good to go. + +## Full system upgrade/rebuild + +On the first install, we should upgrade the system first. + +Before we do, install development packages first. +``` +# apkg -I meson cmake pkgconf libtool automake perl +``` + +> NOTE: use upppercase 'i' for solve dependencies, lowecase 'i' without solve dependencies. + +Now lets upgrade our system. +``` +# apkg -U +``` + +> NOTE: Use uppercase `U` for a system upgrade, and lowercase `u` to upgrade a specific package of your choice. + +If you changed `CFLAGS` and `CXXFLAGS` to something other than the default, it's a good time to perform a full rebuild first. In this case, you can skip upgrading the system because performing a full rebuild will already use the latest version in `package repos`. +``` +# apkg -u $(apkg -a) +``` + +> NOTE: Add the `-f` flag to force rebuild of existing prebuilt package. +> NOTE: `apkg -a` prints all installed packages on the system. + +## Install kernel + +You can configure your own kernel from [kernel.org](https://kernel.org/) or use the one provided by Alice. + +> NOTE: The provided kernel will take a lot of time to compile because many options are enabled. + +If you want to use Alice's kernel, just run. +``` +# apkg -I linux +``` + +## Install firmware + +If your hardware requires firmware, install it using. +``` +# apkg -I linux-firmware +``` + +## Install bootloader + +In this guide, I'm going to use `grub` as the bootloader. Install `grub`. +``` +# apkg -I grub +``` + +Then generate grub config. +``` +# grub-install /dev/sdX +# grub-mkconfig -o /boot/grub/grub.cfg +``` + +## Hostname + +Change `alice` to the hostname of your choice. +``` +# echo alice > /etc/hostname +``` + +## Fstab + +Change the partition and filesystem of your choice below. +``` +# echo '/dev/sda1 swap swap defaults 0 1' >> /etc/fstab +# echo '/dev/sda2 / ext4 defaults 0 0' >> /etc/fstab +``` + +## Enable runit services + +Alice uses busybox's `runit` as its main service manager. Enable the required services. +``` +# ln -s /etc/sv/tty1 /var/service +# ln -s /etc/sv/tty2 /var/service +# ln -s /etc/sv/tty3 /var/service +``` + +I'm enabling 3 `tty` services. `tty` is required; without it, you won't be able to log in (or run any commands). + +> The runit service directory is `/etc/sv`. +> Create a symlink from `/etc/sv/<service>` to `/var/service` to enable it; remove the symlink to disable it. + +## Setup user and password + +Add your user. +``` +# adduser <user> +``` + +Add your user to the `wheel` group. +``` +# adduser <user> wheel +``` + +You might need to add your user to the `input` and `video` groups to start the Wayland compositor later, and the `audio` group to have working audio. +``` +# adduser <user> input +# adduser <user> video +# adduser <user> audio +``` + +## Root password + +Set the password for the `root` user. +``` +# passwd +``` + +## Networking + +You might want to set up networking before rebooting. For wifi connection, install `wpa_supplicant`. +``` +# apkg -I wpa_supplicant +``` + +Configure your SSID. +``` +# wpa_passphrase <YOUR SSID> <ITS PASSWORD> >> /etc/wpa_supplicant.conf +``` + +Enable the service. +``` +# ln -s /etc/sv/wpa_supplicant /var/service +``` + +Then configure & enable `udhcpc` service. +``` +# vi /etc/sv/udhcpc/conf +# ln -s /etc/sv/udhcpc /var/service +``` + +## Timezone + +Install `tzdata`. +``` +# apkg -I tzdata +``` + +Then create a symlink for your timezone to `/etc/localtime`. +``` +# ln -s /usr/share/zoneinfo/Asia/Kuala_Lumpur /etc/localtime +``` + +Alternatively, you can copy it and then uninstall `tzdata` to keep your installed packages minimal. +``` +# cp /usr/share/zoneinfo/Asia/Kuala_Lumpur /etc/localtime +# apkg -r tzdata +``` + +## Reboot and enjoy! + +Exit the chroot environment and unmount the Alice partition, then reboot. +``` +# exit +# umount /mnt/alice +# reboot +``` + +# Some important notes + +- `Alice` uses `spm` and `apkg` as its package manager and package build system. Run with the `-h` flag to see available options. +- Additional scripts are provided with the name `apkg-<script>` which will be added (or removed) from time to time. +- Use `revdep` to scan for broken libraries and binaries after system upgrades and package removals. You can use `revdep -v` to print out missing required libraries, and use `apkg -f -u $(revdep)` to scan and rebuild broken packages. +- Run `updateconf` to update config files in `/etc` after package upgrades. diff --git a/docs/networking.md b/docs/networking.md index 186ddfe0..4b1eb702 100644 --- a/docs/networking.md +++ b/docs/networking.md @@ -1,12 +1,10 @@ -Networking -========== +# Networking This document describes how to configure networking on **Alice Linux** using `eiwd`/`wpa_supplicant` + `udhcpc`/`dhcpcd`. --- -Overview --------- +## Overview Alice Linux uses simple, modular networking tools: @@ -22,11 +20,9 @@ Alice Linux uses simple, modular networking tools: --- -Establish Network Link ----------------------- +## Establish Network Link -Wired (LAN) ---------------- +## Wired (LAN) Bring interface up: @@ -38,8 +34,7 @@ A physical cable connection is usually sufficient. > runit service enabled later will automatically bring up the interface. -Wi-Fi -------- +## Wi-Fi Bring interface up first: @@ -104,8 +99,7 @@ Enable `wpa_supplicant` service: --- -Obtain IP Address (DHCP) ------------------------- +## Obtain IP Address (DHCP) Once the interface is connected (LAN or Wi-Fi), obtain an IP address. @@ -137,8 +131,7 @@ Enable `dhcpcd` service: --- -Static Network Configuration ------------------------------ +## Static Network Configuration To use a static configuration instead of DHCP: @@ -159,8 +152,7 @@ Set the following variables: --- -Troubleshooting ---------------- +## Troubleshooting Check interfaces: @@ -182,8 +174,7 @@ ping -c 3 google.com --- -Quick Reference ---------------- +## Quick Reference LAN (DHCP) diff --git a/docs/packagemanager.md.new b/docs/packagemanager.md.new new file mode 100644 index 00000000..5aac8e94 --- /dev/null +++ b/docs/packagemanager.md.new @@ -0,0 +1,397 @@ +# Package Manager + +In Alice, two package manager are used, [spm](https://codeberg.org/emmett1/spm) and [autils](https://codeberg.org/emmett1/autils). And why two package manager? `spm` was written for generic package manager for linux distribution. And `autils` is written specifically for `Alice` and requires `spm` in order to install, remove and update packages while managing conflicts. The command `apkg` (part of `autils`) is used to fetch and build packages from ports and their `abuild` files. + +## spm + +`spm` stands for `simple package manager`. It does simple and minimal written in POSIX compliance shell script. It only depends on core utils and tar (or busybox's utils and tar). `spm` only intended for compressing some directory into package, then extract package into system with files being tracked into database. Theres is no build script, recipe or ports in `spm`. You can write your own tools to use with `spm` either like Arch Linux's `makepkg`, CRUX's `pkgmk` or Slackware's `slackbuild` script. + +## spm - usage + +list `spm` usage: +``` +-a print all installed packages +-b <path> build <path> directory into package +-h print this help message +-i <file> install <file> package into system +-l <pkg> list files installed by <pkg> +-o <file> print owner of <file> +-r <name> remove installed <name> from system +-u <pkg> re-install/upgrade <pkg> +``` + +list all install package with version: +``` +$ spm -a +... +neofetch 7.1.0-1 +nettle 3.10-1 +nghttp2 1.62.1-1 +ninja 1.12.1-1 +nodejs 22.5.1-1 +nspr 4.35-1 +nss 3.102.1-1 +nsxiv 32-1 +... +``` + +build package from directory: +``` +(build package) +$ ./configure --prefix=/usr +$ make + +(install into fake directory) +$ make DESTDIR=$PWD/fakeroot install + +(turn fake directory into package (package.spm)) +# spm -b $PWD/fakeroot + +(mv 'package.spm' into correct format (name#version-release.spm)) +# mv package.spm pkgname#pkgversion-pkgrelease.spm + +(install package into system) +# spm -i pkgname#pkgversion-pkgrelease.spm +``` + +install package into system: +``` +# spm -i pkgname#pkgversion-pkgrelease.spm +[pkgname] Verify package... +[pkgname] Checking for conflicts... +[pkgname] Installing package... +[pkgname] Package 'pkgname#pkgversion-pkgrelease' installed. +``` + +list files installed by 'packagename'$ spm -l test: +``` +usr/ +usr/share/ +usr/share/aaa +usr/bin/ +usr/bin/aaa +``` + +list package owner of a file (can use regex): +``` +$ spm -o gcc$ +ccache usr/lib/ccache/gcc +gcc usr/bin/gcc +gcc usr/bin/x86_64-pc-linux-musl-gcc +linux lib/modules/6.6.41-Alice/build/scripts/dummy-tools/gcc +``` + +upgrade/reinstall installed package: +``` +# spm -u pkgname#pkgversion-pkgrelease.spm +[pkgname] Verify package... +[pkgname] Checking for conflicts... +[pkgname] Upgrading package... +[pkgname] Package 'pkgname#pkgversion-pkgrelease' upgraded. +``` + +## spm - environment +``` +SPM_ROOT: use custom root location for package installation +SPM_FORCEINSTALL: set any value to ignore conflicted files +``` +You can pass these environment to `spm` command, example: +``` +# SPM_ROOT=/mnt/rootfs spm -i pkgname#pkgversion-pkgrelease.spm +# SPM_FORCEINSTALL=1 SPM_ROOT=/mnt/rootfs spm -i pkgname#pkgversion-pkgrelease.spm +``` + +## autils + +`autils` stands for `alice utilitis`. `autils` contains main package manager (apkg), utilities (apkg-<util>) and <random util script>. `autils` is specifically written to manage `Alice` packages. + +## apkg + +`apkg` is a main package manager that can solve dependencies, batch install/upgrade/remove packages, system upgrades, trigger necessary caches, and etc. `apkg` can be run inside or outside package template. + +When running outside package template, `apkg` will need 'package names' as arguments, and those 'package names' will search through `APKG_REPO` environment. Example: +``` +# apkg testpkg testpkg2 (build testpkg and testpkg2) +# apkg testpkg testpkg2 -i (build and install testpkg and testpkg2) +# apkg -u testpkg testpkg2 (upgrade/reinstall testpkg and testpkg2) +# apkg -f -u testpkg testpkg2 (force rebuild then upgrade/reinstall testpkg and testpkg2) +``` + +When running inside package template, `apkg` will do operation for current directory package. Example: +``` +# cd /path/to/local/testpkg +# apkg (build testpkg) +# apkg -i (build and install testpkg) +# apkg -u (upgrade/reinstall testpkg) +# apkg -u -f (force rebuild then upgrade/reinstall testpkg) +``` + +## apkg - usage +``` +-i <pkg(s)> install package(s) +-I <pkg(s)> install packages(s) with dependencies +-d <pkg> list <pkg> dependencies +-D <pkg(s)> list all dependencies +-j <pkg> list all dependents +-u <pkg(s)> upgrade package(s) +-t [pkg(s)] trigger system cache/db updates +-U update system +-f force rebuild +-o <pkg(s)> download source +-p <pkg> print package path +-s <pattern> search packages +-h print this help message +``` + +I won't explain details on every each options here, but I will give quick tips/tricks to use `apkg` + +installing package and its dependencies (mind the uppercase `i`): +``` +# apkg -I sway +[...] Solving dependencies... +[...] Installing 3 package(s): mesa pango sway +[...] Press ENTER to continue operation. +[...] Press Ctrl + C to abort. +``` + +search available packages: +``` +$ apkg -s sway +swaybg +swaylock +sway +swayidle +swayfx +``` + +install all package with 'sway' name and its dependencies: +``` +# apkg -I $(apkg -s sway) +... +[...] Package 'mesa' is installed +[...] Package 'swaybg' is installed +[...] Package 'swaylock' is installed +[...] Package 'swayidle' is installed +[...] Package 'swayfx' is installed +[...] Solving dependencies... +[...] Installing 2 package(s): pango sway +[...] Press ENTER to continue operation. +[...] Press Ctrl + C to abort. +``` + +install package without solving dependencies (mind the lowercase `i` and theres no prompt for this option): +``` +# apkg -i wlroots mesa +[...] Package 'wlroots' already installed. +[...] Package 'mesa' already installed. +``` + +list all installed packages: +``` +$ apkg -a +... +qemu +ranger +rdfind +readline +rsync +rtorrent +rust +... +``` + +list all installed packages with filter (will only print installed package contains word filter): +``` +$ apkg -a sway +swaybg +swayfx +swayidle +swaylock +``` + +list dependencies of a package: +``` +$ apkg -d sway +wlroots +json-c +pango +``` + +list all dependencies tree of package(s): +``` +$ apkg -D sway dwm +... +wayland +wayland-protocols +xkeyboard-config +xcb-proto +xorgproto +util-macros +... +``` + +upgrade/reinstall package(s): +``` +# apkg -u wlroots cwm pango +[wlroots] Verify package... +[wlroots] Checking for conflicts... +[wlroots] Upgrading package... +[wlroots] Package 'wlroots#0.17.4-1' upgraded. +[cwm] Verify package... +[cwm] Checking for conflicts... +[cwm] Upgrading package... +[cwm] Package 'cwm#7.4-1' upgraded. +[pango] Verify package... +[pango] Checking for conflicts... +[pango] Upgrading package... +[pango] Package 'pango#1.54.0-1' upgraded. +``` + +full system upgrades (mind uppercase `u` and will prompt first if theres package updates): +``` +# apkg -U +[...] Checking for outdated packages... +[...] Solving dependencies... +[...] Upgrading 3 package(s): initscripts mesa sowm +[...] Press ENTER to continue operation. +[...] Press Ctrl + C to abort. +``` + +make full system rebuild in dependencies order (`-f`: force rebuild, `-u`: upgrade/reinstall, `-D`: solve dependency order, `-a`: list all installed package(s)): +``` +# apkg -f -u $(apkg -D $(apkg -a)) +... +(start rebuilding package in dependencies order here) +... +``` + +remove installed packages: +``` +# apkg -r wlroots pango sway +[...] Package 'wlroots' removed. +[...] Package 'pango' removed. +[...] Package 'sway' removed. +``` + +print package path: +``` +$ apkg -p sway +/home/emmett/codeberg/alicelinux/repos/wayland/sway +``` + +## apkg - environment + +You can pass environment to `apkg` to override defaults and in `/etc/apkg.conf`. Available environment and its default value as follows: +``` + env default value description +APKG_ROOT / root for package installation +APKG_CONF /etc/apkg.conf apkg's config file +APKG_REPO defaults is empty, template repo path, space separated variable +APKG_PACKAGE_DIR $PWD prebuilt package directory path +APKG_SOURCE_DIR $PWD package source directory path +APKG_WORK_DIR $PWD package working directory path +APKG_NOPROMPT defaults is empty, skip prompt, use any value +``` +You can add these environment into `apkg` config file. + +## /etc/apkg.conf + +`apkg` can work without its config file by using all default value. Default config path for `apkg` is `/etc/apkg.conf`. You can override config path by append `APKG_CONF` to `apkg`, example: +``` +# APKG_CONF=/etc/apkg-local.conf apkg <args> +``` +## revdep + +`revdep` is script to find broken packages. Its recomended to run after packages is removed or upgraded. + +Usage: +``` +(print out broken packages) +$ revdep + +(verbosely print missing libraries) +$ revdep -v +``` + +You can combine with `apkg` to rebuild broken packages, example; +``` +# apkg -f -u $(revdep) +``` + +> NOTE: `revdep` does not solve dependencies, so you might need manually rebuild broken packages instead combine with `apkg`. + +## updateconf + +`updateconf` is script to update configuration files inside `/etc` directory. Its recomended to run after packages upgrades. + +## apkg-chroot +Script to entering chroot environment of custom root location. +``` +# apkg-chroot <customroot path> +# apkg-chroot <customroot path> <command> +``` + +## apkg-clean +Print out old package and source caches. + +Options: +``` +-s print sources only +-p print packages only +``` + +Usage: +``` +(to remove old packages) +# apkg-clean -p | xargs rm + +(to remove old sources) +# apkg-clean -s | xargs rm + +(to remove both old packages and sources) +# apkg-clean | xargs rm +``` + +## apkg-deps + +Script to find runtime linked dependencies of installed package. Its good to figure out dependenciess when writing package template. + +Usage: +``` +$ apkg-deps <pkg> +``` + +## apkg-foreign + +Script to list installed package outside package repo. + +Usage: +``` +(print list foreign packages) +$ apkg-foreign + +(remove foreign packages) +# apkg -r $(apkg-foreign) +``` + +## apkg-orphan + +Script to print list package without parent dependencies. + +Usage: +``` +$ apkg-orphan +``` + +## apkg-redundantdeps + +Script to print package's redundant dependencies. Its good to use when writing package template for minimizing dependencies and speed up `apkg` dependencies solving. + +usage: +``` +(print package contains redundant dependencies) +$ apkg-redundantdeps + +(remove redundant dependencies for depends list) +$ apkg-redundantdeps -f +``` diff --git a/docs/readme.md b/docs/readme.md index fb4ef6b6..2ef1aa96 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -1,5 +1,4 @@ -Documentation -============= +# Documentation This section covers the main parts of **Alice Linux**: installation, package management, networking, service supervision, etc. diff --git a/docs/using_autils.md b/docs/using_autils.md new file mode 100644 index 00000000..bbf2ce69 --- /dev/null +++ b/docs/using_autils.md @@ -0,0 +1,245 @@ +# Using autils + +autils is a collection of POSIX shell scripts for source-based package management on Alice Linux. + +For full command details, see the man pages: `man apkg`, `man reposync`, etc. + +## Installation + +```sh +make install +``` + +This installs all scripts to `/usr/bin` and man pages to `/usr/share/man/man8`. Override with: + +```sh +make install DESTDIR=/tmp/root PREFIX=/usr/local +``` + +## Core concepts + +The package manager, **apkg**, builds packages from source using `abuild` recipe files and installs them as `.spm` packages via the **spm**(8) backend. Package recipes live in git repositories referenced by the `APKG_REPO` environment variable. + +Configuration is done through environment variables: there is no config file. + +## Basic usage + +### Building a package + +From inside a recipe directory: + +```sh +cd /path/to/repo/mypkg +apkg +``` + +This fetches sources, verifies checksums, builds, and creates a `.spm` in `$APKG_PACKAGE_DIR`. + +### Installing and upgrading + +```sh +apkg -i mypkg # build and install +apkg -i # same, from inside the recipe directory +apkg -I firefox # install with automatic dependency resolution +apkg -u mypkg # upgrade (rebuild and reinstall) +apkg -f mypkg # force rebuild even if .spm already exists +apkg -o mypkg # download sources only, don't build +``` + +### Removing packages + +```sh +apkg -r mypkg # remove a package +apkg-purge mypkg # show what would be removed (dry-run) +apkg-purge -p mypkg # remove package and its unneeded dependencies +``` + +### Searching and listing + +```sh +apkg -s icon # search packages by name pattern +apkg -s -v icon # search with version info +apkg -a # list all installed packages +apkg -a -v # list installed packages with versions +apkg -S libpng.so # find which package owns a file +apkg -l # list outdated packages on the system +``` + +### Dependency queries + +```sh +apkg -d mypkg # list direct dependencies of a package +apkg -D mypkg # list all dependencies recursively, in install order +apkg -j mypkg # list packages that depend on mypkg +``` + +### System upgrade + +```sh +apkg -U +``` + +This checks all installed packages for outdated versions, resolves the full dependency tree, installs any new packages, then upgrades existing ones. Set `APKG_NOPROMPT=1` to skip the confirmation prompt (useful for scripting). Packages listed in `APKG_MASK` are skipped. + +### Checksums and file lists + +```sh +apkg -g mypkg # regenerate .shasum file +apkg -k mypkg # regenerate .files list from the .spm +``` + +### Triggers + +After installing or upgrading packages, apkg can refresh system caches: + +```sh +apkg -t # run triggers for all installed packages +apkg -t mypkg # run only triggers relevant to mypkg +``` + +Triggers include: fontconfig cache, GDK-Pixbuf loaders, GIO modules, GSettings schemas, GTK input method modules, icon theme cache, udev hardware database, X font indices, desktop MIME cache, and shared MIME database. Each trigger only fires if the package actually provides files that need it. + +## Helper scripts + +### Package inspection + +```sh +apkg-deps mypkg # show runtime library dependencies (via ldd) +apkg-foreign # list installed packages not found in any repo +apkg-orphan # list packages with no dependents installed +``` + +### Cleanup + +```sh +apkg-clean # list stale .spm and source files +apkg-clean | xargs rm # actually remove them +apkg-clean -p # list only stale packages +apkg-clean -s # list only stale sources +``` + +### Dependency maintenance + +```sh +apkg-redundantdeps mypkg # find transitive deps listed explicitly +apkg-redundantdeps # check all packages +apkg-redundantdeps -f mypkg # fix by removing redundant entries +``` + +### Scaffolding + +```sh +apkg-genabuild https://example.com/pkg-1.2.3.tar.gz +apkg-genabuild https://github.com/user/repo/archive/v1.0.tar.gz +``` + +Derives `name` and `version` from the URL and creates a directory with a skeleton `abuild`. Recognizes GitHub tag archives, PyPI packages (prefixes `python-`), and CPAN packages (prefixes `perl-`). An optional second argument overrides the name. + +## Standalone utilities + +### revdep: find broken library links + +Scans system binaries and libraries for missing shared library dependencies. Run after major upgrades, especially those with library version bumps. + +```sh +revdep # plain output +revdep -v # verbose progress +``` + +**Note:** revdep only reports problems; it does not rebuild anything. Use `apkg -f` to rebuild affected packages. + +### updateconf: merge .new config files + +When packages are upgraded, new default config files are installed with a `.new` suffix to avoid overwriting local changes. Run `updateconf` as root to interactively handle them: + +```sh +updateconf +``` + +For each `.new` file it shows a diff and prompts: +- **U**: update: replace current with new +- **D**: discard: delete the `.new` file, keep current +- **E**: edit: open current file in `$EDITOR` (default: `vi`) +- **K**: keep: leave both files as-is + +### reposync: sync git repositories + +Syncs git-based package repos using `REPOSYNC_*` environment variables: + +```sh +export REPOSYNC_CORE="https://codeberg.org/emmett1/alicelinux.git|main|/var/lib/alicelinux" +export REPOSYNC_EXTRA="https://codeberg.org/emmett1/extra.git|main|/var/lib/alicelinux/extra" +reposync +``` + +Options: +- **`-n`**: dry-run +- **`-l`**: log to `/var/log/reposync.log` +- **`-f`**: force fresh clones +- **`-h`**: help + +## Working in a chroot + +```sh +apkg-chroot /mnt/alice # enter interactive shell +apkg-chroot /mnt/alice apkg -i mypkg # run apkg inside chroot +``` + +Mounts `/dev`, `/proc`, `/sys`, `/run`, copies `/etc/resolv.conf`, and cleans up on exit. Must be run as root. + +## Environment variables + +### Core paths + +- **`APKG_REPO`** (default: `$PWD`): Space-separated repo directories, searched in order +- **`APKG_PACKAGE_DIR`** (default: `$PWD`): Where built `.spm` files are stored +- **`APKG_SOURCE_DIR`** (default: `$PWD`): Source tarball cache +- **`APKG_WORK_DIR`** (default: `$PWD`): Build working tree (extraction + fakeroot) +- **`APKG_ROOT`** (default: `/`): Alternative install root + +### Build behavior + +- **`APKG_NOPROMPT`**: Skip confirmation prompt in `-I` and `-U` +- **`APKG_KEEP_WORKDIR`**: Keep build tree on failure (for debugging) +- **`APKG_ALIAS`**: Dependency substitution: `real:alias` pairs (e.g. `openssl:libressl`) +- **`APKG_MASK`**: Packages to skip during `-l` and `-U` + +### Logging + +- **`APKG_LOG`**: Enable build logging +- **`APKG_LOG_DIR`**: Directory for log files (filename: `$name.log`) + +### Compiler + +- **`CFLAGS`**, **`CXXFLAGS`**: Compiler flags (used by cmake builds) +- **`CROSS_COMPILE`**: Prefix for `strip` (e.g. `x86_64-linux-musl-`) + +## Common workflows + +### Building and installing a new package + +```sh +cd $APKG_REPO +apkg-genabuild https://example.com/mypkg-1.0.tar.gz +cd mypkg +# edit abuild as needed, add depends file +apkg -I mypkg +``` + +### Full system maintenance + +```sh +reposync # sync repos +apkg -U # system upgrade +revdep # check for broken libraries +updateconf # merge config files +apkg-clean | xargs rm # clean up stale files +apkg-orphan # review packages to potentially remove +``` + +### Debugging a failed build + +```sh +APKG_KEEP_WORKDIR=1 apkg -f mypkg +# inspect $APKG_WORK_DIR/apkg-src-mypkg and apkg-pkg-mypkg +``` diff --git a/docs/writing_abuild.md b/docs/writing_abuild.md new file mode 100644 index 00000000..2a82d86b --- /dev/null +++ b/docs/writing_abuild.md @@ -0,0 +1,229 @@ +# Writing an abuild recipe + +An `abuild` file is a POSIX shell snippet that tells apkg how to build a package. The directory containing it must have the same name as the package. + +See `man apkg` for full details on all options and environment variables, and `man apkg-genabuild` for the recipe scaffolding tool. + +To quickly scaffold a new recipe from a source URL, use `apkg-genabuild`: + +```sh +apkg-genabuild https://example.com/mypkg-1.2.3.tar.gz +``` + +This creates the directory and a skeleton `abuild` with `name`, `version`, `release`, and `source` already populated. + +## Directory structure + +``` +mypkg/ + abuild - package recipe (required) + info - package metadata template (description, homepage, license, maintainer) + depends - dependency list, one per line (optional) + preinstall - script run before the package is built (optional) + postinstall - script run after the package is installed (optional) + .shasum - source checksums, auto-generated (regenerate with `apkg -g`) + .files - package file list, auto-generated (regenerate with `apkg -k`) +``` + +## Minimal recipe + +```sh +name=mypkg +version=1.2.3 +release=1 +source="https://example.com/$name-$version.tar.gz" +``` + +### Required variables + +- **`name`**: package name. Must match the directory name exactly. +- **`version`**: upstream version string. Use the `$name` and `$version` variables in the source URL so updates are easier. +- **`release`**: an incrementing integer starting at 1. Reset to 1 when `version` changes. Bump when the package needs a rebuild without a source change. + +## Source formats + +The `source` variable accepts a whitespace-separated list. Five formats are supported: + +- **`https://example.com/pkg-1.0.tar.gz`**: A remote URL, downloaded with curl +- **`mypkg-1.0.tar.gz::https://example.com/v1.0.tar.gz`**: Custom local filename for a remote URL +- **`https://example.com/pkg.tar.gz::noextract`**: Download but do not unpack +- **`my-file`**: A local file in the recipe directory (not downloaded) +- (empty): Create a meta/dummy package with only `/usr` + +Multiple sources can be specified: + +```sh +source="https://example.com/$name-$version.tar.gz + fix-build.patch + default-config::noextract" +``` + +If `source` is empty, apkg creates a dummy package: useful for meta packages that exist only to pull in dependencies. + +## Optional variables + +### Build control + +- **`build_type`**: force a specific build system instead of auto-detection. One of: `meson_build`, `configure_build`, `cmake_build`, `python_build`, `perlmodule_build`, `makefile_build`. +- **`build_dir`**: subdirectory within the extracted source tree to enter before building. Useful when a tarball extracts into a differently-named directory. +- **`build_opt`**: extra flags appended to the build system command. The defaults (`--prefix=/usr`, `--sysconfdir=/etc`, etc.) are always included; this adds on top. +- **`skip_patch`**: set to `1` to skip automatic patch application. Use this if you need to call `apply_patch` manually from `build()`. +- **`patch_opt`**: options for `patch(1)`. Default: `-p1`. + +### Package content control + +- **`keep_static`**: set to keep `*.a` static libraries (removed by default). +- **`keep_libtool`**: set to keep `*.la` libtool archives (removed by default). +- **`keep_locale`**: set to keep locale files in `/usr/share/locale` and `/usr/lib/locale`. +- **`keep_doc`**: set to keep documentation in `/usr/share/doc` and `/usr/doc`. +- **`no_strip`**: set to skip ELF binary and library stripping. + +### Runit services + +- **`sv`**: service files to install into `/etc/sv`. Accepts: + - `run` → `/etc/sv/$name/run` + - `finish` → `/etc/sv/$name/finish` + - `<name>.run` → `/etc/sv/<name>/run` + - `<name>.finish` → `/etc/sv/<name>/finish` + - `<name>.<ext>` → `/etc/sv/<name>/<ext>` + +```sh +sv="run finish mydaemon.run mydaemon.finish" +``` + +## Build hooks + +### Custom build function + +If a `build()` function is defined, it completely replaces the auto-detected build system. Two variables are available: + +- **`$SRC`**: where sources were extracted +- **`$PKG`**: the fakeroot directory where files must be installed + +Several `DESTDIR`-style variables are pre-exported: `DESTDIR`, `DEST_DIR`, `INSTALLROOT`, `install_root`, `INSTALL_ROOT`. + +```sh +build() { + cd "$SRC/$name-$version" + ./configure --prefix=/usr --sysconfdir=/etc + make + make DESTDIR="$PKG" install +} +``` + +`build()` runs with `set -ex`, so the script exits on any error and prints each command. + +### Pre/post build hooks + +Without a `build()` function, you can use `prebuild()` and `postbuild()`: + +```sh +prebuild() { + sed -i 's/broken/fixed/g' src/whatever.c +} + +postbuild() { + mv "$PKG/usr/bin/wrongname" "$PKG/usr/bin/rightname" +} +``` + +The execution order is: `prebuild()` → auto-detected build system → `postbuild()`. + +## Build system auto-detection + +When no `build()` is defined and no `build_type` is set, apkg checks for these files in order: + +1. `meson.build`: meson with LTO, PIE, `wrap_mode=nodownload`, `buildtype=plain` +2. `configure`: autotools `./configure --prefix=/usr --sysconfdir=/etc ...` +3. `CMakeLists.txt`: cmake with `Release` build type, prefers ninja +4. `setup.py`: `python3 setup.py build && install --root=$PKG` +5. `Makefile.PL`: `perl Makefile.PL && make && make install` +6. `Makefile` / `makefile` / `GNUmakefile`: raw make with standard variables + +The exact flags for each build system are documented in `doc/defaultbuildopts`. + +## Post-build processing + +After compilation, apkg automatically: + +- Compresses man pages (man1–man8 only, gzip) and info pages +- Removes common conflict files: `fonts.dir`, `fonts.scale`, `perllocal.pod`, `charset.alias` +- Removes static libraries (`*.a`), libtool archives (`*.la`), locales, and docs unless the corresponding `keep_*` variable is set +- Strips ELF binaries (`--strip-all`), shared objects (`--strip-unneeded`), and static archives (`--strip-debug`) unless `no_strip` is set +- Installs runit service files from the `sv` variable + +## The info file + +`apkg-genabuild` creates an `info` file alongside the `abuild` with package metadata: + +``` +description: +homepage: +license: +maintainer: name <name at mail dot com> +``` + +Fill in each field as appropriate. The `maintainer` line uses the format `name <email>`. + +## The depends file + +One dependency per line. Lines starting with `#` are comments. Dependencies are just package names: no version constraints. + +``` +# Direct dependencies of mypkg +zlib +libpng +freetype +``` + +Dependencies are recursive: when installing with `-I`, apkg will resolve the full tree. Only list direct dependencies; transitive ones are handled automatically. Use `apkg-redundantdeps` to find and clean up transitive entries. + +## preinstall / postinstall scripts + +These are optional executable scripts in the recipe directory: + +- **`preinstall`**: runs before the package is built (only during `apkg -i` or `apkg -u`). Good for pre-flight checks or preparing the system. +- **`postinstall`**: runs after the package is installed or upgraded. Good for one-time setup that can't be done at build time. + +If `APKG_ROOT` is set (alternative install root), these scripts run inside a chroot. + +## Checksums and file lists + +- **`.shasum`**: sha3sum of each source file, auto-generated on first build. Regenerate with `apkg -g <pkg>`. +- **`.files`**: sorted list of every file in the built `.spm`, auto-generated after packaging. Regenerate with `apkg -k <pkg>`. Used by `apkg -S` for file search. + +## Complete example + +```sh +name=hello +version=2.12.1 +release=1 +source="https://ftp.gnu.org/gnu/hello/$name-$version.tar.gz" + +build() { + cd "$SRC/$name-$version" + ./configure --prefix=/usr + make + make DESTDIR="$PKG" install +} +``` + +With a `depends` file: + +``` +zlib +``` + +With a `postinstall` script: + +```sh +#!/bin/sh +echo "hello was installed!" +``` + +## Tips + +- Use `apkg-genabuild <url>` to scaffold a recipe from a source URL quickly. +- Use `$name` and `$version` in source URLs so bumping the version only requires changing two variables. +- Patches (`.patch` / `.diff` files) listed in `source` are applied automatically with `patch -p1` before the build. Use `patch_opt` to change the strip level. +- Set `APKG_KEEP_WORKDIR=1` in your environment to inspect the build tree when debugging a failed build. |