AUR Metadata

From ArchWiki
Revision as of 03:29, 14 January 2014 by AlexanderR (Talk | contribs) (Short summary of recent .AURINFO innovations)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

In order to display information in web interface AUR attempts to parse PKGBUILD and salvage package name, version and other information from it. PKGBUILDs are Bash scripts, and correctly parsing Bash scripts is a huge challenge (which is why makepkg is a Bash script itself: it includes PKGBUILD of package being built via source directive). AUR metadata files were created to get rid of some hacks, used by AUR package maintainers to work around incorrect parsing. See also FS#25210, FS#15043 and FS#16394.

How it works

By adding a metadata file called ".AURINFO" to source tarballs to overwrite specific PKGBUILD fields. .AURINFO files are parsed line by line. The syntax for each line is key = value, where key is any of the following field names:

  • pkgname
  • pkgver
  • pkgdesc
  • url
  • license
  • depend

Multiple "depend" lines can be specified to add multiple dependencies. This format closely matches the .PKGINFO format that is used for binary packages in pacman/libalpm. It can be extended by field name prefixes or sections to support split packages later.

What does not work

  • Split packages
  • Multiple architectures (x86_64 dependencies tend to be more numerous, so just put them)

Tips and tricks

Create this script:

/usr/local/addaurinfo

#! /usr/bin/env bash

process() {

  if [ ! -f PKGBUILD ]; then
    echo "PKGBUILD not found!"
  else
    source PKGBUILD
    echo ">>> Generate AURINFO for $pkgname"
    cat > .AURINFO << EOF
pkgname = $pkgname
pkgver = $pkgver-$pkgrel
pkgdesc = $pkgdesc
url = $url
license = $license
EOF

    for i in "${depends[@]}"; do
      echo "depend = $i" >> .AURINFO
    done

    print_aurinfo
    edit_aurinfo
    create_src "$pkgname-$pkgver-$pkgrel" "$pkgname"
  fi
}

print_aurinfo() {
  echo ">>> Generated .AURINFO:"
  cat .AURINFO
}

edit_aurinfo() {
  echo ">>> Edit .AURINFO ? [Y/n] ("A" to abort)"
  read -n 1 -r
  if [[ $REPLY =~ ^[Yy]$ ]]; then
    $EDITOR .AURINFO
    print_aurinfo
    edit_aurinfo
  elif [[ $REPLY =~ ^[Aa]$ ]]; then
    exit
  else 
    return
  fi
}

create_src() {
  echo ">>> Generate pkgsrc"
  makepkg --source -f
  echo ">>> Update pkgsrc"
  srcpkg=`realpath $1.src.tar.gz`
  gzip -d "$srcpkg"
  tar rvf "${srcpkg/${srcpkg: -3}}" .AURINFO --transform s,.AURINFO,$2/.AURINFO,
  gzip "${srcpkg/${srcpkg: -3}}"
}

process

Make it executable:

# chmod +x /usr/local/addaurinfo

and add following to ~/.bashrc:

alias mkaurpkg='makepkg --source && addaurinfo'

Now you can use mkaurpkg to build AUR packages with correct metadata.