构建自己的 AUR 软件包

构建自己的 AUR 软件包

最近在写装机脚本的时候,发现我以前在网上随便找的 SDDM 主题没有对应的 AUR 包,为了方便以后安装,干脆就打一个包好了,顺便把里面英文的提示改成中文的,也免去了手动装依赖的麻烦

前期准备

AUR 账号

注册 AUR 账号,注意,不同于 ArchWiki 的账号

必要环境安装

确保已安装完整的 base-devel

zsh
1
paru -S --needed base-devel

安装 PKGBUILD 检查工具 namcap (可选)

zsh
1
paru -S namcap

makepkg

pacman 提供了 makepkg 脚本来帮助自动化地构建 packages
makepkg 通过 /etc/makepkg.conf 进行配置,一般不需要进行配置
如果有需求可以参考 makepkg - ArchWiki

构建 AUR 包

总体上分为两步,编写 PKGBUILD 文件,然后使用 makepkg 来构建出 AUR 包

编写 PKGBUILD 文件

pacman 自带有几个 PKGBUILD 的例子

zsh
1
2
3
4
5
6
7
8
9
10
11
12
/usr/share/pacman
├── keyrings
│   ├── archlinuxcn.gpg
│   ├── archlinuxcn-revoked
│   ├── archlinuxcn-trusted
│   ├── archlinux.gpg
│   ├── archlinux-revoked
│   └── archlinux-trusted
├── PKGBUILD.proto #PKGBUILD的示例
├── PKGBUILD-split.proto
├── PKGBUILD-vcs.proto
└── proto.install #.install脚本的示例

PKGBUILD 的语法和 bash 一致,同时内置了两个重要变量

[!NOTE] srcdir
This points to the directory where makepkg extracts or symlinks all files in the source array.

[!NOTE] pkgdir
This points to the directory where makepkg bundles the installed package, which becomes the root directory of your built package.

  • srcdir 就是解压后的 source 所在的文件夹的绝对路径
  • pkgdir 会被当作系统的根目录

官方的 PKGBUILD 示例写的非常详细,实际上我这种简单的需求是用不着那么多变量的,以下是我的 PKGBUILD

PKGBUILD
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
pkgname=sddm-swish-zh #包名
pkgver=1.0 #版本号
pkgrel=1 #发布号,可以理解为小版本号,完整的版本号为 pkgname-pkgrel
pkgdesc="A login theme for SDDM Display Manager." # 包描述
arch=('any') #软件包适用的架构
url="https://github.com/Meow-2/Swish" #软件官网
license=('GPL3') #许可证
depends=('qt5-graphicaleffects' 'qt5-quickcontrols2' 'qt5-svg' 'sddm' 'plasma-framework') #依赖的其他包
source=("${pkgname}.tar.gz::${url}/archive/refs/tags/${pkgver}.tar.gz") #源码
md5sums=('c42620c36097b1c28345eae982184e00') #与source对应的md5

package() {
mkdir -p "${pkgdir}/usr/share/sddm/themes"
cp -r "${srcdir}/Swish-${pkgver}" "${pkgdir}/usr/share/sddm/themes/Swish-${pkgver}/"
}

除了必要的包信息,其中最重要的就是 source 变量和 package 函数了,source 变量的值就是源码的所在,一般是一个 HTTP 或 FTP 地址,可以通过在前面加 name:: 的方式来重命名下载下来的压缩包

package 函数会在一切就绪后执行,在 package 函数之前还有 prepare、build、check 函数用于执行一些准备、编译构建、检查测试之类的工作,因为我的包不需要从源码编译,所以直接在 package 函数里进行简单的复制就好了

此外,可以在 depends 数组内指定依赖包,md5sums 是针对下载下来的 source 压缩包的,可以使用 md5sum 工具计算,也可以不写这个数组,或者用 ‘SKIP’ 来跳过某个数组元素的检查

编写完 PKGBUILD ,就可以在本地安装软件包了

测试软件包

在 PKGBUILD 所在文件夹尝试生成软件包,makepkg 会自动寻找当前文件夹下的 PKGBUILD

zsh
1
makepkg

之后会得到

zsh
1
2
3
4
5
6
./Swish
├── pkg
├── PKGBUILD
├── src
├── Swish-1.0.tar.gz #下载的source
└── swish-zh-sddm-theme-git-1.0-1-any.pkg.tar.zst #makepkg生成的AUR软件包

可以看出 makepkg 生成的 AUR 包格式$pkgname-$pkgver.pkg.tar.gz.zst

看看这个包的信息是否符合你的预期,以我的包为例

zsh
1
2
3
4
paru -Qlp swish-zh-sddm-theme-git-1.0-1-any.pkg.tar.zst
# 列出软件包的文件放置位置
paru -Qip swish-zh-sddm-theme-git-1.0-1-any.pkg.tar.zst
# 列出软件包的基本信息

尝试安装卸载 AUR 包

zsh
1
2
paru -U swish-zh-sddm-theme-git-1.0-1-any.pkg.tar.zst
paru -Rsn swish-zh-sddm-theme-git

检查包的逻辑性

zsh
1
2
namcap PKGBUIL[]()D
namcap swish-zh-sddm-theme-git-1.0-1-any.pkg.tar.zst

以上都没什么问题就可以上传至 AUR 了

上传至 AUR 仓库

  1. 将 SSH 公钥添加到 AUR 账户
  2. 在 PKGBUILD 所在文件夹初始化 Git 仓库(文件夹应尽量干净 ),并添加远程 AUR 仓库,仓库名是你的软件包名
zsh
1
2
git init
git remote add aur ssh://[email protected]/<pkgname>.git
  1. 生成 .SRCINFO 文件并提交
zsh
1
2
3
4
makepkg --printsrcinfo > .SRCINFO
git add PKGBUILD .SRCINFO
git commit -m "First Commit"
git push --set-upstream aur master

另外,本地的分支名一定要是 master ,而不能是其他的

zsh
1
git branch -m <原分支名> master # 分支名改为 master

一段时间后,就可以通过 paru -Ss 查找到打包的软件了

参考资料

  1. Arch User Repository (简体中文) - ArchWiki
  2. Creating packages (简体中文) - ArchWiki
  3. Arch package guidelines (简体中文) - ArchWiki
  4. PKGBUILD (简体中文) - ArchWiki
  5. makepkg - ArchWiki
作者

Meow-2

发布于

2022-11-03

更新于

2022-12-13


评论