arch-wiki-md-repo
Version:
All arch-wiki articles in markdown format, updated every two days.
153 lines (90 loc) • 6.45 kB
Markdown
## Contents
* [1 Introduction](#Introduction)
* [2 Why](#Why)
* [3 Convenience Way](#Convenience_Way)
* [4 Classic Way](#Classic_Way)
* [4.1 Setting Up A Chroot](#Setting_Up_A_Chroot)
* [4.1.1 Custom pacman.conf](#Custom_pacman.conf)
* [4.2 Building in the Chroot](#Building_in_the_Chroot)
* [4.3 Manual package installation](#Manual_package_installation)
* [4.4 Installation after building](#Installation_after_building)
* [5 Handling Major Rebuilds](#Handling_Major_Rebuilds)
## Introduction
This article is part of the [DeveloperWiki](/index.php/DeveloperWiki "DeveloperWiki").
## Why
Building in a clean chroot prevents missing dependencies in packages, whether due to unwanted linking or packages missing in the depends array in the PKGBUILD. It also allows users to build a package for the stable repositories (core, extra, community) while having packages from [testing] installed.
## Convenience Way
To quickly build a package in a clean chroot without any further tinkering, one can use the helper scripts from the [devtools](https://www.archlinux.org/packages/?name=devtools) package.
These helper scripts should be called in the same directory where the PKGBUILD is, just like with makepkg. For instance, `extra-x86_64-build` automatically sets up a chroot from a clean chroot matrix in `/var/lib/archbuild`, updates it, and builds a package for the extra repository. For multilib builds there is just `multilib-build` without an architecture. Consult the table below for information on which script to use when building for a specific repository and architecture.
The `-c` parameter resets the chroot matrix, which can be useful in case of breakage. It is not needed for building in a clean chroot.
**Note:** [core] is omitted because those packages are required to go through [testing] first before landing in [core].
**Note:** If the objective is to build a [core] package for your own local usage, it may be desirable to use the stable repositories instead of the testing. In this case you may simply use the extra build scripts.
| Target repository | Architecture | Build script to use | Pacman configuration file used |
| extra / community | x86_64 | extra-x86_64-build | /usr/share/devtools/pacman-extra.conf |
| testing / community-testing | x86_64 | testing-x86_64-build | /usr/share/devtools/pacman-testing.conf |
| staging / community-staging | x86_64 | staging-x86_64-build | /usr/share/devtools/pacman-staging.conf |
| multilib | x86_64 | multilib-build | /usr/share/devtools/pacman-multilib.conf |
| multilib-testing | x86_64 | multilib-testing-build | /usr/share/devtools/pacman-multilib-testing.conf |
| multilib-staging | x86_64 | multilib-staging-build | /usr/share/devtools/pacman-multilib-staging.conf |
## Classic Way
### Setting Up A Chroot
The [devtools](https://www.archlinux.org/packages/?name=devtools) package provides tools for creating and building within clean chroots. Install it if not done already.
To make a clean chroot, create a directory in which the chroot will reside. For example, `$HOME/chroot`.
```
$ mkdir ~/chroot
```
Define the `CHROOT` variable:
```
$ CHROOT=$HOME/chroot
```
Now create the chroot (the sub directory `root` is required because the `$CHROOT` directory will get other sub directories for clean working copies):
```
# mkarchroot $CHROOT/root base-devel
```
**Note:** One can also define the `CHROOT` variable in `$HOME/.bashrc` using the export command if the location is to be repeatedly used.
**Note:** On [btrfs](/index.php/Btrfs "Btrfs") disks, the chroot is created as a subvolume, so you have to remove it by removing the subvolume with `# btrfs subvolume delete $CHROOT/root`.
Edit `~/.makepkg.conf` to set the packager name and any makeflags. Also adjust the [mirrorlist](/index.php/Pacman#Repositories_and_mirrors "Pacman") in `$CHROOT/root/etc/pacman.d/mirrorlist` and enable the [testing](/index.php/Testing "Testing") repository in `$CHROOT/root/etc/pacman.conf`, if desired.
**Note:** The `~` and `$HOME` variable are resolved to `/root/` by the *makechrootpkg* script (described below).
#### Custom pacman.conf
Alternatively, provide a custom `pacman.conf` and `makepkg.conf` with the following:
```
# mkarchroot -C <pacman.conf> -M <makepkg.conf> $CHROOT/root base-devel
```
**Warning:** Using a custom `pacman.conf` or `makepkg.conf` during the initial creation of clean chroot can result in unintended custom adjustments to the chroot environment. *Use with caution.*
### Building in the Chroot
Firstly, make sure the chroot is up to date with:
```
# arch-nspawn $CHROOT/root pacman -Syu
```
Then, to build a package in the chroot, run the following from the dir containing the PKGBUILD:
```
$ makechrootpkg -c -r $CHROOT
```
Passing the -c flag to makechrootpkg ensures that the working chroot (named `$CHROOT/$USERNAME`) is cleaned before building starts.
### Manual package installation
Packages can be installed manually to the working chroot by using:
```
# makechrootpkg -r $CHROOT -I package-1.0-1-x86_64.pkg.tar.xz
```
If done from a directory that contains a PKGBUILD, the package will then be built. Avoid being in such a directory if you want to just install the package.
### Installation after building
Tell makechrootpkg to simply install a package to the rw layer of the chroot after building by passing the -i arg. Unrecognized args get passed to makepkg, so this calls `makepkg` with the -i arg.
```
# makechrootpkg -r $CHROOT -- -i
```
## Handling Major Rebuilds
The cleanest way to handle a major rebuild is to use the [staging] repositories. Build the first package against [extra] and push it to [staging]. Then rebuild all following packages against [staging] and push them there.
If you can't use [staging], you can build against custom packages using a command like this:
```
# extra-x86_64-build -- -I ~/packages/foobar/foobar-2-1-any.pkg.tar.xz
```
You can specify more than one package to be installed using multiple -I arguments.
A simpler, but dirtier way to handle a major rebuild is to install all built packages in the chroot, never cleaning it. Build the first package using:
```
# extra-x86_64-build
```
And build all following packages using:
```
# makechrootpkg -n -r /var/lib/archbuild/extra-x86_64
```
Running namcap (the -n argument) implies installing the package in the chroot. *-build also does this by default.