如何把一个软件移植到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>