如何覆盖 dpkg-buildflags 的 CFLAGS?

15

我收到了一个包裹,里面有:

$ apt-get source <pkg-name>

现在我正尝试使用以下命令构建它:

$ dpkg-buildpackage -uc -us -j8

在输出的开头,有这样的说明:

dpkg-buildpackage: export CFLAGS from dpkg-buildflags (origin: vendor): -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security
dpkg-buildpackage: export CPPFLAGS from dpkg-buildflags (origin: vendor): -D_FORTIFY_SOURCE=2
dpkg-buildpackage: export CXXFLAGS from dpkg-buildflags (origin: vendor): -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Wformat-security
dpkg-buildpackage: export FFLAGS from dpkg-buildflags (origin: vendor): -g -O2
dpkg-buildpackage: export LDFLAGS from dpkg-buildflags (origin: vendor): -Wl,-Bsymbolic-functions -Wl,-z,relro

我想覆盖这些CFLAGS(也包括LDFLAGS)。我尝试过导出CFLAGS环境变量的方式,就像我们用普通的configure一样,但没有成功。如何覆盖这些值?

1个回答

29

你试图重新构建的软件包,使用 dpkg-buildflags 检索到的强化特定标志来设置(即覆盖)*FLAGS。

如果您需要为自己的目的覆盖这些标志,则应告诉 dpkg-buildflags 提供您想要的标志,而不是(加固)默认值。查看 man dpkg-buildflags,您会找到关于环境变量的部分,尤其注意 DEB_flag_SETDEB_flag_APPEND

因此,以下命令可以解决问题(填写您自己的 *FLAGS):

$ DEB_CPPFLAGS_SET="-I/foo/bar/baz" DEB_CFLAGS_SET="-g -O6" DEB_LDFLAGS_SET="-L/fruzzel/frazzel/" dpkg-buildpackage -uc -us -j8 -rfakeroot

2
如果看起来 dpkg-buildflags 没有运行怎么办?将其添加到软件包中有多难?是否有替代命令? - Adam Baxter
此答案可能已不再适用。(请参见http://manpages.ubuntu.com/manpages/xenial/man1/dpkg-buildpackage.1.html#Notes)更近期的建议是编辑您使用apt-get source下载的发行版中的debian/rules脚本,并搜索CFLAGS/CXXFLAGS/LFLAGS实例。 - Dave McMordie
@DaveMcMordie 是谁推荐的?但确实有些软件包可能会忽略 DEB_CFLAGS_SET。我在看你,Debian 6 上的 exim4。这种情况下,您可以执行 dpkg-buildpackage -R'make -f debian/rules CFLAGS=-g3。或者 dpkg-buildpackage -R'sh ./1.sh',其中 1.shmake -f debian/rules CFLAGS='-g3 -Og' "$@"(如果您的命令需要引号)。顺便说一句,如果我要调试程序,我会选择 -g3 -Og 或只是 -g3(如果不支持 -Og)。-g 也可能足够了,但生成的映像不包括宏信息(不能在表达式中使用宏)。 - x-yuri
DEB_CFLAGS_SET变量在Debian bullseye上没有任何效果。 - Graham Leggett
@GrahamLeggett 我不太确定。我刚在bookworm/sid上进行了测试(bookworm是bullseye之后的下一个即将发布的版本),它仍然有效。我测试的软件包使用**短格式dh**(几乎是标准)。当然,软件包维护者可以在d/rules中做各种事情,并且可能已经(意外地)破坏了DEB_*_SET(许多非官方的Debian软件包在打包方面质量低劣)。 - umläute

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接