我可以在不使用 command-line 的情况下更改 gcc 默认选项吗?

Can I change gcc default options without using command-line?

我被 Gentoo bug #580414 困扰了。 简而言之,默认选项误导 configure 不检测标准包含文件,因为某些 headers 包含此代码:

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

__OPTIMIZE__默认关闭,_FORTIFY_SOURCE默认开启,生成的warning 被视为错误,表示 "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"

没有任何改善。

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

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

从而覆盖您的标志。

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

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

    the_dir="/usr/local/bin/THE_DIR"
    if [[ "${PATH}" != *"${the_dir}"* ]] ; then
        export PATH="${the_dir}:${PATH}"
    fi
    

同时为了避免将来可能出现的问题,请不要忘记在某处记录此更改。 (无论如何都应该用任何解决方法来完成。)

只是记录我实际用来解决问题的命令。

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. 在它们的位置,创建 shell 前缀为“-O”的脚本
  4. 创建 gcc 配置文件以安抚 gcc-config
  5. 出现所有笨重的包!