aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--carbslinux.texi1535
1 files changed, 1535 insertions, 0 deletions
diff --git a/carbslinux.texi b/carbslinux.texi
new file mode 100644
index 0000000..d99c49d
--- /dev/null
+++ b/carbslinux.texi
@@ -0,0 +1,1535 @@
+\input texinfo @c -*- texinfo -*-
+@c %**start of header
+@setfilename carbslinux.info
+@settitle Carbs Linux User Manual
+@documentencoding UTF-8
+@documentlanguage en
+@c %**end of header
+
+@copying
+Copyright @copyright{} 2020 Cem Keylan
+
+@quotation
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3 or
+any later version published by the Free Software Foundation; with no
+Invariant Sections, with no Front-Cover Texts and no Back-Cover Texts.
+A copy of the license is included in the section entitled "GNU Free
+Documentation License."
+
+@end quotation
+@end copying
+
+@dircategory System Administration
+@direntry
+* Carbs Linux: (carbslinux). Carbs Linux User Manual.
+@end direntry
+
+@finalout
+@titlepage
+@title Carbs Linux User Manual
+@author Cem Keylan
+@page
+@vskip 0pt plus 1filll
+@insertcopying
+@end titlepage
+
+@contents
+
+@ifnottex
+@node Top
+@top Carbs Linux User Manual
+
+This is the full documentation of @uref{https://carbslinux.org, Carbs Linux}, from the details of the
+distribution, installation, to the package manager. It is not yet complete.
+
+@ifplaintext
+You can build and install the @command{info} package in order to view this
+documentation with the info reader. It is divided into sections and easier to
+read.
+@end ifplaintext
+
+@ifhtml
+This documentation is also available in the distribution by the
+@command{carbs-docs} package, which can be read by either running
+@code{info carbslinux} or reading @file{/usr/share/doc/carbslinux.txt} with your
+favorite pager. You can install either the @command{info} or @command{texinfo}
+for doing the first.
+@end ifhtml
+@end ifnottex
+
+@menu
+* Installation:: Installing Carbs Linux
+* Init System:: Configure the init system
+* Contribution Guidelines:: Contribute to Carbs Linux
+* GNU Free Documentation License:: Your rights
+
+@detailmenu
+--- The Detailed Node Listing ---
+
+Installation
+
+* Preparing Environment:: Getting ready to chroot
+* Chroot:: Going inside your new system
+* System Configuration:: Customizing your system for personal use
+* Kernel:: Compiling your own kernel
+* Making your system bootable:: Installing bootloader and boot scripts
+* Post-installation:: Post-installation tasks
+
+Preparing Environment
+
+* Download:: Download the root filesystem tarball
+* Signature verification:: Verify the signature of the rootfs tarball
+* Extracting the tarball:: Extracting the root filesystem to the desired location
+* Obtain the chroot helper:: Download the script to easily chroot into the new filesystem
+
+Chroot
+
+* Setting up repositories:: Basic setup for obtaining repositories
+* Updating packages:: Update your system
+* Installing packages:: Install new software on your system
+* Essential Software:: Software you might want to include on your system
+* Obtaining the documentation:: Install documentation for offline use (optional)
+
+System Configuration
+
+* Configuring hostname:: Setting up system hostname (recommended)
+* Hosts file:: Setting up hosts file for networking (optional)
+
+Kernel
+
+* Obtaining the kernel sources:: Downloading the Linux source code
+* Kernel dependencies:: Requirements for building the kernel
+* Building the kernel:: Configure and compile the kernel
+
+Making your system bootable
+
+* Bootloader:: Install a bootloader for your system
+* Init scripts:: Install init scripts for your system
+* Fstab:: Generating fstab
+
+Post-installation
+
+* KISS repositories:: Acquire kiss repositories
+
+Init System
+
+* Configuring Init:: Ways to configure the init system
+* Changing Init Program:: Replace the default busybox init with something new
+
+Configuring Init
+
+* Kernel Command Line:: Configure init through the boot parameters
+* @samp{/etc/init/rc.conf} file: @samp{/etc/init/rcconf} file. Configure init through the configuration file
+* Init Hooks:: Configure init through hooks
+
+Changing Init Program
+
+* Rebooting after changing init:: Ways to reboot after replacing the init system
+
+Contribution Guidelines
+
+* Conventions:: Conventions of the distribution
+
+Conventions
+
+* Shell Conventions:: Conventions for shell scripts
+* Repository Conventions:: Conventions for repository build scripts
+
+@end detailmenu
+@end menu
+
+@node Installation
+@chapter Installation
+
+These are the step-by-step instructions for installing Carbs Linux. It can be
+acquired as plain-text to be viewed offline with a pager from
+@uref{https://carbslinux.org/docs/install.txt}.
+
+@menu
+* Preparing Environment:: Getting ready to chroot
+* Chroot:: Going inside your new system
+* System Configuration:: Customizing your system for personal use
+* Kernel:: Compiling your own kernel
+* Making your system bootable:: Installing bootloader and boot scripts
+* Post-installation:: Post-installation tasks
+@end menu
+
+@node Preparing Environment
+@section Preparing Environment
+
+To install Carbs Linux, you will need a Live Linux ISO@. For that purpose, you
+can obtain a Gentoo or Void Linux live image. You can follow their instructions
+to boot and setup your network.
+
+You will need the following programs in order to install Carbs Linux:
+
+@itemize
+@item
+tar
+@item
+wget
+@item
+xz
+@item
+some form of base utilities (coreutils, sbase, busybox, etc.)
+@end itemize
+
+Rest of these instructions will assume that you have set all of these up, and
+will continue on that point.
+
+@menu
+* Download:: Download the root filesystem tarball
+* Signature verification:: Verify the signature of the rootfs tarball
+* Extracting the tarball:: Extracting the root filesystem to the desired location
+* Obtain the chroot helper:: Download the script to easily chroot into the new filesystem
+@end menu
+
+@node Download
+@subsection Download
+
+First, we need to download the rootfs tarball. You can do the following in order
+to obtain the rootfs. If you are using an i686 machine, replace the @samp{x86_64}
+with @samp{i686}. We are setting this in a URL variable so that we don't have to
+write it every time.
+
+@example
+wget $URL/carbs-rootfs.tar.xz.sha256
+sha256sum -c carbs-rootfs.tar.xz.sha256
+@end example
+
+@node Signature verification
+@subsection Signature verification
+
+It is highly recommended to verify the signature of the tarball. You will need
+GPG for this.
+
+@example
+wget $URL/carbs-rootfs.tar.xz.sig
+gpg --recv-keys FF484BDFEFCEF8FF
+gpg --verify carbs-rootfs.tar.xz.sig
+@end example
+
+@node Extracting the tarball
+@subsection Extracting the tarball
+
+You will need to extract the tarball to your desired location. For partitioning,
+you can follow @uref{https://wiki.archlinux.org/index.php/Partitioning, this guide}. This will assume that you will be mounting your root
+partition to @samp{/mnt}.
+
+@example
+mount /dev/sdx1 /mnt
+tar xf carbs-rootfs.tar.xz -C /mnt
+@end example
+
+@node Obtain the chroot helper
+@subsection Obtain the chroot helper
+
+You can obtain the @samp{cpt-chroot} script in order to do a simple chroot into your
+new root filesystem.
+
+@example
+wget https://dl.carbslinux.org/distfiles/cpt-chroot
+chmod a+x cpt-chroot
+@end example
+
+@node Chroot
+@section Chroot
+
+Chroot into Carbs Linux!
+
+@example
+./cpt-chroot /mnt
+@end example
+
+@menu
+* Setting up repositories:: Basic setup for obtaining repositories
+* Updating packages:: Update your system
+* Installing packages:: Install new software on your system
+* Essential Software:: Software you might want to include on your system
+* Obtaining the documentation:: Install documentation for offline use (optional)
+@end menu
+
+@node Setting up repositories
+@subsection Setting up repositories
+
+Newest tarballs do not come with repositories, so you will need to manually
+obtain them, and set your @samp{CPT_PATH} environment variable. Carbs Linux
+repositories can either be obtained by @samp{git} or @samp{rsync}. While rsync
+repositories are overall faster and smaller, git offers the whole history of the
+repository and a means to manipulate your repository as you like it. If you want
+to obtain the git repository, you will need to install @samp{git} itself.
+
+The following guide will assume that you put the repositories into @samp{~/repos/}
+directory, but you can put the repositories into any directory you want. So go
+ahead and create that directory:
+
+@example
+mkdir -p $HOME/repos
+@end example
+
+@enumerate
+@item
+Obtaining from git
+
+
+Carbs Linux git repositories can be found both from the main server and GitHub
+(mirror). Here are both their repository links. You can clone any of them.
+
+@itemize
+@item
+git://git.carbslinux.org/repository
+@item
+@uref{https://github.com/carbslinux/repository}
+@end itemize
+
+@example
+git clone git://git.carbslinux.org/repository $HOME/repos/carbs
+@end example
+
+@item
+Obtaining from rsync
+
+
+Carbs Linux rsync repositories live in rsync://carbslinux.org/repo. In
+order to obtain it, run the following:
+
+@example
+rsync -avc rsync://carbslinux.org/repo $HOME/repos/carbs
+@end example
+
+@item
+Making the package manager use the repositories
+
+
+In your shell's configuration file, or in your @samp{~/.profile} file, add the
+following lines:
+
+@example
+CPT_PATH=$HOME/repos/carbs/core
+CPT_PATH=$CPT_PATH:$HOME/repos/carbs/extra
+CPT_PATH=$CPT_PATH:$HOME/repos/carbs/xorg
+CPT_PATH=$CPT_PATH:$HOME/repos/carbs/community
+export CPT_PATH
+@end example
+@end enumerate
+
+@node Updating packages
+@subsection Updating packages
+
+It is good practice to make sure your system is up to date, especially before
+building new packages. If there is an update for the package manager you will
+need to update twice.
+
+@example
+cpt-update && cpt-update
+@end example
+
+@node Installing packages
+@subsection Installing packages
+
+Since you are operating on a really small base, you might need to build and
+install new programs to extend the functionality of your system. In order to
+build and install packages new packages in Carbs, you need to execute the
+following. "Package" is not actually a package and is given as an example.
+
+@example
+cpt-build package
+cpt-install package
+@end example
+
+@node Essential Software
+@subsection Essential Software
+
+Here is a list of software that you might want to have on your system.
+
+@strong{BOOTLOADERS}
+
+@itemize
+@item
+efibootmgr
+@item
+grub
+@end itemize
+
+@strong{FILESYSTEMS}
+
+@itemize
+@item
+e2fsprogs
+@item
+dosfstools
+@item
+ntfs-3g
+@end itemize
+
+@strong{NETWORKING}
+
+@itemize
+@item
+dhcpcd
+@item
+wpa@math{_supplicant}
+@end itemize
+
+@strong{TEXT EDITORS}
+
+@itemize
+@item
+nano
+@item
+vim
+@item
+neatvi
+@item
+emacs
+@item
+emacs-nox (terminal-only version of emacs)
+@end itemize
+
+@strong{USER SHELLS}
+
+@itemize
+@item
+bash
+@item
+zsh
+@item
+oksh
+@item
+rc
+@end itemize
+
+@strong{POSIX BASE UTILITIES}
+
+@itemize
+@item
+busybox
+@item
+sbase
+@item
+coreutils
+@end itemize
+
+@strong{DOCUMENTATION}
+
+@itemize
+@item
+carbs-docs
+@item
+man-pages
+@item
+man-pages-posix
+@end itemize
+
+@node Obtaining the documentation
+@subsection Obtaining the documentation
+
+All the documentation for Carbs Linux can be found on a single info manual to be
+viewed offline. You can obtain texinfo or the info (standalone) package in order
+to view the documentation.
+
+@example
+# Install the documentation.
+cpt b carbs-docs && cpt i carbs-docs
+
+# Install either texinfo or the info package. We will be installing standalone info
+# as it doesn't need perl.
+cpt b info && cpt i info
+
+# You can then run info and navigate through the documentation.
+info carbslinux
+@end example
+
+@node System Configuration
+@section System Configuration
+
+After you have finished installing some extra packages, you can configure your
+system to your liking.
+
+@menu
+* Configuring hostname:: Setting up system hostname (recommended)
+* Hosts file:: Setting up hosts file for networking (optional)
+@end menu
+
+@node Configuring hostname
+@subsection Configuring hostname
+
+You might want to add a hostname, especially in a networked environment. Your
+hostname will default to 'carbslinux' unless you set this.
+
+@example
+echo your-hostname > /etc/hostname
+@end example
+
+@node Hosts file
+@subsection Hosts file
+
+You can edit your /etc/hosts file, which is the static lookup table for host
+names. By default, there are two entries for localhost which are OKAY@. You can
+replace the 'localhost' part of these entries to your hostname.
+
+@example
+127.0.0.1 localhost.localdomain localhost
+::1 localhost.localdomain localhost ip6-localhost
+@end example
+
+@node Kernel
+@section Kernel
+
+Kernel isn't managed under the main repositories, even though you could package
+one for your personal use. Here is an @uref{https://github.com/cemkeylan/kiss-repository/tree/master/personal/linux, example kernel package}, which you will
+need to reconfigure for your specific setup if you want to make use of it.
+
+@menu
+* Obtaining the kernel sources:: Downloading the Linux source code
+* Kernel dependencies:: Requirements for building the kernel
+* Building the kernel:: Configure and compile the kernel
+@end menu
+
+@node Obtaining the kernel sources
+@subsection Obtaining the kernel sources
+
+You can visit the @uref{https://kernel.org} website to choose a kernel that you want
+to install. Though only the latest stable and longterm (LTS) versions are
+supported.
+
+@example
+# Download the kernel and extract it
+wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz
+tar xf linux-5.9.1.tar.xz
+
+# Change directory into the kernel sources
+cd linux-5.9.1
+@end example
+
+@node Kernel dependencies
+@subsection Kernel dependencies
+
+In order to compile the kernel you will need to install some dependencies. You
+will need @samp{libelf} to compile the kernel. If you want to configure using the
+menu interface you will also need @samp{ncurses}.
+
+@example
+# The package manager asks to install if you are building more than one package,
+# so no need to run 'cpt i ...'
+cpt b libelf ncurses
+@end example
+
+In the vanilla kernel sources, you need perl to compile the kernel, but it can
+be easily patched out. You will need to apply the following patch. Patch was
+written by @uref{https://github.com/E5ten, E5ten}. You will need to obtain and apply the patch in the kernel
+source directory.
+
+@example
+wget https://dl.carbslinux.org/distfiles/kernel-no-perl.patch
+patch -p1 < kernel-no-perl.patch
+@end example
+
+@node Building the kernel
+@subsection Building the kernel
+
+Next step is configuring and building the kernel. You can check Gentoo's
+@uref{https://wiki.gentoo.org/wiki/Kernel/Configuration, kernel configuration guide} to learn more about the matter. Overall, Gentoo Wiki
+is a good place to learn about configuration according to your hardware. The
+following will assume a monolithic kernel.
+
+@example
+make menuconfig
+make
+install -Dm755 $(make -s image_name) /boot/vmlinuz-linux
+@end example
+
+@node Making your system bootable
+@section Making your system bootable
+
+In order to be able to boot your fresh system, wou will need an init-daemon,
+init-scripts and a bootloader. The init daemon is already provided by busybox,
+but you can optionally change it.
+
+@menu
+* Bootloader:: Install a bootloader for your system
+* Init scripts:: Install init scripts for your system
+* Fstab:: Generating fstab
+@end menu
+
+@node Bootloader
+@subsection Bootloader
+
+In the main repository, there is efibootmgr and grub to serve as bootloaders.
+efibootmgr can be used as a standalone bootloader, or can be used to install
+grub in a UEFI environment. efibootmgr is needed unless you are using a device
+without UEFI support (or you really want to use BIOS for a reason).
+
+@enumerate
+@item
+GRUB BIOS installation
+
+
+@example
+cpt b grub && cpt i grub
+grub-install --target=i386-pc /dev/sdX
+grub-mkconfig -o /boot/grub/grub.cfg
+@end example
+
+@item
+GRUB UEFI installation
+
+
+@example
+cpt b efibootmgr && cpt i efibootmgr
+cpt b grub && cpt i grub
+
+grub-install --target=x86_64-efi \
+ --efi-directory=esp \
+ --bootloader-id=CarbsLinux
+
+grub-mkconfig -o /boot/grub/grub.cfg
+@end example
+@end enumerate
+
+@node Init scripts
+@subsection Init scripts
+
+Only thing left to do is installing the init-scripts, and now you are almost
+ready to boot your system!
+
+@example
+cpt b carbs-init && cpt i carbs-init
+@end example
+
+@node Fstab
+@subsection Fstab
+
+You can now manually edit your fstab entry, or you can use the genfstab tool.
+If you want to use the tool, exit the chroot and run the following:
+
+@example
+wget https://github.com/cemkeylan/genfstab/raw/master/genfstab
+chmod +x genfstab
+./genfstab -U /mnt >> /mnt/etc/fstab
+@end example
+
+@node Post-installation
+@section Post-installation
+
+The base installation is now complete, you can now fine tune your system
+according to your needs. Rest of these instructions are completely optional.
+You can check the rest of the documentation to learn more about the system.
+
+@menu
+* KISS repositories:: Acquire kiss repositories
+@end menu
+
+@node KISS repositories
+@subsection KISS repositories
+
+While not 100% compatible with cpt, you can use kiss repositories in your
+system the same way you are using the distribution repositories. Here is an
+example for the KISS Linux Community repository.
+
+@node Init System
+@chapter Init System
+
+Carbs Linux init scripts are run by the init daemon (@samp{busybox} by default) on
+boot and shutdown processes. It also provides its own halting program named
+shalt. This provides a portable method that doesn't rely on non-POSIX external
+programs.
+
+@menu
+* Configuring Init:: Ways to configure the init system
+* Changing Init Program:: Replace the default busybox init with something new
+@end menu
+
+@node Configuring Init
+@section Configuring Init
+
+There are three ways you can change the behaviour of the init system. Those are:
+
+@itemize
+@item
+Kernel Command Line
+@item
+@samp{/etc/init/rc.conf} file
+@item
+Init Hooks
+@end itemize
+
+@menu
+* Kernel Command Line:: Configure init through the boot parameters
+* @samp{/etc/init/rc.conf} file: @samp{/etc/init/rcconf} file. Configure init through the configuration file
+* Init Hooks:: Configure init through hooks
+@end menu
+
+@node Kernel Command Line
+@subsection Kernel Command Line
+
+On GRUB, you can edit the kernel command line parameters, which will be parsed
+as variables on the init system. Not all of the parameters will be acted upon,
+but all of them will be set as variables on the init script. For example an
+example command line, and how it is interpreted.
+
+@example
+BOOT_IMAGE=/boot/vmlinuz root=/dev/sda2 rw loglevel=3 quiet
+@end example
+
+This command line will be parsed to set the following variables:
+
+@example
+BOOT_IMAGE=/boot/vmlinuz
+root=/dev/sda2
+rw=1
+loglevel=3
+quiet=1
+@end example
+
+Some of these variables, such as @samp{rw=/=ro}, @samp{loglevel}, and @samp{quiet}, will be
+used by the init system to change the behaviour of the startup.
+
+@node @samp{/etc/init/rcconf} file
+@subsection @samp{/etc/init/rc.conf} file
+
+However, the kernel command line isn't the only place to set your boot
+parameters. You can specify variables here as well, although note that the
+kernel command line always gets the priority for these variables since they can
+be set just before boot.
+
+@node Init Hooks
+@subsection Init Hooks
+
+Init hooks are for custom personal commands that the user may want to add to
+alter their boot. These can be used to load kernel modules, modify interfaces,
+and lot more. Those hooks are added to the @samp{/etc/init} directory with the
+hook name as the suffix. For example, a boot script will be placed as
+@samp{/etc/init/my-hook.boot}. Currently, there are 4 hooks that the user can use.
+
+@table @asis
+@item early-boot
+Run after pseudo-filesystems are mounted.
+@item boot
+Run before the boot stage is completed.
+@item pre.shutdown
+Run first when shutting down.
+@item umount
+Run just before filesystems are unmounted.
+@item post.shutdown
+Run just before the system is halted.
+@end table
+
+@node Changing Init Program
+@section Changing Init Program
+
+By default, Carbs Linux comes preinstalled with @samp{busybox-init}, but this can
+easily be replaced without any issues. Currently, available init systems are:
+
+@itemize
+@item
+@samp{sinit}
+@item
+@samp{busybox}
+@item
+@samp{runit}
+@item
+@samp{shinit}
+@end itemize
+
+This example is for runit, but it will work with all init systems packaged in the
+distribution repositories. See the @samp{cpt-alternatives(1)} manual page for more
+details.
+
+@example
+cpt a runit /usr/bin/init
+cpt a runit /usr/bin/poweroff
+cpt a runit /usr/bin/reboot
+@end example
+
+@menu
+* Rebooting after changing init:: Ways to reboot after replacing the init system
+@end menu
+
+@node Rebooting after changing init
+@subsection Rebooting after changing init
+
+After switching init systems, your running init system may not accept the
+new poweroff commands. You will need to reboot/poweroff using the running init's
+utilities for the new utilities to work. These commands are for the init system
+currently running on your system and not the one you are switching to.
+
+@multitable {aaaaaaaaaaaa} {aaaaaaaaaaaaaaaa}
+@headitem Program
+@tab Command
+@item busybox
+@tab @samp{busybox reboot}
+@item runit
+@tab @samp{runit-init 6}
+@item shinit/sinit
+@tab @samp{kill -s INT 1}
+@end multitable
+
+@node Contribution Guidelines
+@chapter Contribution Guidelines
+
+Thanks for taking your time to contribute! To maintain stylistic behaviour
+throughout the repositories, one must adhere to these conventions. Exceptions
+and changes may occur with good reasoning.
+
+@menu
+* Conventions:: Conventions of the distribution
+@end menu
+
+@node Conventions
+@section Conventions
+
+@macro contid{id}
+[@anchor{\id\}\id\]
+@end macro
+
+@macro sectid{id, sect}
+@strong{@contid{\id\} \sect\}
+@end macro
+
+@table @asis
+@item [@anchor{0010}0010]
+Try to keep the file readable.
+@table @asis
+@item [@anchor{0011}0011]
+Characters on a line shouldn't exceed 100 characters.
+@item [@anchor{0012}0012]
+Make sure you don't have code commented out during
+commit. Uncomment them or remove them completely.
+@item [@anchor{0013}0013]
+Do not add comments following the code, add them to the
+top of the code. It makes it harder to read, and lines longer. Here is an example:
+@end table
+
+@example
+# Good way of commenting.
+your code goes here
+
+your code goes here # Avoid this way of commenting.
+@end example
+@end table
+
+@menu
+* Shell Conventions:: Conventions for shell scripts
+* Repository Conventions:: Conventions for repository build scripts
+@end menu
+
+@node Shell Conventions
+@subsection Shell Conventions
+
+Shell is central to Carbs Linux projects. Most of the tools and packages are
+written in POSIX sh.
+
+@table @asis
+@item [@anchor{1010}1010]
+Use 4 spaces for indentation, don't use tabs.
+@item [@anchor{1020}1020]
+Make sure you don't use bash-specific code.
+@item [@anchor{1030}1030]
+Make sure you lint your code with @samp{shellcheck} and if
+you are new to POSIX sh, use @samp{checkbashisms}.
+@item [@anchor{1040}1040]
+Don't spawn new processes if you don't absolutely need
+to, especially during string manipulation.
+@table @asis
+@item [@anchor{1041}1041]
+Never use a program for text manupilation that isn't
+defined in the POSIX standard. This includes @samp{gawk} and @samp{perl}.
+@item [@anchor{1042}1042]
+Instead of @code{$(basename $file)}, use @code{$@{file##*@}}.
+@item [@anchor{1043}1043]
+Instead of @code{$(dirname $file)}, use @code{$@{file%/*@}}.
+@end table
+
+@example
+# This is the same thing as basename /path/to/test.asc .asc
+
+$ file=/path/to/test.asc file=$@{file##*/@} file=$@{file%.asc@}
+$ echo $file
+test
+@end example
+@item [@anchor{1050}1050]
+Instead of backticks, use @code{$(..)}.
+@end table
+
+@node Repository Conventions
+@subsection Repository Conventions
+
+Repository conventions are important in order to ensure every package resemble
+themselves. Here are the things to keep in mind:
+
+@table @asis
+@item [@anchor{2010}2010]
+Prefer tarballs over git packages unless there is a
+sensible reason. Here are some:
+@itemize
+@item
+Every patch is a new release. (See @uref{https://github.com/vim/vim, vim})
+@item
+There are no releases. (See @uref{https://git.suckless.org/sbase, sbase})
+@item
+Following a development branch.
+@item
+There has been a long time since the latest release, but upstream is far
+ahead.
+@end itemize
+@item [@anchor{2020}2020]
+Prefer sources without a dependency to @samp{automake}. There
+are usually distribution tarballs that are @samp{autoconf}'ed. Don't submit tarballs
+with an automake dependency unless you are @samp{sure} there is no alternative.
+@item [@anchor{2030}2030]
+Avoid these packages:
+@table @asis
+@item dbus
+Usually can be disabled by @code{--disable-dbus}.
+@item gettext
+Usually can be disabled by @code{--disable-nls}.
+@end table
+@item [@anchor{2040}2040]
+@itemize
+@item
+Always install a package to the @samp{/usr} prefix.
+@item
+All binaries should go to @samp{/usr/bin}, not @samp{/usr/sbin} or any other directory.
+@item
+All libraries should go to @samp{/usr/lib}.
+@end itemize
+@item [@anchor{2050}2050]
+All build files on the repository should be a POSIX
+shell script, and must start with @code{#!/bin/sh -e}.
+@end table
+
+The next section is about package templates that should be used in order to
+ensure stylistic consistency. Note that the option configurations shouldn't be
+taken literally, they are meant as examples.
+
+@enumerate
+@item
+Make [@anchor{2210}2210]
+
+
+@example
+#!/bin/sh -e
+
+make
+make DESTDIR="$1" PREFIX=/usr install
+@end example
+
+@item
+Configure/Make [@anchor{2211}2211]
+
+
+@example
+#!/bin/sh -e
+
+./configure \
+ --prefix=/usr \
+ --disable-option \
+ --enable-option
+
+make
+make DESTDIR="$1" install
+@end example
+
+@item
+Autoconf/Automake [@anchor{2212}2212]
+
+
+@xref{2020}
+
+@example
+#!/bin/sh -e
+
+autoreconf -fi
+
+./configure \
+ --prefix=/usr \
+ --disable-option \
+ --enable-option
+
+make
+make DESTDIR="$1" install
+@end example
+
+@item
+Meson [@anchor{2220}2220]
+
+
+@example
+#!/bin/sh -e
+
+export DESTDIR=$1
+
+meson \
+ --prefix=/usr \
+ -Doption=false \
+ -Doption2=true \
+ . output
+
+ninja -C output
+ninja -C output install
+@end example
+
+@item
+Cmake [@anchor{2230}2230]
+
+
+@example
+#!/bin/sh -e
+
+export DESTDIR=$1
+
+cmake -B build \
+ -DCMAKE_INSTALL_PREFIX=/usr \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DOPTION=ON
+
+cmake --build build
+cmake --install build
+@end example
+
+@item
+Go [@anchor{2240}2240]
+
+
+@example
+#!/bin/sh -e
+
+export GOPATH=$PWD/gopath
+trap "go clean -modcache" EXIT INT
+go mod vendor
+
+go build
+install -Dm755 program "$1/usr/bin/program"
+@end example
+
+@item
+Python [@anchor{2241}2241]
+
+
+@example
+#!/bin/sh -e
+
+python setup.py build
+python setup.py install --prefix=/usr --root="$1"
+@end example
+@end enumerate
+
+@node GNU Free Documentation License
+@appendix GNU Free Documentation License
+
+@center Version 1.3, 3 November 2008
+
+@display
+Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
+@uref{http://fsf.org/}
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+@end display
+
+@enumerate 0
+@item
+PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document @dfn{free}
+in the sense of freedom: to assure everyone the effective freedom
+to copy and redistribute it, with or without modifying it, either
+commercially or noncommercially. Secondarily, this License
+preserves for the author and publisher a way to get credit for
+their work, while not being considered responsible for
+modifications made by others.
+
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense.
+It complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for
+free software, because free software needs free documentation:
+a free program should come with manuals providing the same freedoms
+that the software does. But this License is not limited to
+software manuals; it can be used for any textual work, regardless
+of subject matter or whether it is published as a printed book. We
+recommend this License principally for works whose purpose is
+instruction or reference.
+
+@item
+APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium,
+that contains a notice placed by the copyright holder saying it can
+be distributed under the terms of this License. Such a notice
+grants a world-wide, royalty-free license, unlimited in duration,
+to use that work under the conditions stated herein. The
+"Document", below, refers to any such manual or work. Any member
+of the public is a licensee, and is addressed as "you". You accept
+the license if you copy, modify or distribute the work in a way
+requiring permission under copyright law.
+
+A "Modified Version" of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A "Secondary Section" is a named appendix or a front-matter section
+of the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall
+subject (or to related matters) and contains nothing that could
+fall directly within that overall subject. (Thus, if the Document
+is in part a textbook of mathematics, a Secondary Section may not
+explain any mathematics.) The relationship could be a matter of
+historical connection with the subject or with related matters, or
+of legal, commercial, philosophical, ethical or political position
+regarding them.
+
+The "Invariant Sections" are certain Secondary Sections whose
+titles are designated, as being those of Invariant Sections, in the
+notice that says that the Document is released under this License.
+If a section does not fit the above definition of Secondary then it
+is not allowed to be designated as Invariant. The Document may
+contain zero Invariant Sections. If the Document does not identify
+any Invariant Sections then there are none.
+
+The "Cover Texts" are certain short passages of text that are
+listed, as Front-Cover Texts or Back-Cover Texts, in the notice
+that says that the Document is released under this License.
+A Front-Cover Text may be at most 5 words, and a Back-Cover Text
+may be at most 25 words.
+
+A "Transparent" copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed
+of pixels) generic paint programs or (for drawings) some widely
+available drawing editor, and that is suitable for input to text
+formatters or for automatic translation to a variety of formats
+suitable for input to text formatters. A copy made in an otherwise
+Transparent file format whose markup, or absence of markup, has
+been arranged to thwart or discourage subsequent modification by
+readers is not Transparent. An image format is not Transparent if
+used for any substantial amount of text. A copy that is not
+"Transparent" is called "Opaque".
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, @LaTeX{} input format,
+SGML or XML using a publicly available DTD, and standard-conforming
+simple HTML, PostScript or PDF designed for human modification.
+Examples of transparent image formats include PNG, XCF and JPG@.
+Opaque formats include proprietary formats that can be read and
+edited only by proprietary word processors, SGML or XML for which
+the DTD and/or processing tools are not generally available, and
+the machine-generated HTML, PostScript or PDF produced by some word
+processors for output purposes only.
+
+The "Title Page" means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the
+material this License requires to appear in the title page. For
+works in formats which do not have any title page as such, "Title
+Page" means the text near the most prominent appearance of the
+work's title, preceding the beginning of the body of the text.
+
+The "publisher" means any person or entity that distributes copies
+of the Document to the public.
+
+A section "Entitled XYZ" means a named subunit of the Document
+whose title either is precisely XYZ or contains XYZ in parentheses
+following text that translates XYZ in another language. (Here XYZ
+stands for a specific section name mentioned below, such as
+"Acknowledgements", "Dedications", "Endorsements", or "History".)
+To "Preserve the Title" of such a section when you modify the
+Document means that it remains a section "Entitled XYZ" according
+to this definition.
+
+The Document may include Warranty Disclaimers next to the notice
+which states that this License applies to the Document. These
+Warranty Disclaimers are considered to be included by reference in
+this License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and
+has no effect on the meaning of this License.
+
+@item
+VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License
+applies to the Document are reproduced in all copies, and that you
+add no other conditions whatsoever to those of this License. You
+may not use technical measures to obstruct or control the reading
+or further copying of the copies you make or distribute. However,
+you may accept compensation in exchange for copies. If you
+distribute a large enough number of copies you must also follow the
+conditions in section 3.
+
+You may also lend copies, under the same conditions stated above,
+and you may publicly display copies.
+
+@item
+COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly
+have printed covers) of the Document, numbering more than 100, and
+the Document's license notice requires Cover Texts, you must
+enclose the copies in covers that carry, clearly and legibly, all
+these Cover Texts: Front-Cover Texts on the front cover, and
+Back-Cover Texts on the back cover. Both covers must also clearly
+and legibly identify you as the publisher of these copies. The
+front cover must present the full title with all words of the title
+equally prominent and visible. You may add other material on the
+covers in addition. Copying with changes limited to the covers, as
+long as they preserve the title of the Document and satisfy these
+conditions, can be treated as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto
+adjacent pages.
+
+If you publish or distribute Opaque copies of the Document
+numbering more than 100, you must either include a machine-readable
+Transparent copy along with each Opaque copy, or state in or with
+each Opaque copy a computer-network location from which the general
+network-using public has access to download using public-standard
+network protocols a complete Transparent copy of the Document, free
+of added material. If you use the latter option, you must take
+reasonably prudent steps, when you begin distribution of Opaque
+copies in quantity, to ensure that this Transparent copy will
+remain thus accessible at the stated location until at least one
+year after the last time you distribute an Opaque copy (directly or
+through your agents or retailers) of that edition to the public.
+
+It is requested, but not required, that you contact the authors of
+the Document well before redistributing any large number of copies,
+to give them a chance to provide you with an updated version of the
+Document.
+
+@item
+MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document
+under the conditions of sections 2 and 3 above, provided that you
+release the Modified Version under precisely this License, with the
+Modified Version filling the role of the Document, thus licensing
+distribution and modification of the Modified Version to whoever
+possesses a copy of it. In addition, you must do these things in
+the Modified Version:
+
+@enumerate A
+@item
+Use in the Title Page (and on the covers, if any) a title
+distinct from that of the Document, and from those of previous
+versions (which should, if there were any, be listed in the
+History section of the Document). You may use the same title as
+a previous version if the original publisher of that version
+gives permission.
+
+@item
+List on the Title Page, as authors, one or more persons or
+entities responsible for authorship of the modifications in the
+Modified Version, together with at least five of the principal
+authors of the Document (all of its principal authors, if it has
+fewer than five), unless they release you from this requirement.
+
+@item
+State on the Title page the name of the publisher of the
+Modified Version, as the publisher.
+
+@item
+Preserve all the copyright notices of the Document.
+
+@item
+Add an appropriate copyright notice for your modifications
+adjacent to the other copyright notices.
+
+@item
+Include, immediately after the copyright notices, a license
+notice giving the public permission to use the Modified Version
+under the terms of this License, in the form shown in the
+Addendum below.
+
+@item
+Preserve in that license notice the full lists of Invariant
+Sections and required Cover Texts given in the Document's
+license notice.
+
+@item
+Include an unaltered copy of this License.
+
+@item
+Preserve the section Entitled "History", Preserve its Title, and
+add to it an item stating at least the title, year, new authors,
+and publisher of the Modified Version as given on the Title
+Page. If there is no section Entitled "History" in the Document,
+create one stating the title, year, authors, and publisher of
+the Document as given on its Title Page, then add an item
+describing the Modified Version as stated in the previous
+sentence.
+
+@item
+Preserve the network location, if any, given in the Document
+for public access to a Transparent copy of the Document, and
+likewise the network locations given in the Document for
+previous versions it was based on. These may be placed in the
+"History" section. You may omit a network location for a work
+that was published at least four years before the Document
+itself, or if the original publisher of the version it refers
+to gives permission.
+
+@item
+For any section Entitled "Acknowledgements" or "Dedications",
+Preserve the Title of the section, and preserve in the section
+all the substance and tone of each of the contributor
+acknowledgements and/or dedications given therein.
+
+@item
+Preserve all the Invariant Sections of the Document, unaltered
+in their text and in their titles. Section numbers or the
+equivalent are not considered part of the section titles.
+
+@item
+Delete any section Entitled "Endorsements". Such a section may
+not be included in the Modified Version.
+
+@item
+Do not retitle any existing section to be Entitled
+"Endorsements" or to conflict in title with any Invariant
+Section.
+
+@item
+Preserve any Warranty Disclaimers.
+@end enumerate
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant. To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties---for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version. Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity. If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+@item
+COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under
+this License, under the terms defined in section 4 above for
+modified versions, provided that you include in the combination all
+of the Invariant Sections of all of the original documents,
+unmodified, and list them all as Invariant Sections of your
+combined work in its license notice, and that you preserve all
+their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy. If there are multiple Invariant Sections with the same name
+but different contents, make the title of each such section unique
+by adding at the end of it, in parentheses, the name of the
+original author or publisher of that section if known, or else
+a unique number. Make the same adjustment to the section titles in
+the list of Invariant Sections in the license notice of the
+combined work.
+
+In the combination, you must combine any sections Entitled
+"History" in the various original documents, forming one section
+Entitled "History"; likewise combine any sections Entitled
+"Acknowledgements", and any sections Entitled "Dedications". You
+must delete all sections Entitled "Endorsements."
+
+@item
+COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other
+documents released under this License, and replace the individual
+copies of this License in the various documents with a single copy
+that is included in the collection, provided that you follow the
+rules of this License for verbatim copying of each of the documents
+in all other respects.
+
+You may extract a single document from such a collection, and
+distribute it individually under this License, provided you insert
+a copy of this License into the extracted document, and follow this
+License in all other respects regarding verbatim copying of that
+document.
+
+@item
+AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other
+separate and independent documents or works, in or on a volume of
+a storage or distribution medium, is called an "aggregate" if the
+copyright resulting from the compilation is not used to limit the
+legal rights of the compilation's users beyond what the individual
+works permit. When the Document is included in an aggregate, this
+License does not apply to the other works in the aggregate which
+are not themselves derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half
+of the entire aggregate, the Document's Cover Texts may be placed
+on covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic
+form. Otherwise they must appear on printed covers that bracket
+the whole aggregate.
+
+@item
+TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of
+section 4. Replacing Invariant Sections with translations requires
+special permission from their copyright holders, but you may
+include translations of some or all Invariant Sections in addition
+to the original versions of these Invariant Sections. You may
+include a translation of this License, and all the license notices
+in the Document, and any Warranty Disclaimers, provided that you
+also include the original English version of this License and the
+original versions of those notices and disclaimers. In case of
+a disagreement between the translation and the original version of
+this License or a notice or disclaimer, the original version will
+prevail.
+
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to
+Preserve its Title (section 1) will typically require changing the
+actual title.
+
+@item
+TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense, or distribute it is void,
+and will automatically terminate your rights under this License.
+
+However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the
+copyright holder fails to notify you of the violation by some
+reasonable means prior to 60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from
+that copyright holder, and you cure the violation prior to 30 days
+after your receipt of the notice.
+
+Termination of your rights under this section does not terminate
+the licenses of parties who have received copies or rights from you
+under this License. If your rights have been terminated and not
+permanently reinstated, receipt of a copy of some or all of the
+same material does not give you any rights to use it.
+
+@item
+FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions of
+the GNU Free Documentation License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns. See
+@uref{http://www.gnu.org/copyleft/}.
+
+Each version of the License is given a distinguishing version
+number. If the Document specifies that a particular numbered
+version of this License "or any later version" applies to it, you
+have the option of following the terms and conditions either of
+that specified version or of any later version that has been
+published (not as a draft) by the Free Software Foundation. If
+the Document does not specify a version number of this License,
+you may choose any version ever published (not as a draft) by the
+Free Software Foundation. If the Document specifies that a proxy
+can decide which future versions of this License can be used, that
+proxy's public statement of acceptance of a version permanently
+authorizes you to choose that version for the Document.
+
+@item
+RELICENSING
+
+"Massive Multiauthor Collaboration Site" (or "MMC Site") means any
+World Wide Web server that publishes copyrightable works and also
+provides prominent facilities for anybody to edit those works.
+A public wiki that anybody can edit is an example of such
+a server. A "Massive Multiauthor Collaboration" (or "MMC")
+contained in the site means any set of copyrightable works thus
+published on the MMC site.
+
+"CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
+license published by Creative Commons Corporation,
+a not-for-profit corporation with a principal place of business in
+San Francisco, California, as well as future copyleft versions of
+that license published by that same organization.
+
+"Incorporate" means to publish or republish a Document, in whole
+or in part, as part of another Document.
+
+An MMC is "eligible for relicensing" if it is licensed under this
+License, and if all works that were first published under this
+License somewhere other than this MMC, and subsequently
+incorporated in whole or in part into the MMC, (1) had no cover
+texts or invariant sections, and (2) were thus incorporated prior
+to November 1, 2008.
+
+The operator of an MMC Site may republish an MMC contained in the
+site under CC-BY-SA on the same site at any time before August 1,
+2009, provided the MMC is eligible for relicensing.
+@end enumerate
+
+@page
+
+@anchor{ADDENDUM How to use this License for your documents}
+@appendixsec ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+@example
+Copyright (C) YEAR YOUR NAME.
+Permission is granted to copy, distribute and/or modify this document
+under the terms of the GNU Free Documentation License, Version 1.3
+or any later version published by the Free Software Foundation;
+with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
+Texts. A copy of the license is included in the section entitled ``GNU
+Free Documentation License''.
+@end example
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with@dots{}Texts."@tie{}line with this:
+
+@example
+with the Invariant Sections being LIST THEIR TITLES, with
+the Front-Cover Texts being LIST, and with the Back-Cover Texts
+being LIST.
+@end example
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License, to
+permit their use in free software.
+
+@bye \ No newline at end of file