FreeBSD Ports - 如何给 FreeBSD 打包


FreeBSD Ports 系统使用 Makefile 来描述软件包信息。相比 Arch Linux Buildsystem 来说,FreeBSD Ports 灵活性非常差,要打个包比较恶心。

  • ${WRKSRC} - 是软件包源码解压的地方,一般是 work/软件包名
  • $STAGEDIR - 是打包用的小系统目录,软件包编译后安装在这个目录用来打包,一般是 work/stage
  • work/pkg 中存放 make package 生成的 pkg 包文件

准备 Makefile

一般来说,最小 Makefile 模板是这样:

PORTNAME=       软件包名字
DISTVERSION=    版本号
CATEGORIES=     分类(看 /usr/ports 下的目录)
MASTER_SITES=   源码站点

MAINTAINER=     维护者邮箱
COMMENT=        软件包简介

GitHub 项目

对于 GitHub 项目,Ports 系统对齐进行了一定的适配:

我们删掉 MASTER_SITES 变量,接着使用下面一组变量:

USE_GITHUB=     yes
GH_ACCOUNT=     GitHub 仓库的用户名
GH_PROJECT=     GitHub 仓库名(默认为 PORTNAME)

使用 make fetch 测试是否能正常下载文件。

其他描述信息

pkg-descr

pkg-descr 是一个文本文件,里面是软件包详细说明信息。用来给 pkg info <name> 显示。 简单的模板是这样:

This is a port of ..., .../
  :
(etc.)

WWW: http://www.example.com/

其中 WWW 所在那一行用来说明软件包中软件的官方网站。

distinfo - 散列和文件

使用命令自动生成该文件(不要尝试手动生成):

% make makesum

pkg-plist

“packing list”,列出该软件包安装的文件。 其中的路径相对于安装前缀prefix(/usr/local)。

bin/program
man/man1/program.1.gz
lib/xxx.so

使用该命令可以向 stdout 打印 plist 内容

% make makeplist

写入文件,并且修改内容。 第一行是提示信息,需要删掉。 并且你应该检查需要安装哪些文件。

% make makeplist > pkg-plist
% vim pkg-plist

修改源码

在编译并打包前,可能需要对软件包的源码进行修改,让编译能够进行。

确定软件包需要修改后,我们需要进入软件包解压的目录:

cd work/软件包名字

修改流程:

cp file file.orig # 原来的文件
# 修改文件 file

# cd 回去 Makefile 所在目录
make makepatch # 在 files 目录中生成 patch 文件

接着可以进行检查

make stage

如果报错说“该文件已经被 patch”,先 make clean

Port 流程

  1. 编写 Makefile 声明软件包源
  2. make fetch 下载包
  3. make makesum 生成散列和
  4. 编写 pkg-descr
  5. make stage 尝试编译
  6. 如果不行,进行上面提到的修改源码流程,并 make makepatch
  7. make stage 进行编译
  8. make makeplist > pkg-plist 生成安装文件列表
  9. make package 得到软件包

测试软件包

下面是一些常用的 make 目标:

  • fetch - 下载源码
  • extract - 解压源码
  • patch - 修改源码
  • stage - 貌似是 fetch+extract+patch 再编译并安装到 stage 目录,准备打包
  • package 打包
  • install 安装包
  • deinstall 卸载包