PKGBUILD 中鲜为人知的变量
本文最后更新于 2024年8月16日 凌晨
背景
最近在打一个软件包 yade
, 由于软件包东西比较多,打算按照 split package 的方式去写 PKGBUILD。 计划 pkgbase=yade
, pkgname=(yade yade-cuda yade-doc)
。在官方仓库中这是很常见的,只要先构建本体,然后构建文档就可以了。但是这个软件包比较坑的点在于:构建文档需要先安装本体,因为它需要用本体去处理一些文件。
但是,在通过 split package 的方式打包的时候,由于它们的 pkgname
不一致,导致我们没法通过下面的方式去调整 PATH
和 LD_LIBRARY_PATH
1 |
|
一种解决方案
一种临时的办法是在 build()
过程中先将本体安装到一个临时的目录,比如 $srcdir/tmproot
, 然后用这个目录来调整 PATH
和 LD_LIBRARY_PATH
。(我最终是这样做的)。
另一种解决方案
不过还有另一种解决方案,可以使用 pkgdirbase
这个变量。在 /usr/bin/makepkg
中,它的定义是这样的:
1 |
|
因此我们可以通过 ${pkgdirbase}/yade-cuda
访问到 yade-cuda
在 package()
完成之后的内容,对于 yade
也是一样,即可以
1 |
|
结语
我最终还是选择了先将它安装到 ${srcdir}
下面的一个临时文件夹,而不是去用 ${pkgdirbase}
(后者感觉技巧性太强,有点利用未定义行为的感觉)。
不过这提醒了我,后续可以去看看 makepkg
的源码,看看还有哪些有意思的变量可以在打包阶段用。