FreeBSD Porter 手册
上一页 | 第6章 　特殊情况 | 下一页

# 6.3 联编机制

## 6.3.1 Ports 的并行联编

FreeBSD ports 框架支持使用多个 `make` 子进程来进行并行编译， 在 SMP 上这可以全面地利用系统的 CPU 计算能力， 令 port 的联编过程更快、 更有效率。

目前这是通过向原作者的代码传递 make(1) 参数 `-jX` 来实现的。 遗憾的是， 并不是所有的 port 都能够很好地处理这个选项。 因此， 必须通过明确地在 `Makefile` 中指定 `MAKE_JOBS_SAFE=yes` 来启用这一功能。

从 port 监护人的角度还有一个控制的方法是设置 `MAKE_JOBS_UNSAFE=yes` 变量。 这个变量主要是用于已知不能与 `-jX` 配合使用的 port， 即使用户在 `/etc/make.conf` 中定义了 `FORCE_MAKE_JOBS=yes` 变量， 系统也不会使用并行编译。

## 6.3.2 `make`、 `gmake`， 以及 `imake`

如果 port 用到了 GNU make， 应设置 `USE_GMAKE=yes`。

表 6-1. 用于与 gmake 有关的 port 的变量

变量 | 意义
--- | ---
`USE_GMAKE` | 此 port 需要使用 `gmake` 来完成联编过程。
`GMAKE` | 不在 `PATH` 中时， `gmake` 的完整路径。

对于 X 应用程序的 port， 如果它使用 imake 根据 `Imakefile` 文件来生成 `Makefile`， 则应设置 `USE_IMAKE=yes`。 这会使联编过程中的配置 (configure) 阶段自动执行 `xmkmf -a`。 如果 `-a` 标志会给您的 port 带来麻烦， 则需设置 `XMKMF=xmkmf`。 如果 port 用到了 imake 但并不使用 `install.man` target， 则应设置 `NO_INSTALL_MANPAGES=yes`。

如果 port 源文件的 `Makefile` 的主联编 target 是 `all` 以外的名字， 应对应地设置 `ALL_TARGET`。 对于 `install` 而言， 对应的变量是 `INSTALL_TARGET`。

## 6.3.3 `configure` 脚本

假如 port 使用 `configure` 脚本来从 `Makefile.in` 生成 `Makefile` 文件， 需要设置 `GNU_CONFIGURE=yes`。 如果希望传额外的参数给 `configure` 脚本 (默认参数为 `--prefix=${PREFIX} --infodir=${PREFIX}/${INFO_PATH} --mandir=${MANPREFIX}/man --build=${CONFIGURE_TARGET}`)， 应通过 `CONFIGURE_ARGS` 来指定这些参数。 类似地， 可以通过 `CONFIGURE_ENV` 变量来传递一些环境变量。

如果您的软件包使用 GNU `configure`， 而生成的可执行文件命名方式 “怪异” 如 `i386-portbld-freebsd4.7-``应用程序名`， 则需要更进一步地通过改变 `CONFIGURE_TARGET` 变量来按照较新版本的 `autoconf` 生成的脚本所希望的方式指定 target。 其方法是， 紧随 `Makefile` 中 `GNU_CONFIGURE=yes` 一行之后加入：

`CONFIGURE_TARGET=--build=${MACHINE_ARCH}-portbld-freebsd${OSREL}`

表 6-2. 用于用到了 configure 脚本的 port 的变量

变量 | 意义
--- | ---
`GNU_CONFIGURE` | 此 port 需要用 `configure` 脚本来准备联编。
`HAS_CONFIGURE` | 与 `GNU_CONFIGURE` 类似， 但默认的 configure target 并不加入 `CONFIGURE_ARGS`。
`CONFIGURE_ARGS` | 希望传给 `configure` 脚本的额外参数。
`CONFIGURE_ENV` | 希望在执行 `configure` 脚本时设置的环境变量。
`CONFIGURE_TARGET` | 替换默认的 configure target。 其默认值是 `${MACHINE_ARCH}-portbld-freebsd${OSREL}`。

## 6.3.4 使用 `scons`

如果您的 port 使用 SCons， 就需要定义 `USE_SCONS=yes` 了。

表 6-3. 使用 `scons` 的 port 会用到的变量

变量 | 含义
--- | ---
`SCONS_ARGS` | 当前 port 希望传给 SCons 环境的参数。
`SCONS_BUILDENV` | 希望在系统环境中设置的变量。
`SCONS_ENV` | 希望在 SCons 环境中设置的变量。
`SCONS_TARGET` | 传递给 SCons 的最后一个参数， 类似于 `MAKE_TARGET`。

如果希望让第三方的 `SConstruct` 尊重通过 `SCONS_ENV` (其中最重要的是 `CC/CXX/CFLAGS/CXXFLAGS` 配置) 传给 Scons 的配置， 则需要对 `SConstruct` 进行修改， 使联编的 `Environment` 按下列方式建立：

    env = Environment(**ARGUMENTS)

其后， 可以通过 `env.Append` 和 `env.Replace` 来对它进行修改。

上一页 | 起始页 | 下一页
Ports 的发行限制 | 上一级 | 利用 GNU autotools

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