总结一些以前疑惑的关于PKGBUILD的问题。
1. 就算需要,base-devel
组中的软件包也不会写入编译时依赖列表(makedepends
):
base-devel
软件包组包含编译软件所需的基本工具(软件包列表:i686,x86_64),包括gcc编译器、make之类的。一般编译软件包都需要这些包,所以干脆就规定makedepends
中不需要指定它们。
如果你发现怎么makepkg
都编译不了,先看看是不是忘记装base-devel
了(pacman -S base-devel
)。
2. 从git、svn、cvs、hg等版本控制系统获取代码的软件包,版本号会自动更新:
从版本控制系统获取代码的话,只要PKGBUILD是标准格式,版本号会自动更新,以反映最新的代码变化。
比如,从AUR上下载的ibus-git的PKGBUILD,本来的版本号是20110501,可makepkg
之后得到的版本号就变成当天日期YYYYMMDD
了。
svn、hg版本号会更新为最新修订号,git、cvs用当天的日期了。
3. install文件之作用:
某些软件包除了PKGBUILD,还会附带一个XXX.install文件。这个文件定义了安装、升级、删除软件包前后要执行的操作。
这些操作放到PKGBUILD是不行的,因为最终要安装的是软件包,而非PKGBUILD。
比如,字体软件包安装或卸载后需要刷新字体缓存,这些操作就必须放在install文件中。
4. arch=('x86_64' 'i686')
与 arch=('any')
的区别:
arch=('x86_64' 'i686')
表示:该PKGBUILD可以为x86_64和i686平台生成软件包,但生成的软件包并不能跨平台。
而arch=('any')
表示:该PKGBUILD生成的软件包在x86_64和i686平台都可以安装。
5. package()
和 build()
函数的区别:
package()
是在fakeroot环境执行的,所以能使用某些特殊命令。
其实,通常情况下,把编译过程放在package()
、或是把所有操作都放在build()
都是可以的。makepkg
只保证package()
在build()
(以及不常见的check()
)之后执行。
6. “xxx || return 1
”中“return 1
”的作用:
“xxx || return 1
”的意思是:如果 xxx 命令出错退出了,就退出当前函数并返回错误代码1。这是为了保证重要过程出错时makepkg及时停止。
估计是历史遗留,现在用处不大,因为makepkg本来就会自动出错停止。
7. makepkg不会自动删除旧的src目录,可能导致第二次编译错误:
在执行过一次makepkg的目录再次执行makepkg,src目录不会自动被删除。如果有patch之类的操作,可能因为上次patch过而导致错误。需要手动删除src目录。