我在CentOS 5.7系统上运行。
我从其他人那里下载了源包和.spec文件。我正在尝试使用vanilla命令从源代码构建RPM:
% rpmbuild -ba ~/rpmbuild/SPECS/foo.spec
...
Configuration summary:
======================
Host type................: x86_64-redhat-linux-gnu
CC.......................: gcc
CFLAGS...................: -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -Werror
Package..................: sudosh2
Version..................: 1.0.4
Installation prefix......: /usr
Man directory............: /usr/share/man
sysconfdir...............: /etc
recording input..........: no
然而,这个版本失败了。代码有点草率,并产生一些警告。此工具链的某些部分正在启用-Werror
标记,这会生成“all warnings into errors”。因此,构建失败并出现错误:
gcc -DHAVE_CONFIG_H -I. -I.. -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -Werror -MT parse.o -MD -MP -MF .deps/parse.Tpo -c -o parse.o parse.c
cc1: warnings being treated as errors
sudosh.c: In function 'main':
sudosh.c:486: warning: unused variable 'written'
sudosh.c:112: warning: unused variable 'found'
cc1: warnings being treated as errors
parse.c: In function 'parse':
parse.c:20: warning: unused variable 'y'
parse.c:14: warning: unused variable 'opt'
parse.c:14: warning: unused variable 'cmt'
parse.c:14: warning: unused variable 'arg'
parse.c:10: warning: unused variable 'i'
parse.c:10: warning: unused variable 'line_number'
make[2]: *** [sudosh.o] Error 1
我知道正确的解决方法是让作者修复代码,但我想在短期内解决这个问题。我需要一个工作RPM。
看起来./configure
或autoconf
会自动添加-Werror
标记。如何禁用构建的-Werror
标志,而不是自己编辑Makefile?
响应@ pwan的答案更新:
.spec文件非常通用,并没有指定任何特殊标志:
%build
%configure \
--program-prefix="%{?_program_prefix}"
%{__make} %{?_smp_mflags}
答案 0 :(得分:1)
没有足够的信息来提供详细的答案,但您应该专注于规范文件中的%prep部分。
如果你很幸运,本节将调用configure。然后,您应该能够查看configure脚本提供的参数,并找出哪一个负责-Wall标志。运行'configure --help'可能会列出可用的标志。
然后您应该能够更新规范文件,以便配置调用包含将跳过将-Wall添加到CFLAGS的标记
您也可以在配置调用期间设置CFLAGS环境变量,但配置脚本可能会忽略或覆盖这些变量。
CFLAGS="-O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -Werror" configure --whatever
答案 1 :(得分:1)
除了编辑之外,如何禁用构建的-Werror标志 Makefile我自己?
GCC手册在3.8 Options to Request or Suppress Warnings中有解决方案:
您可以通过选项
-W', for example -Wimplicit to request warnings on implicit declarations. Each of these specific warning options also has a negative form beginning
- Wno-'请求许多特定警告,以关闭警告;例如,-Wno-implicit。 本手册仅列出两种形式中的一种,不论是哪种形式 默认值。
因此,设置-Wno-error
CFLAGS环境变量对我来说很有用。现在我知道我在寻找什么,我可以看到Stackoverflow有很多答案:https://stackoverflow.com/search?q=%22-Wno-%22,特别是how to disable specific warning when -Wall is enabled。
在我的特定情况下,由于“警告:未使用的变量”,构建失败,我可以使用-Wno-unused-variable
来禁止这些特定警告。
由于我正在使用rpmbuild,我需要按照@pwan的建议将其放在.spec文件中。我能解决这个问题的唯一方法是:
建立rpm一次:
rpmbuild -v -bb ~/rpmbuild/SPECS/sudosh.spec
搜索由./configure
Configuration summary:
======================
Host type................: x86_64-redhat-linux-gnu
CC.......................: gcc
CFLAGS...................: -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -Werror
并手动将这些CFLAGS附加到我的.spec文件,进入`%configure%section:
%configure \
--program-prefix="%{?_program_prefix}"
#%{__make} %{?_smp_mflags}
%{__make} %{?_smp_mflags} CFLAGS="-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -Werror -pedantic-errors -Wno-unused-variable -ansi -std=c99"
以上是一个小问题,因为如果./configure脚本在上游更改,我可能需要重新调整我的.spec文件中的CFLAGS。