配置构建环境
有时需要在运行./configure
之前操作用户构建环境的某些方面。 flag-o-matic
eclass 是操作CFLAGS
、LDFLAGS
等最佳选择。
CFLAGS
进行操作的函数也对CXXFLAGS
进行操作。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
添加额外标志
有时需要添加额外的CFLAGS
或LDFLAGS
。此处可以使用append-flags
和append-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以获取完整参考。