构建包
应该使用 emake
函数来调用 make
。这将确保用户的使用 MAKEOPTS
被正确使用。 emake
函数会传递任何提供的参数,因此它可以用来执行非默认的目标(例如 emake extras
)。有时你可能会遇到一个奇怪的非 autotools Makefile
,它会随着 emake
而崩溃,但这很少见。
构建应该用各种 -j
设置在 MAKEOPTS
中进行测试,以确保构建能正确并行化。如果一个包没有干净地并行化,它应该被修补。
如果修补真的不是一个选择,应该使用 emake -j1
。然而,在这样做的时候,请记住,你正在严重地降低许多非 x86 用户的构建时间,尤其是。强制使用 -j1
会使一些 MIPS 和 SPARC 系统的构建时间从几分钟增加到一个小时。
修复编译器使用
有时一个包会尝试使用一个奇怪的编译器,或者需要被告知使用哪个编译器。在这些情况下,应该使用 tc-getCC()
函数,它来自 toolchain-funcs.eclass。还有其他类似的函数可用 - 这些函数在 man toolchain-funcs.eclass
中有文档。
请注意,软件包应该始终尊重用户的 CC
首选项,并且不能依赖于诸如 /usr/bin/cc
或 /usr/bin/gcc
之类的便捷符号链接。一个追踪器 bug 存在于记录此类问题。 wiki 上有额外的文档。
${CC}
变量来实现此目的不正确。有时一个包不会使用用户的 ${CFLAGS}
或 ${LDFLAGS}
。这必须得到解决,因为有时这些变量被用来指定关键的 ABI 选项。在这些情况下,构建脚本应该被修改(例如,使用 sed
或通过补丁)来正确使用 ${CFLAGS}
或 ${LDFLAGS}
。
inherit flag-o-matic toolchain-funcs
src_prepare() {
default
# We have a weird Makefile to work with which ignores our
# compiler preferences. yay!
# Note the single quotes (hence the delimiter is not an issue)
sed -i -e 's:cc -O2:$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS):' Makefile \
|| die "sed fix failed. Uh-oh..."
}
src_compile() {
# -Os not happy
replace-flags -Os -O2
emake CC="$(tc-getCC)" \
CPPFLAGS="${CPPFLAGS}" \
CFLAGS="${CFLAGS}" \
LDFLAGS="${LDFLAGS}"
}
sed
替换值,而是让构建脚本使用变量。变量可能包含斜杠、逗号或冒号等字符,这些字符经常与 sed
一起使用,这会导致语法错误。Portage 执行一个 QA 检查,验证 LDFLAGS 是否被尊重。此 QA 检查仅在 LDFLAGS
变量包含 -Wl,--hash-style=gnu
时启用。(此标志只能在使用 sys-libs/glibc
的系统上使用,除了 MIPS CPU 的机器。)