用户环境
用户环境变量和make.conf
设置将传递给 ebuild。这可能很有用——例如,CFLAGS
和其它变量一起工作——但它也可能导致令人讨厌的构建中断变量(如LANG
和LC_ALL
)通过。当前,还没有方法不对环境产生破坏。
过滤变量
某些变量确实会导致某些构建系统失败。一个很好的例子是语言环境变量(LC_ALL
等),如果将其设置为某些值,如果将其设置为某些值,将导致涉及[A-Z]
之类的sed
或grep
表达式失败。在这里最简单的方法是 unset
清理或清除pkg_setup
中的有害变量 。
取消设置所有与语言环境相关的变量的最简单方法是:
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 和阶段会中断。例如,i686
平台不再可以在pentium-4
上生产,而v8
平台不再可以在UltraSparc
上生产。
一些软件包会无意间这样做。例如,在Makefile.am
中可能会看到 CFLAGS=-Wall
。要解决此问题,请在用户的CFLAGS
中设置sed
或(更好的解决方案)将变量更改为AM_CFLAGS
,该变量将自动与用户的设置合并。 LDFLAGS 也应该注意。