用户环境
用户环境变量和 make.conf
设置会被传递给 ebuild。这可能很有用——例如,这就是 CFLAGS
及其相关变量的工作方式——但也可能导致一些讨厌的破坏构建的变量(如 LANG
和 LC_ALL
)被传递。目前对环境没有进行任何清理。
过滤变量
某些变量会严重影响某些构建系统。一个很好的例子是区域设置变量(LC_ALL
等),如果将其设置为某些值,会导致涉及诸如 [A-Z]
的 sed
或 grep
表达式失败。这里最简单的做法是在 pkg_setup
中 unset
或清理有问题的变量。
取消设置所有与区域设置相关的变量的最简单方法是
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 也应该被尊重。