最近在写装机脚本的时候,发现我以前在网上随便找的 SDDM 主题没有对应的 AUR 包,为了方便以后安装,干脆就打一个包好了,顺便把里面英文的提示改成中文的,也免去了手动装依赖的麻烦
前期准备
AUR 账号
注册 AUR 账号,注意,不同于 ArchWiki 的账号
必要环境安装
确保已安装完整的 base-devel
paru -S --needed base-devel
安装 PKGBUILD 检查工具 namcap (可选)
paru -S namcap
makepkg
pacman 提供了 makepkg 脚本来帮助自动化地构建 packages makepkg 通过 /etc/makepkg.conf 进行配置,一般不需要进行配置 如果有需求可以参考 makepkg - ArchWiki
构建 AUR 包
总体上分为两步,编写 PKGBUILD 文件,然后使用 makepkg 来构建出 AUR 包
编写 PKGBUILD 文件
pacman 自带有几个 PKGBUILD 的例子
/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
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
makepkg
之后会得到
./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
看看这个包的信息是否符合你的预期,以我的包为例
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 包
paru -U swish-zh-sddm-theme-git-1.0-1-any.pkg.tar.zst
paru -Rsn swish-zh-sddm-theme-git
检查包的逻辑性
namcap PKGBUIL[]()D
namcap swish-zh-sddm-theme-git-1.0-1-any.pkg.tar.zst
以上都没什么问题就可以上传至 AUR 了
上传至 AUR 仓库
- 将 SSH 公钥添加到 AUR 账户
- 在 PKGBUILD 所在文件夹初始化 Git 仓库 (文件夹应尽量干净 ),并添加远程 AUR 仓库,仓库名是你的软件包名
git init
git remote add aur ssh://[email protected]/<pkgname>.git
- 生成 .SRCINFO 文件并提交
makepkg --printsrcinfo > .SRCINFO
git add PKGBUILD .SRCINFO
git commit -m "First Commit"
git push --set-upstream aur master
另外,本地的分支名一定要是 master,而不能是其他的
git branch -m <原分支名> master # 分支名改为 master
一段时间后,就可以通过 paru -Ss
查找到打包的软件了