最简单的入门方法是将组件文件组织成安装系统上所需的相同目录结构。
有两种方法可用于实现此目的:
如果您要打包的软件已经存在于 tarball 中,则将该 tarball 解压缩到子目录中。对于使用 autoconf 实用程序的许多开源软件包,将 DESTDIR 环境变量设置为指向所需的原型区域可以实现此目的。pkg:/developer/build/autoconf 软件包中提供了 autoconf 实用程序。
在 Makefile 中使用 install 目标。
假定您的软件包含一个二进制文件、一个库和一个手册页,并且要在 /opt 下名为 mysoftware 的目录中安装该软件。在构建区域中创建一个目录,在此目录下,您的软件以以上布局显示。在以下示例中,此目录名为 proto:
proto/opt/mysoftware/lib/mylib.so.1 proto/opt/mysoftware/bin/mycmd proto/opt/mysoftware/man/man1/mycmd.1
使用 pkgsend generate 命令为 proto 区域生成清单。通过 pkgfmt 可对输出软件包清单进行排序,以便该清单可读性更好。有关更多信息,请参见 pkgsend(1) 和 pkgfmt(1) 手册页。
在以下示例中,proto 目录位于当前工作目录中:
$ pkgsend generate proto | pkgfmt > mypkg.p5m.1
输出的 mypkg.p5m.1 文件包含以下行:
dir path=opt owner=root group=bin mode=0755 dir path=opt/mysoftware owner=root group=bin mode=0755 dir path=opt/mysoftware/bin owner=root group=bin mode=0755 file opt/mysoftware/bin/mycmd path=opt/mysoftware/bin/mycmd owner=root \ group=bin mode=0644 dir path=opt/mysoftware/lib owner=root group=bin mode=0755 file opt/mysoftware/lib/mylib.so.1 path=opt/mysoftware/lib/mylib.so.1 \ owner=root group=bin mode=0644 dir path=opt/mysoftware/man owner=root group=bin mode=0755 dir path=opt/mysoftware/man/man1 owner=root group=bin mode=0755 file opt/mysoftware/man/man1/mycmd.1 path=opt/mysoftware/man/man1/mycmd.1 \ owner=root group=bin mode=0644
要打包的文件路径在 file 操作中出现了两次:
单词 file 之后的第一个单词说明了 proto 区域中文件的位置。
path= 属性中的路径指定了要安装文件的位置。
使用该双项,您可以在不修改 proto 区域的情况下修改安装位置。假如您要对设计用于安装在其他操作系统上的软件重新打包,此功能可以节省大量时间。
请注意,pkgsend generate 对目录所有者和组都应用了缺省值。对于 /opt,缺省值是不正确的。需要删除该目录,因为它是由已经存在于系统上的其他软件包提供的,并且如果 /opt 的属性和那些已经存在于系统上的属性冲突,则 pkg(1) 将不会安装该软件包。下面将必要的元数据添加到生成的清单中显示了删除不需要的目录的编程方式。
如果文件名中包含等号 (=)、双引号 (") 或空格字符,则 pkgsend 在清单中生成 hash 属性,如下例所示:
$ mkdir -p proto/opt $ touch proto/opt/my\ file1 $ touch proto/opt/"my file2" $ touch proto/opt/my=file3 $ touch proto/opt/'my"file4' $ pkgsend generate proto dir group=bin mode=0755 owner=root path=opt file group=bin hash=opt/my=file3 mode=0644 owner=root path=opt/my=file3 file group=bin hash="opt/my file2" mode=0644 owner=root path="opt/my file2" file group=bin hash='opt/my"file4' mode=0644 owner=root path='opt/my"file4' file group=bin hash="opt/my file1" mode=0644 owner=root path="opt/my file1"