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.
Top comments (0)