5.11.从属 port 和 MASTERDIR

如果 port 需要通过让某个变量 (例如, 分辨率, 或纸张尺寸) 取不同的值来制作稍有不同的软件包版本, 则可以为每个软件包创建一个子目录, 以便让用户更容易看到要做什么, 但尽量在 port 之间共享尽可能多的文件。通常, 通过巧妙地使用变量, 除了一个目录之外, 其他目录只需要一个很短的 Makefile。在唯一的 Makefile 中, 使用 MASTERDIR 来指定其余文件所在的目录。另外, 使用一个变量作为 PKGNAMESUFFIX 的一部分, 这样软件包就会有不同的名字。

这将通过一个例子得到最好的证明。这是 print/pkfonts300/Makefile 的一部分;

PORTNAME=	pkfonts${RESOLUTION}
PORTVERSION=	1.0
DISTFILES=	pk${RESOLUTION}.tar.gz

PLIST=		${PKGDIR}/pkg-plist.${RESOLUTION}

.if !defined(RESOLUTION)
RESOLUTION=	300
.else
.if ${RESOLUTION} != 118 && ${RESOLUTION} != 240 && \
	${RESOLUTION} != 300 && ${RESOLUTION} != 360 && \
	${RESOLUTION} != 400 && ${RESOLUTION} != 600
.BEGIN:
	@${ECHO_MSG} "Error: invalid value for RESOLUTION: \"${RESOLUTION}\""
	@${ECHO_MSG} "Possible values are: 118, 240, 300, 360, 400 and 600."
	@${FALSE}
.endif
.endif

print/pkfonts300 也有所有常规的补丁和包文件,等等。在那里运行 make, 它将采用分辨率的默认值 (300), 并正常构建 port。

至于其他决议,这是整个 print/pkfonts360/Makefile

RESOLUTION=	360
MASTERDIR=	${.CURDIR}/../pkfonts300

.include	"${MASTERDIR}/Makefile"

(print/pkfonts118/Makefileprint/pkfonts600/Makefile, 以及其他所有类似的)。MASTERDIR 定义告诉 bsd.port.mkpkfonts300 中找到像 FILESDIRSCRIPTDIR 这样的常规子目录。RESOLUTION=360 一行将覆盖 pkfonts300/Makefile 中的 RESOLUTION=300 一行, 而 port 将在分辨率设置为 360 的情况下联编。

最后更新于

FreeBSD 中文社区