将软件打包到AUR
Kale

尝试写了个翻译软件打包到AUR上,记录一下过程。

什么是AUR

AUR的全称是Arch User Repository,用户主导,每个注册用户可以上传自己打包的软件,供别的用户下载,官方会定期从中挑选得票数比较高的软件包进入community仓库。进入community仓库即意味着以后可以通过pacman直接安装了。

注册aur帐号

要打包软件到AUR,首先需要一个AUR帐号。可以去AUR的网站去注册,填好用户名,邮箱,密码等信息即可,另外也要上传自己的ssh公钥。生成ssh密钥可以使用ssh-keygen命令,推荐直接用aur来命名,以方便区分多个密钥。生成好后也要在.ssh目录配置一下config:

1
2
3
Host aur.archlinux.org
IdentityFile ~/.ssh/aur
User aur

然后将公钥粘贴到注册界面中对应栏即可。

创建仓库

创建好aur帐号后,接下来就是创建自己对应的软件包仓库:

git clone git+ssh://aur@aur.archlinux.org/[package_name]

通过上面命令可以新建一个仓库。

制作软件包

打包软件包其实就是编写PKGBUILD文件,这个文件在/usr/share/pacman/目录下有模板PKGBUILD.proto,复制一份到新建的软件仓库中。然后修改对应行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# Maintainer: Your Name <youremail@domain.com>
pkgname=NAME # 软件包名
pkgver=VERSION # 版本号,可以是1.0.0
pkgrel=1 # 发布号,当版本未更迭但是添加补丁等引起软件包变化时,将该参数+1
epoch= # 正常情况下不使用该参数
pkgdesc="" # 软件包描述
arch=() # 描述软件包能够生成并使用的架构,比如x86_64
url="" # 该软件的上游地址,比如github等
license=('GPL') # 软件包发布许可
groups=() # 软件包所在的包组,孤立则不填
depends=() # 软件包的依赖,例如depends=('foobar>=1.8.0' 'foobar<2.0.0')
makedepends=() # 仅在软件生成时需要的依赖
checkdepends=() # 仅在测试时需要的依赖
optdepends=() # 可选的依赖,不影响主要功能,但能提供额外的特性
provides=() # 说明当前包能提供的功能
conflicts=() # 与当前包冲突的包列表
replaces=() # 安装当前包会取代什么过时的包
backup=() # 当包被升级或者卸载时,应当备份的文件路径
options=() # 这个序列允许重载makepkg的部分定义在/etc/makepkg.conf中的默认行为
install= # .install脚本的名称,可以在特定时刻完成特定操作,比如post_install等
changelog= # 更新日志的文件名
source=("$pkgname-$pkgver.tar.gz"
"$pkgname-$pkgver.patch") # 软件包路径
noextract=() # 一个在source中列出,但不应该在运行makepkg时被解包的文件列表
md5sums=() # 软件包的md5
validpgpkeys=()

prepare() { # 此函数会执行用于预处理源文件以进行构建的命令
cd "$pkgname-$pkgver"
patch -p1 -i "$srcdir/$pkgname-$pkgver.patch"
}

build() { # 这个函数使用通用的命令来自动编译软件并创建软件的安装目录
cd "$pkgname-$pkgver"
./configure --prefix=/usr
make
}

check() { # 用来执行make check和其他一些例行测试的地方
cd "$pkgname-$pkgver"
make -k check
}

package() { # 最后一步就是把编译好的文件放到pkg文件夹,一个简单的伪root环境
cd "$pkgname-$pkgver"
make DESTDIR="$pkgdir/" install
}

按照上述要求填写好对应参数。

在安装时,其实会通过makepkg先进行打包,将软件包打包成.zst包,然后再用pacman -U .zst进行安装,这里要注意,在PKGBUILD的编写中需要熟练使用pkgdir变量,makepkg会将该文件夹当成系统根目录,比如:

1
2
3
4
5
package() {
cd "$pkgname-$pkgver"
mkdir ${pkgdir}/opt/
cp -r build/${pkgname}/opt/${pkgname}/ ${pkgdir}/opt/
}

就是将build目录下的软件包移动到${pkgdir}/opt/中,那么在真正安装时,pacman会将软件包安装到系统根目录的/opt/文件夹中,这样做的好处是避免了打包时需要root环境。这样在卸载时,才能卸载干净,要注意package()函数只是用来打包的,而不是用来安装的。

生成.SRCINFO

编写好PKGBUILD后,执行updpkgsums更新哈希值,然后通过makepkg --printsrcinfo > .SRCINFO来生成.SRCINFO文件。

.SRCINFO 用一个简单直接的格式记录软件包的元数据。AUR的网站后台或AUR工具可以不用解析PKGBUILD就获得需要的信息。里面的内容相当于将PKGBUILD里的内容提取了一部分。所以可以看出来PKGBUILD文件是打包过程中最核心的文件。

上传软件包

有了PKGBUILD.SRCINFO后,先在本地使用测试是否能够正常安装:

1
2
makepkg
pacman -U .zst

如果没有问题,就可以通过git上传到AUR了,注意上传时PKGBUILD.SRCINFO文件是必传的,软件包则不需要上传。至此,就完成了打包软件包到AUR的过程。

  • 本文标题:将软件打包到AUR
  • 本文作者:Kale
  • 创建时间:2022-06-18 18:03:29
  • 本文链接:https://kalew515.com/2022/06/18/将软件打包到AUR/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!