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 makegmake, 以及 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。 其方法是, 紧随 MakefileGNU_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.Appendenv.Replace 来对它进行修改。

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