- Home
- Packages
- Forums
- Wiki
- Bugs
- AUR
- Download

# VCS PKGBUILD Guidelines

From ArchWiki

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.

## Prototypes

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.

## Guidelines

- 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.

- `--holdver` can be used to prevent makepkg from updating the `pkgver` (see: makepkg(8))

- Include what the package conflicts with and provides (e.g. for fluxbox-git: `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.

- Include the appropriate VCS tool in `makedepends=()` (cvs, subversion, git, ...).

### 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:

    source=('[folder::][vcs+]url[#fragment]')

- `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

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"
    }

Retrieved from "https://wiki.archlinux.org/index.php?title=VCS_PKGBUILD_Guidelines&oldid=280200"
Category:

- Package development

## Navigation menu