arch-wiki-md-repo
Version:
All arch-wiki articles in markdown format, updated every two days.
242 lines (166 loc) • 10.1 kB
Markdown
**[Package creation guidelines](/index.php/Creating_packages "Creating packages")**
* * *
[CLR](/index.php/CLR_package_guidelines "CLR package guidelines") – [Cross](/index.php/Cross-compiling_tools_package_guidelines "Cross-compiling tools package guidelines") – [Eclipse](/index.php/Eclipse_plugin_package_guidelines "Eclipse plugin package guidelines") – [Free Pascal](/index.php/Free_Pascal_package_guidelines "Free Pascal package guidelines") – [GNOME](/index.php/GNOME_package_guidelines "GNOME package guidelines") – [Go](/index.php/Go_package_guidelines "Go package guidelines") – [Haskell](/index.php/Haskell_package_guidelines "Haskell package guidelines") – [Java](/index.php/Java_package_guidelines "Java package guidelines") – [KDE](/index.php/KDE_package_guidelines "KDE package guidelines") – [Kernel](/index.php/Kernel_module_package_guidelines "Kernel module package guidelines") – [Lisp](/index.php/Lisp_package_guidelines "Lisp package guidelines") – [MinGW](/index.php/MinGW_package_guidelines "MinGW package guidelines") – [Node.js](/index.php/Node.js_package_guidelines "Node.js package guidelines") – [Nonfree](/index.php/Nonfree_applications_package_guidelines "Nonfree applications package guidelines") – [OCaml](/index.php/OCaml_package_guidelines "OCaml package guidelines") – [Perl](/index.php/Perl_package_guidelines "Perl package guidelines") – [PHP](/index.php/PHP_package_guidelines "PHP package guidelines") – [Python](/index.php/Python_package_guidelines "Python package guidelines") – [Ruby](/index.php/Ruby_Gem_package_guidelines "Ruby Gem package guidelines") – [VCS](/index.php/VCS_package_guidelines "VCS package guidelines") – [Web](/index.php/Web_application_package_guidelines "Web application package guidelines") – [Wine](/index.php/Wine_package_guidelines "Wine package guidelines")
[Version control systems](https://en.wikipedia.org/wiki/Revision_control "wikipedia:Revision control") can be used for retrieval of source code for both usual statically versioned packages and latest (trunk) version of packages. This article covers both cases.
## Contents
* [1 Prototypes](#Prototypes)
* [2 Guidelines](#Guidelines)
* [2.1 VCS sources](#VCS_sources)
* [2.2 The pkgver() function](#The_pkgver.28.29_function)
* [2.2.1 Git](#Git)
* [2.2.2 Subversion](#Subversion)
* [2.2.3 Mercurial](#Mercurial)
* [2.2.4 Bazaar](#Bazaar)
* [2.2.5 Fallback](#Fallback)
* [3 Tips](#Tips)
* [3.1 A sample Git PKGBUILD for pacman 4.1](#A_sample_Git_PKGBUILD_for_pacman_4.1)
* [3.2 Removing VCS leftovers](#Removing_VCS_leftovers)
* [3.3 SVN packages that try to get their revision number](#SVN_packages_that_try_to_get_their_revision_number)
* [4 Troubleshooting](#Troubleshooting)
* [4.1 Bazaar limitation](#Bazaar_limitation)
## Prototypes
The [ABS](/index.php/ABS "ABS") package provides prototypes for [cvs](/index.php/Cvs "Cvs"), [svn](/index.php/Svn "Svn"), [git](/index.php/Git "Git"), [mercurial](/index.php/Mercurial "Mercurial"), and [darcs](https://en.wikipedia.org/wiki/darcs "wikipedia:darcs") [PKGBUILDs](/index.php/PKGBUILD "PKGBUILD"). When [abs](https://www.archlinux.org/packages/?name=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](https://projects.archlinux.org/abs.git/tree/prototypes).
## 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` isn't.
* `--holdver` can be used to prevent [makepkg](/index.php/Makepkg "Makepkg") from updating the `pkgver` (see: [makepkg(8)](https://www.archlinux.org/pacman/makepkg.8.html))
* Include what the package conflicts with and provides (e.g. for [fluxbox-git](https://aur.archlinux.org/packages/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](https://www.archlinux.org/packages/?name=cvs), [subversion](https://www.archlinux.org/packages/?name=subversion), [git](https://www.archlinux.org/packages/?name=git), ...).
### VCS sources
**Note:** Pacman 4.1 supports the following VCS sources: `bzr`, `git`, `hg` and `svn`. See the `fragment` section of [PKGBUILD(5)](https://jlk.fjfi.cvut.cz/arch/manpages/man/PKGBUILD.5) or [PKGBUILD(5)](https://www.archlinux.org/pacman/PKGBUILD.5.html) for a list of supported VCS.
Starting with [pacman](https://www.archlinux.org/packages/?name=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)](https://www.archlinux.org/pacman/makepkg.conf.5.html)) 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](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'](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 for several VCS.
#### Git
With tags:
```
pkgver() {
cd "$srcdir"/local_repo
git describe --always | sed 's|-|.|g'
}
```
Without tags:
```
pkgver() {
cd "$srcdir"/local_repo
echo "0.$(git rev-list --count HEAD).$(git describe --always)"
}
```
Using the last commit date:
```
pkgver() {
cd "$srcdir"/local_repo
git log -1 --format="%cd" --date=short | sed 's|-||g'
}
```
#### Subversion
```
pkgver() {
cd "$SRCDEST"/local_repo
svnversion |tr -d [A-z]
}
```
**Note:** The copy inside `$srcdir` is made using `svn export` which does not create working copies. Any `svn` related command has to be used in the local repo, hence `$SRCDEST`.
#### Mercurial
```
pkgver() {
cd "$srcdir"/local_repo
hg identify -ni | awk 'BEGIN{OFS=".";} {print $2,$1}'
}
```
#### Bazaar
```
pkgver() {
cd "$srcdir"/local_repo
bzr revno
}
```
#### Fallback
The following can be used in case no satisfactory `pkgver` can be extracted from the repo:
```
pkgver() {
date +"%Y%m%d"
}
```
## Tips
### A sample Git PKGBUILD for pacman 4.1
```
# Maintainer: Dave Reisner <d@falconindy.com>
# Contributor: William Giokas (KaiSforza) <1007380@gmail.com>
pkgname=expac-git
_gitname=expac
pkgver=0.0.0
pkgrel=1
pkgdesc="Pacman database extraction utility"
arch=('i686' 'x86_64')
url="[https://github.com/falconindy/expac](https://github.com/falconindy/expac)"
license=('MIT')
depends=('pacman')
makedepends=('git' 'perl')
conflicts=('expac')
provides=('expac')
# Here is the fun bit. Makepkg knows it's a git repo because the URL starts with 'git'
# it then knows to checkout the branch 'pacman41' upon cloning, expediating versioning:
#source=('git+[https://github.com/falconindy/expac.git'](https://github.com/falconindy/expac.git')
source=('[git://github.com/falconindy/expac.git'](git://github.com/falconindy/expac.git')
'expac_icon.png')
# Because the sources are not static, skip Git checksum:
md5sums=('SKIP'
'020c36e38466b68cbc7b3f93e2044b49')
pkgver() {
cd "$srcdir/$_gitname"
git describe --always | sed 's|-|.|g'
# To give the total count of commits and the hash of the last one
# (useful if you're making a repository with git packages so that they can have
# sequential version numbers, else a "pacman -Syu" may not update the package):
#echo "0.$(git rev-list --count $branch).$(git describe --always)"
# Using the last commit date:
#git log -1 --format="%cd" --date=short | sed 's|-||g'
}
build() {
cd "$srcdir/$_gitname"
make
}
package() {
cd "$srcdir/$_gitname"
make PREFIX=/usr DESTDIR="$pkgdir" install
install -Dm644 "$srcdir/expac_icon.png" "$pkgdir/usr/share/pixmaps/expac.png"
}
```
### Removing VCS leftovers
To make sure that there are no VCS leftovers use the following at the end of the `package()` function (replacing `**.git**` with `.svn`, `.hg`, etc.):
```
find "$pkgdir" -type d -name "**.git**" -exec rm -r '{}' +
```
### SVN packages that try to get their revision number
If the build system for the program you are packaging calls `svnversion` or `svn info` to determine its revision number, you can add a `prepare()` function similar to this one to make it work:
```
prepare() {
cp -a "$SRCDEST/$_svnmod/.svn" "$srcdir/$_svnmod/"
}
```
## Troubleshooting
### Bazaar limitation
Currently, bazaar URLs only work in the form of `[http://bazaar.launchpad.net/](http://bazaar.launchpad.net/)`, e.g.:
```
source=('project_name::bzr+[http://bazaar.launchpad.net/~project_team/project_path'](http://bazaar.launchpad.net/~project_team/project_path'))
```
Using any other `http://`, `https://` or `ssh://` URL (including `lp:project_name`) will prevent makepkg from updating the local repo.
The correct URL can be obtained with:
```
$ bzr config parent_location
```