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 变量, 系统也不会使用并行编译。
如果 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。
假如 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}。 |
如果您的 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 来对它进行修改。