簡介
這篇文章主要介紹在 Arch Linux 中的 ABS 系統,ABS 系統可以讓我們通過源碼編譯的方式安裝軟件包。
背景知識
通過 pacman 安裝軟件包時,我們安裝的都是編譯好的二進制包,Arch Linux 中的 pacman 包管理程序沒有提供像其他 Linux 發行版下(比如 Ubuntu)那樣的 -dev 之類的包。而是提供了一個 ABS 來幫助用戶來定制化地安裝軟件包。
這是 Arch Linux 中的 The Arch Way 的一個特點,主要目的就是精簡,縮小體積。
當我們需要手動編譯安裝包(定制安裝選項)時,我們可以使用 Arch 提供的 ABS 系統。
ABS 是什么?
ABS 全稱是 Arch Build System,是一個用于把源碼進行編譯和打包的 port-like system。
區別與 pacman 的是,pacman 是一個專門用于管理二進制包的工具(包括由 ABS 編譯打包而成的二進制包),而 ABS 則包含了一組把源碼打包成 .pkg.tar.xz 包的工具。
什么是 port-like 系統?
port 就是一個小目錄,它包含了源碼文件,以及一些編譯和安裝軟件的腳本配置,這就使得在 port 目錄中,安裝軟件變得極其簡單,只需要像執行一個 make 或 make install 命令一樣簡單。
ABS 包中有哪些東西?
ABS 是由一個目錄樹來組成,可以通過 svn 或者 git 命令來 checkout。
注意,在這個目錄樹下面不包含任何 Arch 官方包,子目錄中也不包含軟件包的源碼,而是包含了一個 PKGBUILD 文件,它實際上是一個 shell 腳本,其包含了如何構建軟件的指令。通過在當前目錄中執行 makepkg 命令,來進行構建。
注意:
ABS 目錄中并不包含源碼,而是在 PKGBUILD 中包含了一個 URL 鏈接,在執行 makepkg 命令的時候會去下載源碼。
因此,在編譯某個包的源碼之前,我們需要在本地電腦 Checkout 這個包。
下面展示一下如何使用 svn 來 checkout acl 這個包。
1) 先創建一個名為 packages 的空目錄
$ svn checkout --depth=empty svn://svn.archlinux.org/packages
該命令會創建一個目錄,里面是空的,并把該目錄初始化為一個 ABS 目錄,如下:
2) Checkout 一個包
$ svn update package-name
執行這個命令后,指定的包就會被拉下來。注意,如果指定的包名不存在,那么 svn 不會提示,也不會創建任何目錄,所以用戶需要自己確認包名的正確,可以去
https://www.archlinux.org/packages 查看包是否存在。
使用 Git 來 Checkout
需要先安裝 asp 工具(sudo pacman -Sy asp
)
安裝好 asp 之后,直接執行 asp checkout openssl
就可以把 openssl 的 ABS tree 拉下來了。
acl 中的 PKGBUILD 內容
包的編譯
編譯之前,我們可能需要根據需要來修改 PKGBUILD 的配置,因此,先把我們要準備編譯的包的目錄拷貝到
其他地方,進行相應的修改,然后執行 makepkg 命令。
小貼士
在我們通過 makepkg 手動編譯安裝了某個包之后,如果不小心又執行了 pacman 命令來安裝同一個包,那么我們手動安裝的版本就會被覆蓋。如果想要避免這種情況,那么可以采用下面的辦法:
在 PKGBUILD 文件中添加下面一行:
groups=('modified')
然后在 /etc/pacman.conf 中,把上述的 group 也即 modified 添加到 IgnoreGroup 中去,如下:
執行
makepkg
執行 makepkg 時會下載源碼包,同時進行簽名校驗,這個時候可能會出現一個驗簽失敗錯誤
解決辦法
執行 gpg --recv-key <KEYID> 獲取 key 即可
原因是 makepkg 不使用 pacman 的 keyring,而是使用當前用戶目錄下 ~/.gnugpg
中的 keyring。
執行 makepkg 命令成功后,顯示如下:
源碼這時候也就編譯成功了,會生成一個 pkg 的目錄,其中包含了所有編譯后的結果,如下:
這時候,執行 下面的命令來安裝剛才編譯好的包
sudo pacmane -U openssl-1.1.0.g-1-x86_64.pkg.tar.xz