我可以在不使用 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 的任何参数,您可以使用以下解决方法。
- 创建一个目录,例如。在
/usr/local/bin/
之下
- 创建一个脚本,它会根据需要破坏其参数,然后将它们传递给
gcc
或 "/usr/bin/" + basename(argv[0])
(谨防无限递归)
- 使这个脚本可执行
- 在该目录中创建指向脚本的符号链接,名称如
gcc
、cc
、x86_64-pc-linux-gnu-gcc
将这样的一堆行放入/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。回顾:
- 识别作为编译器调用的二进制文件
- 重命名它们
- 在它们的位置,创建 shell 前缀为“-O”的脚本
- 创建 gcc 配置文件以安抚 gcc-config
- 出现所有笨重的包!
我被 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 的任何参数,您可以使用以下解决方法。
- 创建一个目录,例如。在
/usr/local/bin/
之下
- 创建一个脚本,它会根据需要破坏其参数,然后将它们传递给
gcc
或"/usr/bin/" + basename(argv[0])
(谨防无限递归) - 使这个脚本可执行
- 在该目录中创建指向脚本的符号链接,名称如
gcc
、cc
、x86_64-pc-linux-gnu-gcc
将这样的一堆行放入
/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。回顾:
- 识别作为编译器调用的二进制文件
- 重命名它们
- 在它们的位置,创建 shell 前缀为“-O”的脚本
- 创建 gcc 配置文件以安抚 gcc-config
- 出现所有笨重的包!