--- arch-wiki: https://wiki.archlinux.org/title/Makepkg obj: application rev: 2024-12-19 --- # makepkg makepkg is a tool for creating [pacman](Pacman.md) packages based on [PKGBUILD](PKGBUILD.md) files. ## Configuration The system configuration is available in `/etc/makepkg.conf`, but user-specific changes can be made in `$XDG_CONFIG_HOME/pacman/makepkg.conf` or `~/.makepkg.conf`. Also, system wide changes can be made with a drop-in file `/etc/makepkg.conf.d/makepkg.conf`. It is recommended to review the configuration prior to building packages. > **Tip**: devtools helper scripts for building packages in a clean chroot use the `/usr/share/devtools/makepkg.conf.d/arch.conf` configuration file instead. ```sh #!/hint/bash # shellcheck disable=2034 # # /etc/makepkg.conf # ######################################################################### # SOURCE ACQUISITION ######################################################################### # #-- The download utilities that makepkg should use to acquire sources # Format: 'protocol::agent' DLAGENTS=('file::/usr/bin/curl -qgC - -o %o %u' 'ftp::/usr/bin/curl -qgfC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %u' 'http::/usr/bin/curl -qgb "" -fLC - --retry 3 --retry-delay 3 -o %o %u' 'https::/usr/bin/curl -qgb "" -fLC - --retry 3 --retry-delay 3 -o %o %u' 'rsync::/usr/bin/rsync --no-motd -z %u %o' 'scp::/usr/bin/scp -C %u %o') # Other common tools: # /usr/bin/snarf # /usr/bin/lftpget -c # /usr/bin/wget #-- The package required by makepkg to download VCS sources # Format: 'protocol::package' VCSCLIENTS=('bzr::breezy' 'fossil::fossil' 'git::git' 'hg::mercurial' 'svn::subversion') ######################################################################### # ARCHITECTURE, COMPILE FLAGS ######################################################################### # CARCH="x86_64" CHOST="x86_64-pc-linux-gnu" #-- Compiler and Linker Flags #CPPFLAGS="" CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions \ -Wp,-D_FORTIFY_SOURCE=3 -Wformat -Werror=format-security \ -fstack-clash-protection -fcf-protection \ -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer" CXXFLAGS="$CFLAGS -Wp,-D_GLIBCXX_ASSERTIONS" LDFLAGS="-Wl,-O1 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now \ -Wl,-z,pack-relative-relocs" LTOFLAGS="-flto=auto" #-- Make Flags: change this for DistCC/SMP systems MAKEFLAGS="-j8" #-- Debugging flags DEBUG_CFLAGS="-g" DEBUG_CXXFLAGS="$DEBUG_CFLAGS" ######################################################################### # BUILD ENVIRONMENT ######################################################################### # # Makepkg defaults: BUILDENV=(!distcc !color !ccache check !sign) # A negated environment option will do the opposite of the comments below. # #-- distcc: Use the Distributed C/C++/ObjC compiler #-- color: Colorize output messages #-- ccache: Use ccache to cache compilation #-- check: Run the check() function if present in the PKGBUILD #-- sign: Generate PGP signature file # BUILDENV=(!distcc color !ccache check !sign) # #-- If using DistCC, your MAKEFLAGS will also need modification. In addition, #-- specify a space-delimited list of hosts running in the DistCC cluster. #DISTCC_HOSTS="" #-- Specify a directory for package building. BUILDDIR=/tmp/makepkg ######################################################################### # GLOBAL PACKAGE OPTIONS # These are default values for the options=() settings ######################################################################### # # Makepkg defaults: OPTIONS=(!strip docs libtool staticlibs emptydirs !zipman !purge !debug !lto !autodeps) # A negated option will do the opposite of the comments below. # #-- strip: Strip symbols from binaries/libraries #-- docs: Save doc directories specified by DOC_DIRS #-- libtool: Leave libtool (.la) files in packages #-- staticlibs: Leave static library (.a) files in packages #-- emptydirs: Leave empty directories in packages #-- zipman: Compress manual (man and info) pages in MAN_DIRS with gzip #-- purge: Remove files specified by PURGE_TARGETS #-- debug: Add debugging flags as specified in DEBUG_* variables #-- lto: Add compile flags for building with link time optimization #-- autodeps: Automatically add depends/provides # OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge !debug lto) #-- File integrity checks to use. Valid: md5, sha1, sha224, sha256, sha384, sha512, b2 INTEGRITY_CHECK=(sha256) #-- Options to be used when stripping binaries. See `man strip' for details. STRIP_BINARIES="--strip-all" #-- Options to be used when stripping shared libraries. See `man strip' for details. STRIP_SHARED="--strip-unneeded" #-- Options to be used when stripping static libraries. See `man strip' for details. STRIP_STATIC="--strip-debug" #-- Manual (man and info) directories to compress (if zipman is specified) MAN_DIRS=({usr{,/local}{,/share},opt/*}/{man,info}) #-- Doc directories to remove (if !docs is specified) DOC_DIRS=(usr/{,local/}{,share/}{doc,gtk-doc} opt/*/{doc,gtk-doc}) #-- Files to be removed from all packages (if purge is specified) PURGE_TARGETS=(usr/{,share}/info/dir .packlist *.pod) #-- Directory to store source code in for debug packages DBGSRCDIR="/usr/src/debug" #-- Prefix and directories for library autodeps LIB_DIRS=('lib:usr/lib' 'lib32:usr/lib32') ######################################################################### # PACKAGE OUTPUT ######################################################################### # # Default: put built package and cached source in build directory # #-- Destination: specify a fixed directory where all packages will be placed PKGDEST=/home/packages #-- Source cache: specify a fixed directory where source files will be cached SRCDEST=/home/sources #-- Source packages: specify a fixed directory where all src packages will be placed SRCPKGDEST=/home/srcpackages #-- Log files: specify a fixed directory where all log files will be placed #LOGDEST=/home/makepkglogs #-- Packager: name/email of the person or organization building packages PACKAGER="John Doe " #-- Specify a key to use for package signing GPGKEY="" ######################################################################### # COMPRESSION DEFAULTS ######################################################################### # COMPRESSGZ=(gzip -c -f -n) COMPRESSBZ2=(bzip2 -c -f) COMPRESSXZ=(xz -c -z -) COMPRESSZST=(zstd -c -T0 -) COMPRESSLRZ=(lrzip -q) COMPRESSLZO=(lzop -q) COMPRESSZ=(compress -c -f) COMPRESSLZ4=(lz4 -q) COMPRESSLZ=(lzip -c -f) ######################################################################### # EXTENSION DEFAULTS ######################################################################### # PKGEXT='.pkg.tar.zst' SRCEXT='.src.tar.gz' ######################################################################### # OTHER ######################################################################### # #-- Command used to run pacman as root, instead of trying sudo and su #PACMAN_AUTH=() # vim: set ft=sh ts=2 sw=2 et: ``` ## Usage Make a package: ```shell makepkg ``` Make a package and install its dependencies: ```shell makepkg --syncdeps ``` Make a package, install its dependencies then install it to the system: ```shell makepkg --syncdeps --install ``` Make a package, but skip checking the source's hashes: ```shell makepkg --skipchecksums ``` Clean up work directories after a successful build: ```shell makepkg --clean ``` Verify the hashes of the sources: ```shell makepkg --verifysource ``` ## Options | Option | Description | | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `-A, --ignorearch` | Ignore a missing or incomplete arch field in the build script | | `-c, --clean` | Clean up leftover work files and directories after a successful build | | `-d, --nodeps` | Do not perform any dependency checks. This will let you override and ignore any dependencies required. There is a good chance this option will break the build process if all of the dependencies are not installed | | `-e, --noextract` | Do not extract source files or run the prepare() function (if present); use whatever source already exists in the $srcdir/ directory. This is handy if you want to go into $srcdir/ and manually patch or tweak code, then make a package out of the result. Keep in mind that creating a patch may be a better solution to allow others to use your [PKGBUILD](PKGBUILD.md). | | `--skipinteg` | Do not perform any integrity checks (checksum and [PGP](../../../cryptography/GPG.md)) on source files | | `--skipchecksums` | Do not verify checksums of source files | | `--skippgpcheck` | Do not verify [PGP](../../../cryptography/GPG.md) signatures of source files | | `-i, --install` | Install or upgrade the package after a successful build using [pacman](Pacman.md) | | `-o, --nobuild` | Download and extract files, run the prepare() function, but do not build them. Useful with the `--noextract` option if you wish to tweak the files in $srcdir/ before building | | `-r, --rmdeps` | Upon successful build, remove any dependencies installed by makepkg during dependency auto-resolution and installation | | `-s, --syncdeps` | Install missing dependencies using [pacman](Pacman.md). When build-time or run-time dependencies are not found, [pacman](Pacman.md) will try to resolve them. If successful, the missing packages will be downloaded and installed | | `-C, --cleanbuild` | Remove the $srcdir before building the package | | `-f, --force` | Overwrite package if it already exists | | `--noarchive` | Do not create the archive at the end of the build process. This can be useful to test the package() function or if your target distribution does not use [pacman](Pacman.md) | | `--sign` | Sign the resulting package with [gpg](../../../cryptography/GPG.md) | | `--nosign` | Do not create a signature for the built package | | `--key ` | Specify a key to use when signing packages | | `--noconfirm` | (Passed to [pacman](Pacman.md)) Prevent [pacman](Pacman.md) from waiting for user input before proceeding with operations | ## Misc ### Using mold linker [mold](../../development/mold.md) is a drop-in replacement for ld/lld linkers, which claims to be significantly faster. To use mold, append `-fuse-ld=mold` to `LDFLAGS`. For example: ```sh # /etc/makepkg.conf LDFLAGS="... -fuse-ld=mold" ``` To pass extra options to mold, additionally add those to `LDFLAGS`. For example: ```sh # /etc/makepkg.conf LDFLAGS="... -fuse-ld=mold -Wl,--separate-debug-file" ``` To use mold for Rust packages, append `-C link-arg=-fuse-ld=mold` to `RUSTFLAGS`. For example: ```sh # /etc/makepkg.conf.d/rust.conf RUSTFLAGS="... -C link-arg=-fuse-ld=mold" ``` ### Parallel compilation The make build system uses the `MAKEFLAGS` environment variable to specify additional options for make. The variable can also be set in the `makepkg.conf` file. Users with multi-core/multi-processor systems can specify the number of jobs to run simultaneously. This can be accomplished with the use of `nproc` to determine the number of available processors, e.g. ```sh MAKEFLAGS="--jobs=$(nproc)". ``` Some `PKGBUILDs` specifically override this with `-j1`, because of race conditions in certain versions or simply because it is not supported in the first place. ### Building from files in memory As compiling requires many I/O operations and handling of small files, moving the working directory to a [tmpfs](../../../linux/filesystems/tmpFS.md) may bring improvements in build times. The `BUILDDIR` variable can be temporarily exported to makepkg to set the build directory to an existing tmpfs. For example: ```sh BUILDDIR=/tmp/makepkg makepkg ``` Persistent configuration can be done in `makepkg.conf` by uncommenting the `BUILDDIR` option, which is found at the end of the BUILD ENVIRONMENT section in the default `/etc/makepkg.conf` file. Setting its value to e.g. `BUILDDIR=/tmp/makepkg` will make use of the Arch's default `/tmp` temporary file system. > **Note:** > - Avoid compiling larger packages in tmpfs to prevent running out of memory. > - The tmpfs directory must be mounted without the `noexec` option, otherwise it will prevent built binaries from being executed. > - Keep in mind that packages compiled in tmpfs will not persist across reboot. Consider setting the `PKGDEST` option appropriately to move the built package automatically to a persistent directory. ### Generate new checksums Install `pacman-contrib` and run the following command in the same directory as the [PKGBUILD](./PKGBUILD.md) file to generate new checksums: ```sh updpkgsums ``` `updpkgsums` uses `makepkg --geninteg` to generate the checksums. The checksums can also be obtained with e.g `sha256sum` and added to the `sha256sums` array by hand. ### Build from local source files If you want to make changes to the source code you can download the source code without building the package by using the `-o, --nobuild` Download and extract files only option. ```sh makepkg -o ``` You can now make changes to the sources and then build the package by using the `-e, --noextract` Do not extract source files (use existing `$srcdir/` dir) option. Use the `-f` option to overwrite already built and existing packages. ```sh makepkg -ef ```