Arch Linux AUR软件包创建完全指南 轻松掌握Linux打包技术从入门到精通 详解PKGBUILD编写与软件包提交流程 助你成为AUR贡献者

1. 介绍Arch Linux和AUR
Arch Linux简介
Arch Linux是一个简洁、轻量级的Linux发行版,以其简洁性、自定义性和”滚动更新”模式而闻名。Arch Linux采用KISS(Keep It Simple, Stupid)原则,提供了基础系统,让用户可以根据自己的需求构建个性化的Linux环境。Arch的软件包管理系统使用pacman作为主要工具,以其简单性和速度而著称。
AUR (Arch User Repository)的概念和重要性
Arch User Repository(AUR)是Arch Linux社区驱动的软件仓库,它允许用户分享和获取PKGBUILD脚本,这些脚本用于从源代码构建软件包。AUR不是官方仓库的一部分,但它极大地扩展了Arch Linux可用的软件数量。
AUR的工作原理是用户提交PKGBUILD文件,其他用户可以下载这些文件并使用makepkg工具来构建和安装软件包。AUR包含了许多官方仓库中没有的软件,包括最新版本的应用程序、特定工具、修改版本等。
为什么应该为AUR贡献软件包
为AUR贡献软件包有以下好处:
帮助社区
:通过分享你的工作,你使其他用户能够轻松安装和使用你需要的软件。
提升技能
:学习PKGBUILD编写和软件打包技术,深入了解Linux系统工作原理。
回馈开源
:如果你使用开源软件,为AUR贡献软件包是回馈社区的一种方式。
解决问题
:当你需要某个软件但官方仓库中没有时,自己创建并分享给他人。
建立声誉
:在Arch Linux社区中建立声誉,与其他贡献者建立联系。
2. 准备工作
开发环境设置
在开始创建AUR软件包之前,你需要设置一个适当的开发环境:
安装Arch Linux
:虽然可以在其他发行版上创建AUR软件包,但强烈建议在原生Arch Linux系统上进行,以确保兼容性和测试准确性。
更新系统
:确保你的系统是最新的:
sudo pacman -Syu
创建开发目录
:在你的家目录中创建一个专门用于AUR开发的目录:
mkdir -p ~/aur
cd ~/aur
必要工具安装
创建AUR软件包需要一些基本工具:
基础开发工具
:
sudo pacman -S base-devel
这将安装一组基本的开发工具,包括gcc、make、automake等。
版本控制系统
:
sudo pacman -S git
Git用于与AUR仓库交互和版本控制。
AUR助手(可选)
:
虽然可以使用pacman和makepkg手动处理AUR软件包,但使用AUR助手可以简化流程。一些流行的AUR助手包括yay、paru等。例如,安装yay:
git clone https://aur.archlinux.org/yay.git
cd yay
makepkg -si
检查工具
:
sudo pacman -S namcap
Namcap是一个用于检查PKGBUILD文件和软件包质量的工具。
AUR账户创建
要向AUR提交软件包,你需要创建一个AUR账户:
访问
AUR官网
点击右上角的”Register”链接
填写用户名、密码、电子邮件和其他必要信息
阅读并接受AUR使用条款
提交注册表单
检查你的电子邮件并点击验证链接以激活账户
注册后,你就可以使用SSH密钥或密码通过Git与AUR交互。推荐使用SSH密钥,因为它更安全且更方便。
设置SSH密钥:
ssh-keygen -t ed25519 -C “your_email@example.com”
然后将公钥(~/.ssh/id_ed25519.pub)添加到你的AUR账户设置中。
3. PKGBUILD基础
PKGBUILD文件结构
PKGBUILD是一个包含构建Arch Linux软件包所需信息的shell脚本。它定义了软件包的元数据、构建过程和依赖关系。一个基本的PKGBUILD文件包含以下部分:
元数据变量
:如pkgname、pkgver、pkgrel等
构建变量
:如source、md5sums、sha256sums等
构建函数
:如build()、package()等
下面是一个简单的PKGBUILD示例:
# Maintainer: Your Name
pkgname=example
pkgver=1.0.0
pkgrel=1
pkgdesc=”An example package”
arch=(‘x86_64’)
url=”https://example.com”
license=(‘GPL’)
depends=(‘glibc’)
source=(“https://example.com/releases/example-$pkgver.tar.gz”)
sha256sums=(‘a1b2c3d4e5f6789012345678901234567890abcdef1234567890abcdef12345678’)

build() {
cd “$pkgname-$pkgver”
./configure –prefix=/usr
make
}

package() {
cd “$pkgname-$pkgver”
make DESTDIR=”$pkgdir” install
}
基本变量和函数
以下是PKGBUILD中常用的基本变量和函数:
变量
pkgname
:软件包名称,通常与软件名称相同。
pkgver
:软件的版本号。
pkgrel
:软件包的发布号,当PKGBUILD有修改但软件版本不变时递增。
pkgdesc
:软件包的简短描述。
arch
:软件包支持的架构,如’x86_64’、’i686’、’arm’等,或’any’表示架构无关。
url
:软件的官方网站URL。
license
:软件的许可证,如’GPL’、’MIT’等。
depends
:运行时依赖的其他软件包。
makedepends
:构建时依赖但不运行时需要的软件包。
optdepends
:可选依赖,提供额外功能但不是必需的。
provides
:此软件包提供的虚拟功能。
conflicts
:与此软件包冲突的其他软件包。
replaces
:此软件包替换的旧软件包。
source
:源文件的URL或本地路径。
sha256sums
(或md5sums、sha1sums等):源文件的校验和,用于验证文件完整性。
函数
prepare()
:在构建前执行的准备步骤,如应用补丁。
build()
:构建软件的主要步骤。
check()
:运行测试套件(可选)。
package()
:将构建的文件安装到pkgdir中,用于创建软件包。
简单示例分析
让我们分析一个更具体的示例,为名为”hello”的简单程序创建PKGBUILD:
# Maintainer: Your Name
pkgname=hello
pkgver=2.10
pkgrel=1
pkgdesc=”A program that produces a familiar, friendly greeting”
arch=(‘x86_64’)
url=”https://www.gnu.org/software/hello/”
license=(‘GPL’)
depends=(‘glibc’)
source=(“https://ftp.gnu.org/gnu/hello/hello-$pkgver.tar.gz”)
sha256sums=(’31e066137a962676e89f69d1b78353a82a1c664c241ce46ac14965f03986858′)

build() {
cd “$pkgname-$pkgver”
./configure –prefix=/usr
make
}

package() {
cd “$pkgname-$pkgver”
make DESTDIR=”$pkgdir” install
}
分析:
元数据
:
pkgname=hello
:软件包名称为”hello”。
pkgver=2.10
:软件版本为2.10。
pkgrel=1
:这是该版本的第一个软件包发布。
pkgdesc
:描述了软件的功能。
arch=(‘x86_64’)
:支持64位架构。
url
:提供了软件的官方网站。
license=(‘GPL’)
:使用GPL许可证。
depends=(‘glibc’)
:需要glibc库来运行。
源文件
:
source
:指定了源代码的下载URL。
sha256sums
:提供了源文件的SHA256校验和,用于验证文件完整性。
构建函数
:
build()
:进入源目录,配置构建环境(设置安装前缀为/usr),然后运行make进行构建。
package()
:进入源目录,运行
make install
将文件安装到pkgdir中。
要使用这个PKGBUILD构建软件包,请按照以下步骤操作:
将上述内容保存为PKGBUILD文件。
运行
makepkg
来构建软件包:
makepkg
如果一切顺利,将在当前目录中生成一个名为”hello-2.10-1-x86_64.pkg.tar.xz”的软件包文件。
4. PKGBUILD进阶
复杂依赖处理
在实际应用中,软件包可能有复杂的依赖关系。以下是一些处理复杂依赖的技巧:
条件依赖
有时,某些依赖可能只在特定条件下需要。可以使用条件语句来处理这种情况:
if [[ $CARCH == ‘x86_64’ ]]; then
depends+=(‘some-x86-specific-lib’)
fi
分包依赖
对于大型软件,你可能希望创建多个软件包,每个提供不同的功能。可以使用
pkgname
数组来定义多个软件包:
pkgbase=some-software
pkgname=(“$pkgbase” “$pkgbase-docs” “$pkgbase-plugins”)
pkgver=1.0.0
pkgrel=1
arch=(‘x86_64’)
url=”https://example.com”
license=(‘GPL’)

package_some-software() {
pkgdesc=”Main software package”
depends=(‘glibc’ ‘some-library’)

# 安装主软件
}

package_some-software-docs() {
pkgdesc=”Documentation for some-software”

# 安装文档
}

package_some-software-plugins() {
pkgdesc=”Plugins for some-software”
depends=(“$pkgbase=$pkgver-$pkgrel”)

# 安装插件
}
版本依赖
有时需要指定依赖的最低版本:
depends=(‘some-library>=1.2.0’)
或者指定版本范围:
depends=(‘some-library>=1.2.0’ ‘some-library<2.0.0') 自定义函数和钩子 除了标准的build()和package()函数外,你还可以定义自定义函数来处理特定任务: prepare() { cd "$pkgname-$pkgver" # 应用补丁 patch -p1 < "$srcdir/fix-bug.patch" } check() { cd "$pkgname-$pkgver" make -k check } 使用钩子 PKGBUILD支持一些特殊的钩子函数,如 package_*() ,用于在打包过程中执行特定操作: package() { cd "$pkgname-$pkgver" make DESTDIR="$pkgdir" install # 安装完成后执行的钩子 install -Dm644 "$srcdir/$pkgname.service" \ "$pkgdir/usr/lib/systemd/system/$pkgname.service" } 多软件包构建 当一个源代码树生成多个软件包时,可以使用多软件包构建: # Maintainer: Your Name
pkgbase=example-suite
pkgname=(example-app example-lib example-dev)
pkgver=1.0.0
pkgrel=1
pkgdesc=”A suite of example applications and libraries”
arch=(‘x86_64’)
url=”https://example.com”
license=(‘GPL’)
depends=(‘glibc’)
makedepends=(‘cmake’)
source=(“https://example.com/releases/example-suite-$pkgver.tar.gz”)
sha256sums=(‘a1b2c3d4e5f6789012345678901234567890abcdef1234567890abcdef12345678’)

build() {
cmake -B build -S “$pkgbase-$pkgver” \
-DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_BUILD_TYPE=Release
cmake –build build
}

package_example-app() {
pkgdesc=”Example application”
depends=(‘example-lib’)

DESTDIR=”$pkgdir” cmake –install build
rm -rf “$pkgdir/usr/include” “$pkgdir/usr/lib”
}

package_example-lib() {
pkgdesc=”Example library”

DESTDIR=”$pkgdir” cmake –install build
rm -rf “$pkgdir/usr/bin” “$pkgdir/usr/include”
}

package_example-dev() {
pkgdesc=”Development files for example library”
depends=(‘example-lib’)

DESTDIR=”$pkgdir” cmake –install build
rm -rf “$pkgdir/usr/bin” “$pkgdir/usr/lib”/*.so*
}
在这个例子中,我们构建了三个软件包:
example-app
:主应用程序,依赖于
example-lib
。
example-lib
:共享库。
example-dev
:开发文件(头文件等),依赖于
example-lib
。
每个软件包都有自己独立的package()函数,只安装属于该软件包的文件。
5. 打包最佳实践
Arch Linux打包标准
遵循Arch Linux的打包标准对于创建高质量的软件包至关重要。以下是一些关键标准:
文件系统层次结构
Arch Linux遵循FHS(Filesystem Hierarchy Standard),但有一些特定的约定:
/usr/bin
:用户可执行文件
/usr/lib
:库文件
/usr/include
:头文件
/usr/share
:架构独立的数据
/etc
:系统配置文件
/var
:变量数据
/opt
:可选软件包
软件包命名约定
软件包名称应小写,除非软件本身使用大写字母作为其名称的一部分。
如果软件名称包含数字或特殊字符,保留它们。
对于库,通常使用
lib
前缀。
对于Git/SVN/HG等版本控制的开发版本,使用
-git
、
-svn
、
-hg
等后缀。
依赖关系处理
只列出直接依赖,而不是传递依赖。
使用
makedepends
来指定构建时依赖。
使用
optdepends
来指定可选依赖,并添加说明:
optdepends=(‘python: for Python bindings’
‘perl: for Perl bindings’)
代码风格指南
保持PKGBUILD文件的一致性和可读性对于维护和协作非常重要:
变量定义
按字母顺序排列变量,但
pkgname
、
pkgver
、
pkgrel
和
pkgdesc
应放在最前面。
使用单引号而不是双引号,除非需要变量扩展:
pkgname=’example’
source=(“https://example.com/$pkgname-$pkgver.tar.gz”)
函数定义
函数名后加括号,然后换行:
build() {
cd “$pkgname-$pkgver”
./configure –prefix=/usr
make
}
使用双引号引用变量,以防止单词分割和通配符扩展:
cd “$pkgname-$pkgver”
注释
在文件顶部添加维护者信息:
# Maintainer: Your Name
# Contributor: Other Name
对于复杂的构建步骤,添加注释解释原因:
# Fix for GCC 10 compatibility
sed -i ‘s/-O2/-O2 -fcommon/g’ Makefile
常见错误和解决方案
空目录问题
Arch Linux的软件包不应包含空目录。如果在构建过程中创建了空目录,应在package()函数中删除它们:
package() {
cd “$pkgname-$pkgver”
make DESTDIR=”$pkgdir” install

# 删除空目录
find “$pkgdir” -type d -empty -delete
}
文件权限问题
确保文件权限正确设置:
package() {
cd “$pkgname-$pkgver”
make DESTDIR=”$pkgdir” install

# 设置正确的权限
chmod 644 “$pkgdir/usr/share/doc/$pkgname/”*.md
chmod 755 “$pkgdir/usr/bin/$pkgname”
}
硬编码路径问题
避免在PKGBUILD中硬编码路径,使用变量代替:
# 不好的做法
install -Dm644 “$srcdir/$pkgname-$pkgver/config” “$pkgdir/etc/$pkgname/config”

# 好的做法
install -Dm644 config “$pkgdir/etc/$pkgname/config”
校验和不匹配
如果源文件的校验和不匹配,可能是以下原因:
源文件已更新:更新校验和。
下载损坏:重新下载源文件。
PKGBUILD中的URL错误:检查URL是否正确。
使用
makepkg -g
生成新的校验和:
makepkg -g >> PKGBUILD
6. 测试软件包
本地测试方法
在提交到AUR之前,应在本地充分测试软件包:
构建软件包
:
makepkg
安装软件包
:
sudo pacman -U package-name-version-arch.pkg.tar.xz
测试软件功能
:
运行软件并检查基本功能
验证所有文件是否正确安装
检查依赖关系是否满足
卸载软件包
:
sudo pacman -R package-name
使用namcap检查
Namcap是一个用于检查PKGBUILD文件和软件包质量的工具。它可以检测常见问题和违反Arch Linux打包标准的情况:
检查PKGBUILD文件
:
namcap PKGBUILD
检查构建的软件包
:
namcap package-name-version-arch.pkg.tar.xz
Namcap可能会报告以下类型的问题:
依赖关系问题
文件权限问题
文件位置问题
冗余文件
语法错误
解决Namcap报告的所有问题,除非有特定原因忽略某个警告。
在chroot环境中测试
为了确保软件包在干净的环境中正常工作,可以使用chroot环境进行测试:
安装devtools
:
sudo pacman -S devtools
创建chroot环境
:
mkarchroot -C /etc/pacman.conf /path/to/chroot base-devel
在chroot中构建软件包
:
makechrootpkg -c -r /path/to/chroot
使用chroot环境测试可以确保软件包不依赖于你的系统上安装的特定软件包或配置,从而提高软件包的可靠性。
7. 提交到AUR
AUR Web界面使用
AUR提供了一个Web界面,用于管理软件包和账户:
登录AUR
:
访问
AUR官网
并使用你的账户凭据登录。
提交新软件包
:
点击”Submit”链接
输入软件包名称
上传PKGBUILD文件
添加软件包描述和类别
提交表单
管理现有软件包
:
登录后,点击”My Packages”查看你提交的软件包
点击软件包名称进入管理页面
在此页面可以更新软件包、查看评论、报告问题等
Git操作与AUR
AUR使用Git作为其后端,你可以使用Git命令与AUR交互:
克隆软件包仓库
:
git clone ssh://aur@aur.archlinux.org/packagename.git
cd packagename
添加PKGBUILD文件
:
“`bash
创建PKGBUILD文件
nano PKGBUILD
# 添加其他必要文件(如.patch、.install等)
# 添加所有文件到Git
git add .
3. **提交更改**:
“`bash
git commit -m “Initial commit”
推送到AUR
:
git push origin master
更新软件包
:
“`bash
修改PKGBUILD文件
nano PKGBUILD
# 提交更改
git add PKGBUILD
git commit -m “Update to version 1.1.0”
git push origin master
### 维护和更新软件包

作为AUR贡献者,维护你的软件包是一个持续的过程:

1. **监控上游更新**:
– 定期检查软件的官方网站或仓库,了解新版本发布
– 订阅软件的邮件列表或RSS源
– 使用工具如`pkgwatch`自动监控更新

2. **更新软件包**:
– 当新版本发布时,更新PKGBUILD中的`pkgver`和`source`数组
– 更新校验和(可以使用`makepkg -g`生成新的校验和)
– 测试构建和安装
– 提交更新到AUR

3. **处理用户反馈**:
– 定期检查AUR上的评论和问题报告
– 回应用户的问题和建议
– 修复报告的问题

4. **弃用软件包**:
– 如果软件不再维护或被官方仓库收录,可以弃用软件包
– 在PKGBUILD中添加注释说明原因
– 可以联系AUR管理员请求删除软件包

## 8. 高级主题

### 处理复杂构建系统

现代软件可能使用各种构建系统,以下是一些常见构建系统的处理方法:

#### CMake

“`bash
build() {
cmake -B build -S “$pkgname-$pkgver” \
-DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_BUILD_TYPE=Release \
-DENABLE_SOME_FEATURE=ON
cmake –build build
}

package() {
DESTDIR=”$pkgdir” cmake –install build
}
Meson
build() {
arch-meson “$pkgname-$pkgver” build \
-Dsome_feature=true
meson compile -C build
}

package() {
DESTDIR=”$pkgdir” meson install -C build
}
QMake
build() {
cd “$pkgname-$pkgver”
qmake PREFIX=/usr
make
}

package() {
cd “$pkgname-$pkgver”
make INSTALL_ROOT=”$pkgdir” install
}
Python包
build() {
cd “$pkgname-$pkgver”
python setup.py build
}

package() {
cd “$pkgname-$pkgver”
python setup.py install –prefix=/usr –root=”$pkgdir” –optimize=1
}
Go程序
build() {
cd “$pkgname-$pkgver”
export CGO_CPPFLAGS=”${CPPFLAGS}”
export CGO_CFLAGS=”${CFLAGS}”
export CGO_CXXFLAGS=”${CXXFLAGS}”
export CGO_LDFLAGS=”${LDFLAGS}”
export GOFLAGS=”-buildmode=pie -trimpath -ldflags=-linkmode=external -mod=readonly -modcacherw”
go build .
}

package() {
cd “$pkgname-$pkgver”
install -Dm755 “$pkgname” “$pkgdir/usr/bin/$pkgname”
}
跨架构打包
Arch Linux支持多种架构,包括x86_64、i686、arm、armv6h、armv7h、aarch64等。创建跨架构软件包时需要注意以下几点:
指定支持的架构
:
arch=(‘x86_64’ ‘i686’ ‘armv7h’ ‘aarch64’)
处理架构特定的依赖
:
if [[ $CARCH == ‘x86_64’ ]]; then
depends+=(‘some-x86-specific-lib’)
elif [[ $CARCH == ‘arm’* ]]; then
depends+=(‘some-arm-specific-lib’)
fi
处理架构特定的构建选项
:
build() {
cd “$pkgname-$pkgver”

if [[ $CARCH == ‘x86_64’ ]]; then
./configure –enable-sse2
else
./configure –disable-sse2
fi

make
}
使用通用的变量
:
使用
$CARCH
变量来检测当前架构,并据此调整构建过程。
安全考虑
在创建AUR软件包时,安全性是一个重要考虑因素:
验证源代码
:
只从官方或可信来源下载源代码
验证下载的文件的校验和
如果可能,使用GPG签名验证源代码
安全构建
:
使用chroot环境构建软件包,以避免污染构建环境
避免在构建过程中以root权限运行命令
不要在PKGBUILD中硬编码敏感信息
安全安装
:
确保文件权限正确设置
避免安装setuid/setgid二进制文件,除非绝对必要
谨慎处理系统服务文件和配置文件
更新维护
:
定期更新软件包以修复安全漏洞
监控上游的安全公告
响应用户报告的安全问题
9. 成为优秀AUR贡献者
社区互动
AUR是一个社区驱动的项目,积极参与社区是成为优秀贡献者的关键:
遵循AUR指南
:
阅读并遵循
AUR提交指南
尊重其他贡献者和用户
保持专业和礼貌
参与讨论
:
在Arch Linux论坛和邮件列表中参与讨论
加入Arch Linux的IRC频道(如#archlinux on Libera.Chat)
参加当地的Linux用户组活动
帮助新用户
:
回答AUR评论中的问题
帮助新贡献者改进他们的PKGBUILD
在论坛和邮件列表中提供帮助
处理用户反馈
用户反馈是改进软件包的重要来源,以下是一些处理用户反馈的最佳实践:
及时响应
:
定期检查AUR上的评论和问题报告
尽快回应用户的问题和建议
即使不能立即解决问题,也要让用户知道你已收到反馈
建设性处理批评
:
将批评视为改进的机会
避免防御性反应
感谢用户花时间提供反馈
解决冲突
:
如果与其他用户或贡献者发生分歧,保持冷静和专业
寻求妥协或第三方意见
必要时,可以请求AUR受托人介入
长期维护策略
长期维护AUR软件包需要一定的策略和承诺:
选择合适的软件
:
选择你实际使用和感兴趣的软件
避免维护过多软件包,确保你能及时更新它们
考虑软件的活跃度和社区需求
自动化监控
:
使用工具如
pkgwatch
或
nvchecker
自动监控上游更新
设置RSS订阅或邮件通知,了解软件发布
使用CI/CD工具自动测试构建
寻求合作
:
如果无法继续维护软件包,寻找共同维护者
在AUR评论中请求帮助
在论坛或邮件列表中寻找志愿者
记录和文档
:
在PKGBUILD中添加注释,解释复杂的构建步骤
维护详细的变更日志
为用户提供安装和使用说明
10. 结语和资源
进一步学习资源
要深入学习Arch Linux和AUR打包技术,以下资源非常有用:
官方文档
:
Arch Linux Wiki
:包含大量关于Arch Linux和AUR的信息
Arch Linux包维护指南
PKGBUILD示例
书籍
:
“Arch Linux: A Comprehensive Guide” by J. S. Evans
“The Arch Way” by the Arch Linux community
在线教程
:
How to Create an Arch Linux Package
(YouTube视频)
AUR Package Creation Tutorial
社区资源
:
Arch Linux论坛
Arch Linux邮件列表
Arch Linux Reddit社区
社区支持渠道
如果你在创建AUR软件包时遇到问题,可以通过以下渠道寻求帮助:
AUR评论
:
在AUR软件包页面上评论,询问问题或报告问题。
Arch Linux论坛
:
在”Packaging”版块发布问题,寻求帮助。
IRC频道
:
加入#archlinux或#archlinux-aur on Libera.Chat,与其他用户和贡献者实时交流。
邮件列表
:
向aur-general@archlinux.org邮件列表发送问题。
GitHub/GitLab
:
许多AUR贡献者在GitHub或GitLab上维护他们的PKGBUILD仓库,你可以通过这些平台联系他们。
通过这些资源和支持渠道,你可以不断提高你的AUR打包技能,成为一名优秀的AUR贡献者,为Arch Linux社区做出有意义的贡献。
记住,AUR是一个社区项目,每个人的贡献都很重要。无论你是新手还是经验丰富的贡献者,你的工作都帮助使Arch Linux成为一个更强大、更灵活的发行版。祝你在AUR打包之旅中取得成功!