Skip to content

如何把一个软件移植到OpenBSD上

这是一篇根据此文意译的文章, 我只翻译了自己认为重要的东西。作者以自己移植python的dnslib库到OpenBSD的过程来描述移植的过程。作者为Bryan Everly。此译文发表时文章发布的原域名过期,无法访问。

 

事前准备

找到你想移植的软件
准备好承担做一个维护者的责任
和软件的开发者/团队协作,而不是为软件加几个补丁,让它在OB上能编译通过
你很可能没有权限把软件添加到ports中,请和ports邮件列表中的人合作
先读文档,再问问题

OpenBSD ports树传统

软件按类别放在/usr/ports目录下,如开发工具放在/usr/ports/devel,数据库软件放在/usr/ports/database等等
软件源码并不放在/usr/ports的任何目录下,而是在编译时从它的官网下载到/usr/ports/distfiles/PORT-v.v.v子目录下
实际编译时的工作目录在/usr/ports/pobj/PORT-v.v.v下

某个软件的ports包含如下标准的文件:

Makefile — 包含编译指令
distinfo — 包含指定软件的验证信息,如tar包的SHA1/SHA256摘要信息
pkg — 子目录
pkg/DESCR — 关于此软件的简短描述,请保持列宽为72
pkg/PLIST — 由此ports编译成的软件包(package)的manifest文件
patches — 子目录,包含要为此软件的源码打的补丁包

大部分ports的Makefile的结尾会包含一个名为bsd.port.mk的文件。这个文件用于告诉ports如何利用OpenBSD现有的ports编译的基础架构。

以移植python库dnslib为例,在/usr/ports/net目录下新建一个文件夹py-dnslib,因为一个跟网络相关的工具,也是python的库文件,所以以py-开头。

接下来要创建Makefile.

# $OpenBSD$

COMMENT= library to en/decode DNS wire-format packets for Python

MODPY_EGG_VERSION= 0.9.4
DISTNAME= dnslib-${MODPY_EGG_VERSION}
PKGNAME= py-${DISTNAME}
CATEGORIES= net

HOMEPAGE= https://pypi.python.org/pypi/dnslib

MAINTAINER= Bryan Everly <[email protected]>

# BSD
PERMIT_PACKAGE_CDROM= Yes

MASTER_SITES= https://pypi.python.org/packages/source/d/dnslib/

MODULES= lang/python

FLAVORS = python3
FLAVOR ?=

do-test:
${SUBST_CMD} ${WRKSRC}/run_tests.sh
cd ${WRKSRC} && ./run_tests.sh

.include <bsd.port.mk>

第一行是注释,简短描述这个port的功能。
接下来的部分是版本号,要下载的源码包的名称,编译好的软件包的名称,最后是此软件在ports中的类别。
再往下是软件官网地址,port的维护者的信息。接下来的注释表示此软件采用BSD授权协议(可在软件的官方万展查询到)。接着的一行表示此软件可以放在OpenBSD发行的光盘中。

MASTER_SITES指示此软件的官方下载地址。
MODULES一行用于告知OpenBSD ports编译体系这是一个python包,可以使用OpenBSD上Python包的通用编译方式
FLAVORS表示软件的flavor(请查阅OpenBSD上flavor相关文档)

最后,do-test目标执行软件包自带的单元测试代码。

 

有了Makefile,接下来要测试各个编译目标

第一个就是make fetch,测试源文件下载是否正常。下载的文件会放在/usr/ports/distfiles下的一个子目录里。子目录的名称取决于你的Makefile里的$DISTNAME变量

然后是make extract。这个目标会把上面下载的源码压缩包解压,放在/usr/ports/pobj下的一个子目录里。子目录的名称取决于$WRKDIR(衍生与$PKGNAME)

make makesum: 这个目标为下载的源文件产生校验和并放在distinfo文件里。

make update-patches:如果你需要给某个源文件打补丁,你会先把/usr/ports/distfiles/$DISTDIR下的目标文件复制到一个带后缀为.orig的文件,然后编辑目标文件,然后运行make update-patches。它会生成所需要的diff文件,然后你可以将它们放在patches子目录里。

make build: 实际编译源文件。

make update-plist: 这个目标会生成会更新pkg/PLIST文件

make do-test: 运行源文件自带的单元测试代码。

make fake:将编译好的软件安装在/usr/ports/pobj/$WRKDIR/fake-$MACHINE_ARCH文件夹下,而非根文件目录下
make package: 根据make fake生成的文件创建软件包
make install:将编译好的软件包安装的系统

make uninstall: 卸载软件
make clean=package: 从/usr/ports/packages/${MACHINE_ARCH}目录下删除软件包
make clean=fake: 删除/usr/ports/pobj/$WRKDIR/fake-${MACHINE_ARCH}目录下的文件
make clean=all: 删除“make build”产生的文件
make clean=distfiles: 删除下载的源文件包

一切都搞定之后,把ports目录打包,发送给[email protected]邮件列表。邮件应遵循以下格式:
邮件主题应以[NEW]开始,表示这是一个新的port,接着是port的类别及名称。这里是net/py-dnslib
邮件内容应包含此软件的简短描述,以及审阅申请。

同时,在和ports团队几次邮件来往之后,Makefile也更新如下:

 

# $OpenBSD: Makefile,v 1.1.1.1 2015/10/30 16:44:54 rpointel Exp $

COMMENT= library to en/decode DNS wire-format packets for Python

MODPY_EGG_VERSION= 0.9.6
DISTNAME= dnslib-${MODPY_EGG_VERSION}
PKGNAME= py-${DISTNAME}
CATEGORIES= net
MODPY_PI= Yes

HOMEPAGE= https://pypi.python.org/pypi/dnslib

MAINTAINER= Bryan Everly <[email protected]>

# BSD
PERMIT_PACKAGE_CDROM= Yes

MODULES= lang/python

FLAVORS = python3
FLAVOR ?=

do-test:
${SUBST_CMD} ${WRKSRC}/run_tests.sh
cd ${WRKSRC} && ./run_tests.sh

.include <bsd.port.mk>

 

Avatar

专业Linux/Unix/Windows系统管理员,开源技术爱好者。对操作系统底层技术,TCP/IP协议栈以及信息系统安全有强烈兴趣。电脑技术之外,则喜欢书法,古典诗词,数码摄影和背包行。

Sidebar