Axel Navarro
Posted on August 13, 2020
In the previous post, we learned how to apply a git patch to a package. In this entry, we'll try to package a specific branch and run our code installed on our system.
The easy way
There are a few alternatives to package a branch, but we'll use the most comfortable way. For this example, we want to compile the master
branch using the PKGBUILD for git-delta
.
In Arch Linux, the build is based in a git tag, so we should download the commits between the tag and the branch:
https://github.com/dandavison/delta/compare/0.4.1..master.patch
or, the diff alternative:
https://github.com/dandavison/delta/compare/0.4.1..master.diff
The original PKGBUILD
You can see the PKGBUILD in https://aur.archlinux.org/packages/git-delta clicking the View PKGBUILD
link. But this is the simplified version:
pkgname=git-delta
_name=delta
pkgver=0.4.1
pkgrel=1
pkgdesc='A syntax-highlighting pager for git and diff output'
arch=('i686' 'x86_64' 'arm' 'armv7h' 'armv6h' 'aarch64')
url="https://github.com/dandavison/$_name"
license=('MIT')
makedepends=('rust' 'clang' 'llvm')
source=("$url/archive/$pkgver.tar.gz")
sha256sums=('5c2e46e398702b13b2768043ba5dc6bea899fb34271120bad4608ff9a64b0434')
build() {
cd "$_name-$pkgver"
cargo build --release --locked
}
package() {
cd "$_name-$pkgver"
install -Dm755 "target/release/$_name" -t "$pkgdir/usr/bin/"
}
Adding the prepare step
We just need to add the patch URL to the source
variable and SKIP
to the checksum:
source=("$url/archive/$pkgver.tar.gz"
my.patch::"$url/compare/$pkgver..master.patch")
sha256sums=('5c2e46e398702b13b2768043ba5dc6bea899fb34271120bad4608ff9a64b0434'
'SKIP')
And, the prepare
function to patch the tag with the new commits:
prepare() {
patch -d "$_name-$pkgver" -p1 -i ../my.patch
}
So, the PKGBUILD for build the master
branch is:
pkgname=git-delta
_name=delta
pkgver=0.4.1
pkgrel=1
pkgdesc='A syntax-highlighting pager for git and diff output'
arch=('i686' 'x86_64' 'arm' 'armv7h' 'armv6h' 'aarch64')
url="https://github.com/dandavison/$_name"
license=('MIT')
makedepends=('rust' 'clang' 'llvm')
source=("$url/archive/$pkgver.tar.gz"
my.patch::"$url/compare/$pkgver..master.patch")
sha256sums=('5c2e46e398702b13b2768043ba5dc6bea899fb34271120bad4608ff9a64b0434'
'SKIP')
prepare() {
patch -d "$_name-$pkgver" -p1 -i ../my.patch
}
build() {
cd "$_name-$pkgver"
cargo build --release --locked
}
package() {
cd "$_name-$pkgver"
install -Dm755 "target/release/$_name" -t "$pkgdir/usr/bin/"
}
Building your package
For build and install this you just need to use:
makepkg -si
Remember that if you rebuild the package with new commits the makepkg
won't refresh the downloaded my.patch
file, so we can use this command:
rm my.patch && makepkg -sicCf
The -C
, or --cleanbuild
, removes the src/
folder before build. And, -c
, or --clean
, removes the src/
and pkg/
folders after build.
The -f
, or --force
to overwrite existing package if was already compiled.
A final words
There is a git-delta-git
package that compiles the latest commit but Arch needs to uninstall the git-delta
before installing the git-delta-git
, and for some packages this is not a choise because other packages depend on the package we are trying to update.
You can learn more of Delta here.
Posted on August 13, 2020
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.