用户环境

用户环境变量和 make.conf 设置会被传递给 ebuild。这可能很有用——例如,这就是 CFLAGS 及其相关变量的工作方式——但也可能导致一些讨厌的破坏构建的变量(如 LANGLC_ALL)被传递。目前对环境没有进行任何清理。

过滤变量

某些变量会严重影响某些构建系统。一个很好的例子是区域设置变量(LC_ALL 等),如果将其设置为某些值,会导致涉及诸如 [A-Z]sedgrep 表达式失败。这里最简单的做法是在 pkg_setupunset 或清理有问题的变量。

取消设置所有与区域设置相关的变量的最简单方法是

pkg_setup() {
	# Unset all locale related variables, they can make the
	# build fail.

	eval unset ${!LC_*} LANG
}

不过滤变量

另一方面,尊重某些用户偏好非常重要。一个很好的例子是 CFLAGS,它必须被尊重(选择性过滤是可以的,但完全忽略是不行的)。在编译时忽略 CFLAGS 会导致严重问题。

  • 忽略 march/mcpu 可能会强制内核或软件对某些架构上的某些操作码进行仿真。这可能会非常慢——例如,为 SPARC v7 构建但在 v9 上运行的 openssl 在 RSA 操作方面大约慢了五倍。
  • 去除某些与 ABI 相关的标记将破坏链接。
  • 去除某些与 ABI 相关的标记会导致在某些设置下生成无效代码。在极端情况下,我们最终可能会得到诸如为小端 CPU 生成大端代码之类荒谬的事情。
  • 如果忽略用户的 march/mcpu/mtune,并改为使用自动检测的设置,则 GRP 和阶段将失效。例如,在 pentium-4 上将无法再生成 i686 阶段,在 UltraSparc 上将无法再生成 v8 阶段。

有些软件包会意外地这样做。例如,你可能会在 Makefile.am 中看到 CFLAGS=-Wall。要解决此问题,请在用户的 CFLAGS 中使用 sed,或者(更好的解决方案)将变量更改为 AM_CFLAGS,它将自动与用户的设置合并。LDFLAGS 也应该被尊重。