VCS PKGBUILD Guidelines
CLR – Cross – Eclipse – Free Pascal – GNOME – Go – Haskell – Java – KDE – Kernel – Lisp – MinGW – Nonfree – OCaml – Perl – Python – Ruby – VCS – Web – Wine
Version control systems can be used for retrieval of source code for both usual statically versioned packages and latest (trunk) version of a development branch. This article covers both cases.
Contents |
Prototypes
The abs package for the Arch Build System provides prototypes for CVS, SVN, Git, Mercurial, and Darcs PKGBUILDs. When abs is installed, you can find them in /usr/share/pacman. Latest versions can be found in the prototypes directory in the ABS Git repository.
Guidelines
- Suffix
pkgnamewith-cvs,-svn,-hg,-darcs,-bzr,-gitetc. unless the package fetches a specific release.
- If the resulting package is different after changing the dependencies, URL, sources, etc. increasing the
pkgrelis mandatory. Touching thepkgveris not.
-
--holdvercan be used to prevent makepkg from updating thepkgver(see: makepkg(8))
- Include what the package conflicts with and provides (e.g. for fluxbox-git:
conflicts=('fluxbox')andprovides=('fluxbox')).
-
replaces=()generally causes unnecessary problems and should be avoided.
- When using the cvsroot, use
anonymous:@rather thananonymous@to avoid having to enter a blank password oranonymous:password@, if one is required.
- Include the appropriate VCS tool in
makedepends=()(cvs, subversion, git, ...).
VCS sources
Starting with pacman 4.1, the VCS sources should be specified in the source=() array and will be treated like any other source. makepkg will clone/checkout/branch the repo into $SRCDEST (same as $startdir if not set in makepkg.conf(5)) and copy it to $srcdir (in a specific way to each VCS). The local repo is left untouched, thus invalidating the need for a -build directory.
The general format of a VCS source=() array is:
source=('[folder::][vcs+]url[#fragment]')
-
folder(optional) is used to change the default repo name to something more relevant (e.g. thantrunk) or to preserve the previous sources -
vcs+is needed for URLs that do not reflect the VCS type, e.g.git+http://some_repo. -
urlis the URL to the distant or local repo -
#fragment(optional) is needed to pull a specific branch or commit
An example Git source array:
source=('project_name::git+http://project_url#branch=project_branch')
The pkgver() function
The pkgver autobump is now achieved via a dedicated pkgver() function. This allows for better control over the pkgver, and maintainers should favor a pkgver that makes sense. Following are some examples showing the intended output:
Git
Using the annotated tag of the last commit:
pkgver() {
cd "$srcdir/repo"
local ver="$(git describe --long)"
echo "${ver//-/.}"
}
2.0.6.a17a017
Using the unannotated tag of the last commit:
pkgver() {
cd "$srcdir/repo"
local ver="$(git describe --tags)"
echo "${ver//-/.}"
}
v0.71.115.gd95ee07
If there are no tags:
pkgver() {
cd "$srcdir/repo"
printf "%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
}
1142.a17a017
Subversion
pkgver() {
cd "$srcdir/repo"
local ver="$(svnversion)"
printf "%s" "${ver//[[:alpha:]]}"
}
8546
Mercurial
pkgver() {
cd "$srcdir/repo"
printf "%s.%s" "$(hg identify -n)" "$(hg identify -i)"
}
2813.75881cc5391e
Bazaar
pkgver() {
cd "$srcdir/repo"
bzr revno
}
830
Fallback
The current date can be used, in case no satisfactory pkgver can be extracted from the repository:
pkgver() {
date +%Y%m%d
}
20130408
Tips
A sample Git PKGBUILD
# Maintainer: Dave Reisner <d@falconindy.com>
# Contributor: William Giokas (KaiSforza) <1007380@gmail.com>
pkgname=expac-git
pkgver=0.0.0
pkgrel=1
pkgdesc="Pacman database extraction utility"
arch=('i686' 'x86_64')
url="https://github.com/falconindy/expac"
license=('MIT')
depends=('pacman')
makedepends=('git')
conflicts=('expac')
provides=('expac')
# The git repo is detected by the 'git:' or 'git+' beginning. The branch
# '$pkgname' is then checked out upon cloning, expediating versioning:
#source=('git+https://github.com/falconindy/expac.git'
source=("$pkgname"::'git://github.com/falconindy/expac.git'
'expac_icon.png')
# Because the sources are not static, skip Git checksum:
md5sums=('SKIP'
'020c36e38466b68cbc7b3f93e2044b49')
pkgver() {
cd "$srcdir/$pkgname"
# Use the tag of the last commit
local ver="$(git describe --long)"
printf "%s" "${ver//-/.}"
}
build() {
cd "$srcdir/$pkgname"
make
}
package() {
cd "$srcdir/$pkgname"
make PREFIX=/usr DESTDIR="$pkgdir" install
install -Dm644 "$srcdir/expac_icon.png" "$pkgdir/usr/share/pixmaps/expac.png"
}