我正在编译一个使用自动工具构建过程的大型库。 makefile 有很多。 他们每个人都得到了
CFLAGS = .... -Werror
。
当我尝试编译时,出现一些小警告,这些警告会终止我的设置中的构建。
尽管有警告,我还是想尝试构建,所以我需要从所有 makefile 中删除 -
Werror
。 有没有办法阻止自动工具在所有这些 makefile 中放入 -Werror
?
我在configure.ac中浏览了一下,发现了这个:
AC_ARG_ENABLE([werror],
AS_HELP_STRING([--disable-werror], [Do not treat warnings as errors]),
[gcc_werror=$enableval], [gcc_werror=$gcc_warnings])
所以我像这样运行配置:
./configure --disable-werror
它就像一个魅力。 我的 makefile 中不再有
-Werror
标志。 感谢您的评论,直到!
我的 sed 方式,创建 Makefile 后
find . -name Makefile -exec sed -i s'/-Werror//g' {} \;
在 Mac 中,将
sed
替换为 gsed
对于基于自动工具的项目,您可能需要通过:
./autogen.sh --disable-Werror
观察
W
中的大写字母Werror
。
是的....在很多地方,您的
automake
会 100% 地自动神奇地执行 -Werror
。 让你想咬牙切齿。
我将向您展示正确的方法,这样您就不会在大屏幕显示器上打孔。
configure.ac
更糟糕的是,其他脚本使
automake
的行为有所不同,例如 ./configure
或未知的 autogen.sh
。
“该死,一直都是
-Werror
”的绝对圣杯,就是检查你的configure.ac
是否有这个小宝石:
AM_INIT_AUTOMAKE([foreign -Wall -Werror subdir-objects])
注意:这个
AM_INIT_AUTOMAKE([-Werror])
选项将剥离您简单的 CLI automake -Wnone
并转换为 automake -Werror
,就像往常一样! 恶心,呃。 为什么?因为 autotool
诸神已下令:停止质疑 UNIX 灰胡子。你知道此时该做什么(把-Werror
拿出来)
一旦从
-Werror
中删除了讨厌的 AM_INIT_AUTOMAKE
,您现在可以在不同的子目录和子项目中创建其他选择性但 sane -Wnone
/-Werror
/(许多)选项。
在上面的“首先”部分完成之前不要检查此步骤:这是我们的主要问题:
检查
configure.ac
中的以下代码片段:
dnl AC_ARG_ENABLE(werror,
dnl AS_HELP_STRING([--enable-werror],[Enable -Werror in all Makefiles]))
参见
ENABLE
中的AC_ARG_ENABLE
一词。 这意味着 configure
始终将 -Werror
作为默认值。 您可以使用以下方法禁用它:
./configure --disable-werror
当然,如果你想把这个行为改为“falsey”,请添加:
AM_CONDITIONAL([WERROR], [test x"$enable_werror" = x"yes"])
到
AC_ARG_ENABLE
线之后。
然后重做
autogen.sh
/./configure
/make
。 您仍然可以方便地选择打开-Werror
,但前提是您选择这样做。
如果您没有
configure.ac
怎么办,还有更多清单项目。
./configure
文件项目顶层目录中缺少
configure.ac
?维护者/作者可能推出了自己的 configure
:让我们查看 configure
文件。
--disable-werror
选项要查找
configure
是否支持选择性-Werror
,请执行:
./configure --help | grep werror
如果显示
--disable-werror
,您可以执行./configure --disable-werror
将其关闭。
在
configure
文件中搜索 WARNINGS
使用的 automake
,拉出任何硬编码的 -Werror
或替换为 -Wnone
:保存此文件。
automake
我打赌你不知道
automake
是一个Perl脚本。 有两种方法可以将 -Werror
作为参数/选项:
-Werror
WARNINGS=error
对于命令行选项,修复很简单,只需将其替换为
-Wno-error
。
对于 WARNINGS 环境变量,再次将其替换为
WARNING=no-error
。
另一个最大的问题是
autogen.sh
。 每个人都提出了自己的变体。 每个人似乎都有定制的令人惊叹的多态 autogen.sh
,但实际上应该来自您的发行版 libtool
包。
这是您必须谨慎对待
autogen.sh
的表面价值。
简单的
autogen.sh
仍然很简单:
autoreconf -f [-I m4 ]
但更快的方法是执行:
# autopoint # if using gettext and internationalization
libtoolize -c -f || glibtoolize -c -f
aclocal -I m4
autoconf
autoheader
automake -acf --foreign
这会将您带到一个安全点,最终用户可以执行最终的构建阶段:
./configure
make