我可以在不使用命令行的情况下更改gcc默认选项吗?

时间:2016-10-15 16:25:26

标签: gcc configure gentoo

我受Gentoo bug #580414的困扰。 简而言之,默认选项会将 configure 误导为不检测标准包含文件,因为某些标头包含以下代码:

#if defined _FORTIFY_SOURCE && _FORTIFY_SOURCE > 0
# if !defined __OPTIMIZE__ || __OPTIMIZE__ <= 0
#  warning _FORTIFY_SOURCE requires compiling with optimization (-O)

__ OPTIMIZE __ 默认情况下处于关闭状态,默认情况下 _FORTIFY_SOURCE 处于启用状态,生成的警告会被视为错误,表示“stdint.h”,“ stdlib.h“和许多其他人缺席。编译最终失败,我无法安装程序甚至升级gcc本身。

我可以简单地在环境变量或/ etc目录中放置一些内容来打开-O或关闭_FORTIFY_SOURCE以获取每次 gcc调用而不编辑gentoo构建脚本吗?

在/etc/portage/make.conf中尝试

EPATCH_USER_EXCLUDE='*10_all_default-fortify-source*'
CFLAGS="-O2 -O -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0"
CFLAGS_FOR_BUILD="-O2 -O -U_FORTIFY_SOURCE"

没有任何改进。

2 个答案:

答案 0 :(得分:1)

没有这样的环境变量。 CFLAGS中的make.conf将无效,因为构建系统通常会执行以下操作:

    $(CC) $(CFLAGS) $(MY_HARDCODED_CFLAGS)

因此覆盖你的旗帜。

但是为了破坏传递给gcc的任何参数,你可以使用以下解决方法。

  1. 创建一个目录,例如。在/usr/local/bin/
  2. 创建一个脚本,根据需要修改其参数,然后将它们传递给gcc"/usr/bin/" + basename(argv[0])(提防无限递归)
  3. 使此脚本可执行
  4. 为该目录中的脚本创建符号链接,其名称为gccccx86_64-pc-linux-gnu-gcc
  5. 将一堆这样的行放入/etc/portage/bashrc

    the_dir="/usr/local/bin/THE_DIR"
    if [[ "${PATH}" != *"${the_dir}"* ]] ; then
        export PATH="${the_dir}:${PATH}"
    fi
    
  6. 为了避免将来遇到可能出现的问题,请不要忘记在某个地方记下这个变化。 (无论如何,应该采用任何解决方法。)

答案 1 :(得分:0)

记录我实际用于解决问题的命令。

mv /usr/bin/i686-pc-linux-gnu-gcc /usr/bin/i686-pc-linux-gnu-gcc.OLD
cat >/usr/bin/i686-pc-linux-gnu-gcc
/usr/bin/i686-pc-linux-gnu-gcc.OLD -O "$@"

CTRL + d

chmod +x /usr/bin/i686-pc-linux-gnu-gcc
cp /usr/i686-pc-linux-gnu/gcc-bin/4.6.3/i686-pc-linux-gnu-gcc /usr/i686-pc-linux-gnu/gcc-bin/4.6.3/i686-pc-linux-gnuu-gcc
mv /usr/bin/i686-pc-linux-gnu-g++ /usr/bin/i686-pc-linux-gnuu-g++
cat >/usr/bin/i686-pc-linux-gnu-g++
/usr/bin/i686-pc-linux-gnuu-g++ -O "$@"

CTRL + d

chmod +x /usr/bin/i686-pc-linux-gnu-g++
cp /usr/i686-pc-linux-gnu/gcc-bin/4.6.3/i686-pc-linux-gnu-g++ /usr/i686-pc-linux-gnu/gcc-bin/4.6.3/i686-pc-linux-gnuu-g++
cp /etc/env.d/gcc/i686-pc-linux-gnu-4.6.3.O /etc/env.d/gcc/i686-pc-linux-gnuu-4.6.3

所有信用都归rindeal。回顾一下:

  1. 识别作为编译器调用的二进制文件
  2. 重命名
  3. 取而代之的是创建前缀&#34; -O&#34;
  4. 的shell脚本
  5. 创建一个gcc配置文件以安抚gcc-config
  6. 出现所有笨重的包裹!