rpmbuild:如何使用rpmbuild告诉autoconf或configure来禁用标志?

时间:2011-09-19 19:27:59

标签: compilation rpmbuild

我在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。

看起来./configureautoconf会自动添加-Werror标记。如何禁用构建的-Werror标志,而不是自己编辑Makefile?

响应@ pwan的答案更新:

.spec文件非常通用,并没有指定任何特殊标志:

%build
%configure \
    --program-prefix="%{?_program_prefix}"
%{__make} %{?_smp_mflags}

2 个答案:

答案 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文件中。我能解决这个问题的唯一方法是:

  1. 建立rpm一次:

    rpmbuild -v -bb ~/rpmbuild/SPECS/sudosh.spec
    
  2. 搜索由./configure

    生成的CFLAGS
    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
    
  3. 并手动将这些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"
    
  4. 以上是一个小问题,因为如果./configure脚本在上游更改,我可能需要重新调整我的.spec文件中的CFLAGS。