12.6 在 bsd.port.mk 之后写一些内容

  不要在 .include <bsd.port.mk> 这行之后增加任何内容。 这通常可以通过在您的 Makefile 中间的某处引用 bsd.port.pre.mk, 并在结尾的地方引用 bsd.port.post.mk 来避免。

注意: 只能够采用 bsd.port.pre.mk/bsd.port.post.mkbsd.port.mk 两种写法之一; 任何时候都不要同时使用两种写法。

  bsd.port.pre.mk 只定义了很少的变量, 它们可以在 Makefile 中用于进行一些测试, 而 bsd.port.post.mk 则定义了所有其它的变量。

  下面是一些由 bsd.port.pre.mk 定义的比较重要的变量 (这并不是一份完整的列表, 您可以阅读 bsd.port.mk 以获得全部变量的名字)。

变量 描述
ARCH uname -m 输出得到的硬件架构的名字 (例如, i386)
OPSYS uname -s 返回的操作系统类型 (例如, FreeBSD)
OSREL 操作系统的版本号 (例如 2.1.52.2.7)
OSVERSION 操作系统的版本号的数值形式; 它等于 __FreeBSD_version
PORTOBJFORMAT 系统默认的执行文件格式 (elfaout; 请注意, “现代的” FreeBSD 版本中, aout 已在淘汰之列。)
LOCALBASE “local” 目录的根 (例如, /usr/local/)
PREFIX port 应被安装到哪里 (参见 关于 PREFIX 的更多说明)。

注意: 如果您需要定义 USE_IMAKEUSE_X_PREFIX, 或 MASTERDIR 这些变量, 则应在引用 bsd.port.pre.mk 之前完成。

  下面是一些在引用 bsd.port.pre.mk 之后可以进行的判断:

# 如果 perl5 已经在系统中提供, 则不必编译 lang/perl5
.if ${OSVERSION} > 300003
BROKEN= perl is in system
.endif

# ELF 只使用一个 shlib 版本
.if ${PORTOBJFORMAT} == "elf"
TCL_LIB_FILE=  ${TCL_LIB}.${SHLIB_MAJOR}
.else
TCL_LIB_FILE=  ${TCL_LIB}.${SHLIB_MAJOR}.${SHLIB_MINOR}
.endif

# 软件会自动为 ELF 创建符号链接, 但 a.out 则需要另行创建
post-install:
.if ${PORTOBJFORMAT} == "aout"
       ${LN} -sf liblinpack.so.1.0 ${PREFIX}/lib/liblinpack.so
.endif

  您还记得应该在 BROKEN=TCL_LIB_FILE= 后面使用制表符, 而不是空格, 对吧? :-)

若您有关于 FreeBSD ports 系统的问题, 请发送电子邮件至 <ports@FreeBSD.org>。
关于此文档的任何问题, 请致函 <doc@FreeBSD.org>。