Jump to content

# makepkg-optimize

From ArchWiki

Related articles

- DeveloperWiki:Building in a clean chroot
- Arch User Repository

makepkg-optimizeAUR is a collection of supplemental tidy, buildenv, and executable scripts for pacman which provide macros for several kinds of optimization in the `build()` and `package()` stages.

Note As with any package in the Arch User Repository, makepkg-optimizeAUR has no official support. You should read, and you may post comments on its AUR page.

## Installation

Install makepkg-optimizeAUR and, to make available optimizations requiring them, install backends: openmp, upx, optipng, svgo, and polly.

## Configuration

makepkg-optimizeAUR generates a redundant configuration file, `/etc/makepkg-optimize.conf`, from your current makepkg.conf(5) configuration.

This file lists supplementary COMPILE FLAGS, BUILD ENVIRONMENT options, GLOBAL PACKAGE OPTIONS, PACKAGE OUTPUT options, and COMPRESSION DEFAULTS, all of which are disabled by default.

## Build an optimized package

Warning Some packages may fail to build with certain optimizations and over-optimization may cause problems for some programs--such as decreased performance and segmentation faults.

After selecting your preferred optimizations, pass the configuration file when building:

    $ makepkg -c --config /etc/makepkg-optimize.conf

Tip Use `-c` with `makepkg` to prevent packages reusing stale optimization flags. See Makepkg#Usage.
Note Profile-guided optimization requires that a package be built and installed twice. The first phase initiates profile generation in `$PROFDEST/pkgbase.gen`; the second moves them to `$PROFDEST/pkgbase.used` and applies them.

## Build an optimized package in a clean chroot

Alternatively, `makepkg-optimize` can be used to build optimized packages within a chroot.

### Chroot setup

After setting up a chroot, a few additional steps are needed.

#### Install makepkg-optimize and backends

First, install some of the backends for the optimization macros to the base chroot:

    $ arch-nspawn "$CHROOT"/root pacman -S openmp upx optipng polly

Then download and build makepkg-optimizeAUR and svgo.

To install them in the base chroot, copy their package files into it and install them, e.g.:

    # cp svgo-1.2.2-2-any.pkg.tar.xz "$CHROOT"/root/root/
    $ arch-nspawn "$CHROOT"/root pacman -U /root/svgo-1.2.2-2-any.pkg.tar.xz

Warning This voids the warranty on your "clean" chroot!

### Using the chroot

#### Build a package

First, edit `$CHROOT/root/etc/makepkg-optimize.conf` and select your preferred optimizations.

When building, pass the configuration file to `makepkg`:

    $ makechrootpkg -c -r "$CHROOT" -- -c --config /etc/makepkg-optimize.conf

##### Building with PGO

The `pgo` option for `BUILDENV` enables either generation or application of profiles, depending on if this is the first or second build of the package with this flag enabled. Clean chroot building complicates this because the software is run outside of the chroot to generate profiles, but the profiles need to be applied from inside the chroot when recompiling later. The solution is to bridge the three filesystems with a bind mounted folder.

###### Create a PGO cache

Create and bind a folder to store profiles:

    # mkdir -m 777 {"$CHROOT"/{root,"$USER"},}/mnt/pgo
    # mount -o bind {,"$CHROOT"/root}/mnt/pgo
    # mount -o bind "$CHROOT"/{root,"$USER"}/mnt/pgo

Tip Use fstab to bind these folders at boot.

    #PGODEST
    /full/path/to/$CHROOT/$USER/mnt/pgo/ /mnt/pgo/ none bind,x-gvfs-hide 0 0
    /mnt/pgo/ /full/path/to/$CHROOT/root/mnt/pgo/ none bind,x-gvfs-hide 0 0

Note Type out the full path to the chroot pgo directories, without using any $VARIABLES

Edit `$CHROOT/root/etc/makepkg-optimize.conf` and set `PROFDEST=/mnt/pgo`.

###### Profile a program

Build, then install the package and test-run its executables.

Note Profiles are generated on program `exit()`. Persistent daemons, such as systemd, may require a reboot to produce profiles.

After thoroughly utilizing the software, close it, then rebuild and reinstall its package.

Category:

- Package management

makepkg-optimize
Add topic