arch-wiki-md-repo
Version:
All arch-wiki articles in markdown format, updated every two days.
242 lines (146 loc) • 13.5 kB
Markdown
相关文章
* [Arch packaging standards](/index.php/Arch_packaging_standards "Arch packaging standards")
* [Creating packages](/index.php/Creating_packages "Creating packages")
* [Kernel Compilation with ABS](/index.php/Kernel_Compilation_with_ABS "Kernel Compilation with ABS")
* [PKGBUILD](/index.php/PKGBUILD_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "PKGBUILD (简体中文)")
* [makepkg](/index.php/Makepkg_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "Makepkg (简体中文)")
* [pacman](/index.php/Pacman_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "Pacman (简体中文)")
* [官方软件仓库](/index.php/Official_repositories_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "Official repositories (简体中文)")
* [AUR](/index.php/Arch_User_Repository_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "Arch User Repository (简体中文)")
**翻译状态:** 本文是英文页面 [Arch_Build_System](/index.php/Arch_Build_System "Arch Build System") 的[翻译](/index.php/ArchWiki_Translation_Team_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "ArchWiki Translation Team (简体中文)"),最后翻译时间:2017-10-31,点击[这里](https://wiki.archlinux.org/index.php?title=Arch_Build_System&diff=0&oldid=491300)可以查看翻译后英文页面的改动。
本文简要介绍 Arch 编译系统,同时提供一个使用教程。这不是一个完整的参考指南!
## Contents
* [1 什么是 ABS](#.E4.BB.80.E4.B9.88.E6.98.AF_ABS)
* [1.1 类 ports 系统又是什么?](#.E7.B1.BB_ports_.E7.B3.BB.E7.BB.9F.E5.8F.88.E6.98.AF.E4.BB.80.E4.B9.88.EF.BC.9F)
* [1.2 ABS 的概念与之相似](#ABS_.E7.9A.84.E6.A6.82.E5.BF.B5.E4.B8.8E.E4.B9.8B.E7.9B.B8.E4.BC.BC)
* [1.3 ABS概览](#ABS.E6.A6.82.E8.A7.88)
* [1.3.1 SVN目录树](#SVN.E7.9B.AE.E5.BD.95.E6.A0.91)
* [2 我为什么要用ABS](#.E6.88.91.E4.B8.BA.E4.BB.80.E4.B9.88.E8.A6.81.E7.94.A8ABS)
* [3 如何使用 ABS](#.E5.A6.82.E4.BD.95.E4.BD.BF.E7.94.A8_ABS)
* [3.1 使用 SVN 获取 PKGBUILD](#.E4.BD.BF.E7.94.A8_SVN_.E8.8E.B7.E5.8F.96_PKGBUILD)
* [3.1.1 前提](#.E5.89.8D.E6.8F.90)
* [3.1.2 非递归checkout](#.E9.9D.9E.E9.80.92.E5.BD.92checkout)
* [3.1.3 Checkout软件包](#Checkout.E8.BD.AF.E4.BB.B6.E5.8C.85)
* [3.2 使用 Git 获取 PKGBUILD](#.E4.BD.BF.E7.94.A8_Git_.E8.8E.B7.E5.8F.96_PKGBUILD)
* [3.3 构建软件包](#.E6.9E.84.E5.BB.BA.E8.BD.AF.E4.BB.B6.E5.8C.85)
* [4 技巧](#.E6.8A.80.E5.B7.A7)
* [4.1 保留修改过的软件包](#.E4.BF.9D.E7.95.99.E4.BF.AE.E6.94.B9.E8.BF.87.E7.9A.84.E8.BD.AF.E4.BB.B6.E5.8C.85)
* [4.2 Checkout旧版本软件包](#Checkout.E6.97.A7.E7.89.88.E6.9C.AC.E8.BD.AF.E4.BB.B6.E5.8C.85)
* [5 其它工具](#.E5.85.B6.E5.AE.83.E5.B7.A5.E5.85.B7)
## 什么是 ABS
ABS(Arch Build System)指的是Arch的构建系统。这是一种从源代码编译软件的类 ports 系统。在Arch中,[pacman](/index.php/Pacman_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "Pacman (简体中文)") 专门管理二进制软件包(包括那些由ABS创建的),而ABS则是一系列工具,负责把源代码编译成可安装的`.pkg.tar.xz` 软件包。
### 类 ports 系统又是什么?
'Ports'是 *BSD 使用的一种系统,可以自动下载源代码、解压缩、打补丁、编译和安装。一个“port”仅仅是指用户电脑上的一个目录,根据即将安装的相应软件来命名,包含一些文件来指导源码的下载和编译安装,典型的方式是找到那个目录(或者说port),进行`make`或 `make install clean`,然后系统就会下载、编译和安装你想要的软件了。
### ABS 的概念与之相似
**ABS**由一个目录树构成,可以用SVN checkout。这个目录树表示(但不包含)所有**官方 Arch 软件**。ABS子目录**并不包含软件包或源代码**,而是包含一个[PKGBUILD](/index.php/PKGBUILD_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "PKGBUILD (简体中文)") 文件(有时也会有其它文件)。在有PKGBUILD文件的目录里运行[makepkg](/index.php/Makepkg_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "Makepkg (简体中文)")命令,将在目录中编译软件,并打包。然后就可以通过[pacman](/index.php/Pacman_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "Pacman (简体中文)")进行安装或升级了。
### ABS概览
'ABS'可以作为一个总括性术语来使用,因为它包含并依赖于若干其他部件。因此,尽管从严格意义上来讲并不精确,ABS可指代包含以下工具的完整工具集:
SVN目录树
目录树包含所有官方软件包的构建所需文件,不包括软件包本身和源代码。在[svn](https://www.archlinux.org/svn/)和[git](https://projects.archlinux.org/svntogit/packages.git/)仓库中。
[PKGBUILD](/index.php/PKGBUILD_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "PKGBUILD (简体中文)")
[Bash](/index.php/Bash "Bash")脚本,包含软件的源代码位置和编译打包指令。
[makepkg](/index.php/Makepkg_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "Makepkg (简体中文)")
ABS的 shell 命令工具,读取 PKGBUILD,下载源码,根据`makepkg.conf` 中的`PKGEXT`编译并创建 `.pkg.tar.gz` 或 `.pkg.tar.xz`包。也可以用makepkg从[AUR](/index.php/AUR_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "AUR (简体中文)")或第三方代码构建自定义软件包。参考[Creating packages](/index.php/Creating_packages_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "Creating packages (简体中文)")。
[Pacman](/index.php/Pacman_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "Pacman (简体中文)")
pacman是完全独立的,但是在安装或移除软件包、解决依赖性时都是必需的。它或者被 makepkg 调用或者被手动执行。
[AUR](/index.php/Arch_User_Repository_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "Arch User Repository (简体中文)")
ArchLinux社区的用户维护的软件仓库独立于ABS,包含[unsupported]的PKGBUILDs。它们同样可以可以通过ABS的makepkg工具来编译并打包成可安装软件。ABS 树位于本地机器,而 AUR 则是网站界面。包含成千上万用户共享的 PKGBUILD。如果需要编译官方 Arch 树之外的软件包,AUR 中已经存在的可能性非常大。
**Warning:** 官方PKGBUILD假定包是在干净的chroot环境中构建的([built in a clean chroot](/index.php/DeveloperWiki:Building_in_a_Clean_Chroot "DeveloperWiki:Building in a Clean Chroot")). 在*脏*的环境中构建可能会失败或者在运行时有意外行为。 因为如果编译系统动态检查依赖的话,编译结果会受到当前可用包的影响。
#### SVN目录树
*core*, *extra*和*testing* [官方软件仓库](/index.php/%E5%AE%98%E6%96%B9%E8%BD%AF%E4%BB%B6%E4%BB%93%E5%BA%93 "官方软件仓库") 可从官方SVN的*packages* 仓库[checkout](#.E9.9D.9E.E9.80.92.E5.BD.92checkout). 而*community*和*multilib*在*community* SVN仓库。
每个包有各自的子目录,其中又有`repos`和`trunk`目录。`repos`又进一步按仓库名(如*core*)和架构细分。`repos`里的PKGBUILD和其它文件用来构建官方包。`trunk`里的文件是正在开发的,并最终复制到`repos`。
例如,[acl](https://www.archlinux.org/packages/?name=acl)的目录结构像这样:
```
acl
acl/repos
acl/repos/core-i686
acl/repos/core-i686/PKGBUILD
acl/repos/core-x86_64
acl/repos/core-x86_64/PKGBUILD
acl/trunk
acl/trunk/PKGBUILD
```
源代码并不直接包含在ABS目录中,而是构建时从`PKGBUILD`里指定的源代码URL下载。
## 我为什么要用ABS
ABS 可以用来:
* 编译或重新编译软件包
* 从源代码编译Arch官方源里没有的软件(详情请参照[创建软件包](/index.php/Creating_packages_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "Creating packages (简体中文)"))
* 定制现有的软件包以满足你的特定需求(通过开启或禁用相关选项)
* 用你的编译器的flags重新构建整个系统,“就像FreeBSD那样” 。(使用[pacbuilder-svn](https://aur.archlinux.org/packages/pacbuilder-svn/)不支持 git 仓库)
* 干净地编译安装你自己定制的内核。(参照[内核编译(简体中文)](/index.php/Kernel_Compilation_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "Kernel Compilation (简体中文)"))
* 使内核模块(比如某些显卡驱动)在你定制的内核下正常工作
* 修改 PKGBUILD 中的版本就能方便的编译和安装新的、老的、beta 或者开发版本的 Arch 软件包
使用 Arch Linux 不一定会用到 ABS,但 ABS 确实可以自动化进行许多源码编译工作。
## 如何使用 ABS
要获取需要的 [PKGBUILD](/index.php/PKGBUILD "PKGBUILD"),从源代码编译软件包,需要使用 [Svn](/index.php/Svn "Svn") 或支持 [Git](/index.php/Git "Git") 的 [asp](https://www.archlinux.org/packages/?name=asp)。
### 使用 SVN 获取 PKGBUILD
#### 前提
[安装](/index.php/%E5%AE%89%E8%A3%85 "安装")[subversion](https://www.archlinux.org/packages/?name=subversion)包。
#### 非递归checkout
**Warning:** 不要下载整个仓库,请按下面的说明操作。整个SVN非常大,不只会占用大量的空间,archlinux.org服务器也会因为下载产生费用。非正常使用可能会导致你的地址被封禁。不要对公共SVN进行任何脚本操作。
要checkout *core*, *extra*,和*testing*仓库:
```
$ svn checkout --depth=empty svn://svn.archlinux.org/packages
```
要checkout *community*和*multilib*仓库:
```
$ svn checkout --depth=empty svn://svn.archlinux.org/community
```
两条命令都只是创建了空目录,但它知道这是SVN checkout目录。
#### Checkout软件包
在刚才checkout的SVN仓库(*packages*或*community*)中执行:
```
$ svn update *package-name*
```
这条命令把指定的包同步到你的checkout目录。以后在顶层目录执行*svn update*时,这个包也会更新。
如果指定的包不存在,svn不会产生警告,只是显示类似"At revision 115847"而不创建文件。出现这种情况时:
* 检查软件包名的拼写
* 检查包是不是被移到了另一个仓库 (例如从community到主仓库)
* 到 [https://www.archlinux.org/packages](https://www.archlinux.org/packages) 检查这个包是不是从另一个基础包构建的 (例如[python-tensorflow](https://www.archlinux.org/packages/?name=python-tensorflow)是在[tensorflow](https://www.archlinux.org/packages/?name=tensorflow) PKGBUILD里构建的)
**Tip:** 要check旧版本,参考[#Checkout旧版本软件包](#Checkout.E6.97.A7.E7.89.88.E6.9C.AC.E8.BD.AF.E4.BB.B6.E5.8C.85).
如果想在最新的版本进行编译,定期执行:
```
$ svn update
```
### 使用 Git 获取 PKGBUILD
先安装 [install](/index.php/Install "Install") 软件包 [asp](https://www.archlinux.org/packages/?name=asp)。
要获取某个软件包的 svntogit 仓库:
```
$ asp checkout *pkgname*
```
这个命令会将软件包的 git 仓库克隆到一个目录。
要更新本地仓库,在仓库目录执行 `asp update`,然后执行 `git pull`.
可以使用 git 的其它命令获取软件包的老版本,或记录自定也改动,详情请参考 [git](/index.php/Git "Git") 页面。
仅要获取某个软件包当前版本的快照,执行:
```
$ asp export *pkgname*
```
### 构建软件包
关于如何配置*makepkg*来从[PKGBUILD](/index.php/PKGBUILD_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "PKGBUILD (简体中文)")构建软件包,请参考[makepkg (简体中文)#配置](/index.php/Makepkg_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)#.E9.85.8D.E7.BD.AE "Makepkg (简体中文)")。
把[PKGBUILD](/index.php/PKGBUILD_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) "PKGBUILD (简体中文)")所在目录复制到新的位置。在新目录按需要进行修改。 并按照[makepkg (简体中文)#使用](/index.php/Makepkg_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)#.E4.BD.BF.E7.94.A8 "Makepkg (简体中文)")来构建和安装软件包。
## 技巧
### 保留修改过的软件包
Pacman 进行升级时会将修改后的软件包升级到仓库中的最新版本,可以通过下面方式避免这个行为:
在 PKGBUILD 中将软件包加入 `modified` 组.
`PKGBUILD` `groups=('modified') `
然后将此组加入`/etc/pacman.conf` 的 `IgnoreGroup`:
`/etc/pacman.conf` `IgnoreGroup = modified`
当系统生升级发现官方仓库中有新版本时,pacman会显示软件包因为在*IgnoreGroup*中而被忽略的提示,这时需要从 ABS 编译更新的软件包以防止部分升级。
### Checkout旧版本软件包
在checkout[#非递归checkout](#.E9.9D.9E.E9.80.92.E5.BD.92checkout)的SVN仓库目录 (即"packages"或"community") 中查看日志:
```
$ svn log *package-name*
```
从历史记录中找出要checkout的版本。例如要checkout版本`r1729`:
```
$ svn update -r1729 *package-name*
```
已存在的*package-name*目录会更新成指定版本。
也可以指定一个日期,如果当天没有对应版本,svn会找出之前的最近版本。下面的例子checks out了2009-03-03的版本:
```
$ svn update -r{20090303} *package-name*
```
要checkout被移动到另一个仓库之前的包,只需查看日志,找到移动之前的日期或版本即可。
## 其它工具
* [pbget](http://xyne.archlinux.ca/projects/pbget/) - 从web接口直接获取某个包的PKGBUILD,支持AUR.
* [asp](https://github.com/falconindy/asp) - 管理Arch Linux包构建源文件的工具。使用了git接口获取新的源。