VCS package guidelines

From ArchWiki
Revision as of 07:31, 31 October 2013 by KaiSforza (talk | contribs) (→‎VCS sources: pointer to man page about fragments)
Jump to navigation Jump to search

zh-CN:VCS PKGBUILD Guidelines zh-TW:VCS PKGBUILD Guidelines Template:Package Guidelines

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.


Warning: The prototype files provided in the abs package and in the ABS Git repository are significantly out-of-date. Do not consider the prototypes to be authoritative in any way. See FS#34485.

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.


  • Suffix pkgname with -cvs, -svn, -hg, -darcs, -bzr, -git etc. unless the package fetches a specific release.
  • If the resulting package is different after changing the dependencies, URL, sources, etc. increasing the pkgrel is mandatory. Touching the pkgver is not.
  • Include what the package conflicts with and provides (e.g. for fluxbox-gitAUR: conflicts=('fluxbox') and provides=('fluxbox')).
  • replaces=() generally causes unnecessary problems and should be avoided.
  • When using the cvsroot, use anonymous:@ rather than anonymous@ to avoid having to enter a blank password or anonymous:password@, if one is required.

VCS sources

Note: Pacman 4.1 supports the following VCS sources: bzr, git, hg and svn. See the fragment section of man PKGBUILD or PKGBUILD(5) for a list of supported VCS.

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:

  • folder (optional) is used to change the default repo name to something more relevant (e.g. than trunk) or to preserve the previous sources
  • vcs+ is needed for URLs that do not reflect the VCS type, e.g. git+http://some_repo.
  • url is the URL to the distant or local repo
  • #fragment (optional) is needed to pull a specific branch or commit. See man PKGBUILD for more information on the fragments available for each VCS.

An example Git source array:


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:


Using the annotated tag of the last commit:

pkgver() {
  cd "$srcdir/repo"
  local ver="$(git describe --long)"
  echo "${ver//-/.}"

Using the unannotated tag of the last commit:

pkgver() {
  cd "$srcdir/repo"
  local ver="$(git describe --tags)"
  echo "${ver//-/.}"

If there are no tags:

pkgver() {
  cd "$srcdir/repo"
  printf "%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"


pkgver() {
  cd "$srcdir/repo"
  local ver="$(svnversion)"
  printf "%s" "${ver//[[:alpha:]]}"


pkgver() {
  cd "$srcdir/repo"
  printf "%s.%s" "$(hg identify -n)" "$(hg identify -i)"


pkgver() {
  cd "$srcdir/repo"
  bzr revno


The current date can be used, in case no satisfactory pkgver can be extracted from the repository:

pkgver() {
  date +%Y%m%d


A sample Git PKGBUILD

# Maintainer: Dave Reisner <> 
# Contributor: William Giokas (KaiSforza) <>

pkgdesc="Pacman database extraction utility"
arch=('i686' 'x86_64')
# The git repo is detected by the 'git:' or 'git+' beginning. The branch
# '$pkgname' is then checked out upon cloning, expediating versioning:
# Because the sources are not static, skip Git checksum:

pkgver() {
  cd "$srcdir/$pkgname"
  # Use the tag of the last commit
  local ver="$(git describe --long)"
  printf "%s" "${ver//-/.}"

build() {
  cd "$srcdir/$pkgname"

package() {
  cd "$srcdir/$pkgname"
  make PREFIX=/usr DESTDIR="$pkgdir" install
  install -Dm644 "$srcdir/expac_icon.png" "$pkgdir/usr/share/pixmaps/expac.png"