配置构建环境

有时需要在运行./configure之前操作用户构建环境的某些方面。 flag-o-matic eclass 是操作CFLAGSLDFLAGS等最佳选择。

Ebuild 不得简单地忽略用户 CFLAGS、CXXFLAGS 或 LDFLAGS — 请参阅不过滤变量

标志过滤指南

如果软件包在任何合理的CFLAGS下都无法正常工作,那么最好在收到错误报告时过滤有问题的标志。合理的CFLAGS-march=-mcpu=-mtune=(取决于体系结构)、-O2-Os-fomit-frame-pointer。请注意,通常应将-Os替换为-O2,而不是完全去除。 -fstack-protector标志可能也应该在此组中,尽管我们的加固团队声称此标志永远不会导致任何问题……

-pipe标志不影响生成的代码,因此在这里并不十分相关,但它是一个设置全局的明智标志。

如果软件包在其他(不合理的)CFLAGS下无法正常工作,则完全可以关闭该错误,并使用WONTFIX建议用户选择更合理的全局CFLAGS。同样,如果您怀疑错误是由不合理的CFLAGS引起的,则INVALID解决方案是合适的。

以下所有内容都假设 ebuild 在正确的位置有一行inherit flag-o-matic

简单标志去除

filter-flags函数可用于从{C,CPP,CXX,CCAS,F,FC,LD}FLAGS中删除特定标志。可以提供多个参数;每个参数是要删除的标志的名称。

	# -fomit-frame-pointer leads to nasty broken code on sparc thanks to a
	# rather icky asm function
	use sparc && filter-flags -fomit-frame-pointer

有一个可用的filter-ldflags函数,它对LDFLAGS执行等效操作。

如果已知某个软件包对CFLAGS非常敏感,则strip-flags函数将删除大多数标志,只保留一组最小的保守标志。

	# Our app hates screwy flags
	strip-flags

标志替换

要将一个标志替换为另一个标志,请使用replace-flags。这最常用于将-Os替换为-O2(或者如果您感觉良好,则将-O3替换为-O2)。

	# Seems to have issues with -Os, switch to -O2
	replace-flags -Os -O2

还有一个名为replace-cpu-flags的特殊函数,用于替换 CPU(-mtune-mcpu-march)指定标志。最后一个参数是要使用的标志;前面的参数是要替换的标志。

	# Can't use ultrasparc or ultrasparc3 code, drop to v9
	replace-cpu-flags ultrasparc ultrasparc3 v9

添加额外标志

有时需要添加额外的CFLAGSLDFLAGS。此处可以使用append-flagsappend-ldflags函数。

	# If we're using selinux, we need to add a -D
	use selinux && append-flags "-DWITH_SELINUX"

	# Secure linking needed, since we're setuid root
	append-ldflags -Wl,-z,now

请参阅flag-o-matic.eclass以获取完整参考。