上一章中,我们对源代码安装软件的过程做了一个总结
对 PKGBUILD 文件 和 makepkg 也有了些大概的了解
此外,我们还认识了 AUR 、ABS 、和 yaourt 工具。
今天让我们来详细了解究竟是如何从源代码安装软件的,
以及 PKGBUILD 文件这部分是核心内容,并带你深入的了解 pacman。
为了节省时间和字数,以下就不再重复上一章的内容了,直接讲重点内容。

1. 从源代码安装软件

正常情况下,我们下载的源码包会包含以下几个文件:
README (读我)
INSTALL (安装)
COPYING (复件)
ChangeLog (更新日志)
configure(配置)

README 文件:
是源码包的说明文件,是对整个源码包的一个说明,类似于”安装前读我”。
例如: 它会告诉你这是一个什么软件,有哪些功能,能干嘛什么,要安装需要读哪个文件等。
INSTALL 文件:
它会告诉你要怎样安装这个软件,有时还会如何添加插件或干净的安装的方法。
例如: 它可能会告诉你要先执行什么操作再执行哪些操作才能完成安装。
COPYING 文件:
是包含一些版权信息,例如 GNU许可证,一般都是从官方分发的许可证中复制过来。
大致就是告诉你开发者拥有哪些版权,你能否修改源代码,能否重新分发,受到哪些限制等
ChangeLog 文件:
是告诉你更新了哪些功能,添加了什么新功能,以及一些存在问题并指导你如何处理。

注意: 在有些软件源码包中,以上这些文件不一定会同时出现。

另外,
Makefile 文件:
它只是一个文本文件,其内容包含一些规则,在编译的过程中会读取该文件
并安装其中的规则进行编译。其中的内容不过是告诉编译要先编译哪个目录下的文件,
再进入哪个目录进行编译,和 要生成哪些名字的文件以及被存放的位置等信息。
最后,它有时候还会自动清除编译成功后存在的一些缓存文件。
configure 文件:
严格来说,它是一个运行脚本(即可被运行的一个文件),同时它也是一个文本文件。
它可以自动设定源程序以符合各种不同平台上 Linux/Unix 系统的特性,
并且根据系统参数及环境产生合适的 Makefile 文件或 C 头文件,
让源程序可很方便的在这些不同的平台上被编译和链接
因此运行这个文件的最终结果会得到以上提到的 Makefile 文件。
我们知道,configure 是一个配置文件,但其主要的用途是:
1. 根据软件需要,进行软件安装前的一些安装环境配置。
2. 配置软件的主要目的为了适应多平台。
3. 指引安装后的文件都被存放于系统哪个位置。
4. 生成 Makefile 文件以提供编译器编译软件。

make 工具:
这是一个 GNU 工具,它只认识 Makefile 文件(有时候可能并非这个名字,除非在选项中指出)
它包含一个命令 make,其命令格式为 make [选项] [文件名]
这个工具的作用是:
除非你用选项指定文件的名字,否则该命令会在当前目录下寻找 Makefile 名字的文件,
根据文件的指定的规则,并按规则进行编译整个源码目录。
在没有意外的情况下,会成功生成一个最终可执行的文件
/**/
install 工具:
顾名思义,就是安装的意思。其实际操作是复制文件到指定的目录并设置属性。
这些属性包括例如添加环境变量,设置可执行文件等其他文件的一些权限设置等等。
它包含一个命令 install 其命令格式为 install [选项] ... 可进行多选项
/*/

有了以上这些知识我们来尝试编译和安装一个软件
以 gedit 软件为例,你可到官方[下载][] gedit-3.22.0.tar.xz
解压到 home 下得到 gedit-3.22.0 名字的目录,你可先浏览一遍目录,
我假设你已经看过 INSTALL 文件(因为不同版本的安装方法可能有所差异),
安装上一章的安装过程: 配置(configure) -> 编译(make) -> 安装(make install)
接着执行以下

1
2
3
4
5
#	cd gedit-3.22.0	// 进入源码根目录
# ./configure // 运行脚本,进行安装前的系统配置
# make // 编译
# su root // 更改为 root 用户,因为 make install 需要有足够的权限
$ make install // 编译并安装

这里主要解释最后三条命令 ,
执行 # ./configure时:
它对软件进行配置,并生成最终文件 Makefile 文件。
如果这里配置失败,则不会生成 Makefile 文件。
执行 # make 时:
它在当前目录下寻找 Makefile 文件,
如果上面配置失败则找不到这个文件编译失败
如果你略懂 Makefile 的一些规则语法,当你打开这个文件来看就能发现
里面有几个几个隐式规则,其中一个就是名为 install 的规则
实际上 $ make install就是执行 Makefile 文件中的隐式规则。
该规则定义了一系列安装(拷贝)配置等信息。切勿以为是 make 的选项。
此外还有几个隐式规则名为: unistallcleandisclean 等。
这意味着你可以卸载,或在安装过程中出现问题可以清除某些缓存文件等。
然而在根目录下有一个 install.sh,根据内容说明,好像是当Makefile
文件中没有定义 install 隐式规则时,则执行该 bash 脚本进行安装。

ok!那么在默认情况下,你所安装的软件最终会被分配到这几个目录下:
可执行文件在 /usr/local/bin
库文件默认在 /usr/local/lib
配置文件是在 /usr/local/etc
其他资源原件 /usr/local/share

有时候为了便于集中管理某个软件中的各个文件,
或者,为了根据自己的需求来配置软件,便有了配置选项。
我们知道,# ./configure是运行当前目录下的 configure 配置文件。
当你使用选项进行配置的时候是这样 # ./configure [选项]=你要设置的东西
配置选项很多,但我不会在这里一一列出来。
只是 ./configure -help可以查看所有可使用的选项和说明 。
于是我只在这里介绍一两个常用的选项。
-prefix 选项
该选项用于配置安装后的文件目录分布。
如果你在安装前这样配置:
# ./configure -prefix=/usr/
则软件安装后的所有文件都在 /usr/目录下。
这样你就能够很好的管理软件包的各个文件,
删除也可直接删除整个软件目录而不残留。

段落结语:
有时候源码安装软件就是这么简单,
但有时候还是很麻烦很复杂,
甚至还有可能需要手动修改源码才能成功安装。
但但部分软件遵循以上散步可以完成安装。
[下载]:(http://ftp.gnome.org/pub/GNOME/sources/gedit/3.22/)

2. PKGBUILD 文件

使用 PKGBUILD 的好处是易于修改、可定制(即按自己需求来安装),
从源码下载到成功安装的整个过程都是透明的,使别人无法添加恶意脚本。
上一章中我们说到,PKGBUILD 分为三部分,这么说其实不全对,但也不为过。
实际上 PKGBUILD 是一个简单的 bash 脚本文件,为文本格式,
包含对编译,打包过程的指示,和源代码的下载地址等。
该文件的内容其实就是定义一系列变量,和几个函数。
变量:
理论上(是我个人认为的),变量名应该可随意改,它被读取的机制应该是按顺序读取。
可能是为了让读者容易看,并且格式统一,因此大都采用相同的变量名。
我将用这些标准的变量名来讲,以下是标准的 PKGBUILD 个文件的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 基本信息
pkgname=软件名
pkgver=软件包版本号
pkgrel=软件版本号
pkgdesc="软件简介"
arch=('i686' 'x86_64') // 软件构架,即 32 位还是 64 位
url="软件下载地址"
license=('软件包协议,如 GNU 的 GPL 协议')
depends=('软件运行的' '依赖')
optdepends=('软件的' '可选依赖')
makedepends=('软件编译时' '需要的依赖')
source=("编译需要" "的源码")
md5sums=("验证源码的完整性")
// 编译部分,build 是一个函数
build()
{
编译操作
}
// 打包部分,package 是一个函数
package()
{
打包操作
}

这两个函数内都是简单的 shell 命令。
换句话说,你用源代码是如何编译和打包的的,就把命令添加在编译部分,和打包部分中。
当然,这里还有个元数据的问题,和密匙的问题。
这是当你要自己写 PKGBUILD 文件是必须理解的两个东西。
关于 PKGBUILD 可以参考这两个模板 dgedit-git.gitncmpcpp

3. makepkg

配置
可通过命令 # man makepkg.conf来查询其详细的配置选项
makepkg 的主配置文件位于 /etc/makepkg.conf
用户自己的配置文件则会位于~/.makepkg.conf
建议用户在编译软件包之前检查该配置文件。

该配置文件中的内容选项
。。。

打包人信息
每个软件包都会有元数据信息,其中一箱就是打包人信息( packager)。
默认情况下,用户自己打包的软件标记为 Unknown Packager。
如果你要与他人共享自己的软件包,最好还是是提供真实的信息,
这可以在 makepkg.conf 文件中的 PACKAGER 变量来设置打包人的信息。

参考地址:
https://wiki.archlinux.org/index.php/Makepkg
https://wiki.archlinux.org/index.php/Creating_packages

非常抱歉,这一部分总结起来非常麻烦,涉及的太多。
一些方面还不是很懂,待我有空仔细研究一番再更新本文章。

4. pacman

以下这些是官方的内容,被我缩小并终结,但没有完全记录下来
安装或升级单个软件包
pacman -S name1, name2...
指定 extra 库的软件安装
pacman -S extra/name
安装包组即包的内容包含其他东西
pacman -S name
选择序号安装
Enter a selection (default=all): 1-10 15 选中 1到10 和 15 的软件包
Enter a selection (default=all): ^5-8 ^2 除了 5-8 和 2 的软件包
查看哪些包属于包组
pacman -Sg name
删除软件包,保留其全部已经安装的依赖关系
pacman -R name
删除软件包,包括其所有没有被其他已经安装软件包使用的依赖关系
pacman -Rs name
删除软件包和所有依赖这个软件包的程序
注意,此操作是递归的,可能会删除大量的软件包
pacan -Rsc name
删除软件包,但是不删除依赖这个软件包的其他程序
pacman -Rdd name
删除某些程序时禁止备份重要的配置文件
pacman -Rn name
同步软件仓库,并升级整个系统
pacman -Syu
查询本地软件包数据库
pacman -Q -help
查询远程同步的数据库
pacman -S -help
在包数据库中查询软件包,查询条件包含软件包名和描述
pacman -Ss name1, name2
查询已经安装的软件包
pacman -Qs name1, name2
显示软件包的详细信息
pacman -Si name
查询本地安装包的详细信息
pacman -Qi name
获取已经安装的软件包所包含的文件列表
pacman -Ql name
检查软件安装包的文件是否存在
pacman -Qk name
如果要彻底检查
pacman -Qkk name
查询数据库获取某个文件属于哪个软件包
pacman -Qo /path/name
列出所有不再作为依赖的软件包(孤立包)
pacman -Qdt
列出所有明确被安装,而且不被其他包依赖的软件包
pacman -Qet
显示软件包的依赖树
pactree name
检查一个安装的软件包被哪些包所依赖
pactree -r name
pacman 将下载的软件包保存在 /var/cache/pacman/pkg/ 下,
并且不会移除旧的未安装版本的软件包,只保留软件包的当前有效版本,
以下命令可清除未安装的软件包缓存。
pacman -Sc
如果要清理所有缓存,但在重装软件包的时候只能重新下载了
pacman -Scc
删除近3个版本前的软件包
自定义保留最近几个版本
paccache -rk 2
三处所有未安装的软件包缓存文件
paccache -ruk0
升级系统时安装其他软件包
pacman -Syu name1, name2 ...
下载包而不安装
pacman -Sw name
安装一个本地包,不从源里下载
pacman -U /path/name.pkg.tar.xz
将本地包保持到缓存
pacman -U file://path/name.pkg.tar.xz
安装一个远程包,不在 怕充满配置的源里面
pacman -U http://www......
paccache -r
查询一个包含具体文件的包名
pacman -Fy
查询某个文件的包名
pacman -Fs pacman

配置
pacman 的配置文件位于 /etc/pacman.conf
取消文件中的 VerbosePkglists 注释,可以在升级前对比新旧版本区别
色彩输出
取消注释 Color 行
不升级软件包
加入内容,IgnorePkg = name1 name2 name3 ...,
这些被忽略的可通过 pacman -S 升级
不升级软件包组,同样也可以不升级单个软件包
加入内容 IgnoreGroup= name1, name2, name3 …

软件仓库
除了特殊的 options
每个 pacman.conf 中的 section 都定义了一个使用的软件包库,
仓库区分为官方和非官方两类,每个仓库都可以直接指定镜像列表。

pacman 数据库通常位于 /var/lib/pacman/sync
这里和 /etc/pacman.conf 总开启的软件仓库是一致的。
每个 tar.gz 文件都包含一个仓库的软件包