从头开始构建gcc而不使用lib64目录

时间:2015-02-24 12:47:00

标签: gcc

我正试图在x86_64机器上从头开始设置gcc编译器。我用

配置了它
./configure --enable-shared --enable-languages=c,c++,fortran --disable-multilib --libdir=/cluster/apps/lib --with-gmp=/cluster/apps/ --with-mpfr=/cluster/apps --with-mpc=/cluster/apps --prefix=/cluster/apps

构建并运行make install后,库将安装在

/cluster/apps/lib64

而不是所需的

/cluster/apps/lib

如何建议配置脚本使用/cluster/apps/lib作为库目标?

1 个答案:

答案 0 :(得分:1)

根据您要如何处理,这显得有些微不足道。在构建GCC时,您可以对其进行配置,以支持多种目标平台和体系结构,并且每个目标可能都需要各自的各种支持库版本。这些库(例如libatomic.a)在每个目标上都有相同的名称,但是当然必须根据目标位于不同的目录中。 Debian的MultiArch约定是对此的更为形式化的概括,GCC早于IIUC的multilib支持。

因此,GCC在何处安装库,高度依赖于它要支持的目标。反过来,这取决于您所构建的主机系统的默认值(如果您在配置时没有指定其他目标的话)。对于x86_64 Linux目标,默认情况下有两个multilib选项,一个用于使用-m32(编译32位二进制文​​件)进行构建,另一个用于-m64,对于-m64情况则需要找到库${libdir}/../lib64中的库,而对于-m32,它需要(通常)${libdir}/../lib中的库。该信息可在gcc/config/i386/t-linux64 makefile代码段中找到。

genmultilib脚本将这些MULTILIB_变量的含义(以某种方式)进行了解释(由Makefile传递给它们)。

“但是请稍等片刻”,您可能会打断“我将--disable-multilib传递给./configure,因此它应该忘记所有这些multilib内容,并按照我的要求在${prefix}/lib中安装内容。但是,它并不那么简单,正如您在上一段链接的Makefile模板中所看到的,如果目标恰好指定了非空的--disable-multilib,则$(MULTILIB_OSDIRNAMES)会被悄悄忽略。这种情况支持具有支持两个库的两个目标体系结构选项(-m64-m32),因此它仍会生成多库支持的设置。

因此,如果您想要不同的目录布局,该怎么办?理想情况下,由于在这种情况下我们只想覆盖$(MULTILIB_OSDIRNAMES)变量的默认值,如果我们可以在配置时或运行make时提供覆盖(例如make MULTILIB_OSDIRNAMES="m32=../lib32 m64=../lib"),那将是很好的选择。 。我相信应该可以很方便地工作,但不幸的是,它没有:顶层Makefile支持GCC稍微复杂的多阶段构建过程,并且涉及多个递归的make调用,我没有进行修补,就无法使其可靠地将变量覆盖传递给相关的子品牌。我认为这很不幸。

我发现,目前最简单的方法是执行Debian的操作,而只是patch gcc/config/i386/t-linux64(以及用于其他体系结构的类似文件)来反映他们喜欢的目录布局。

另一种可能性是修补gcc/config.gcc脚本。这是一个脚本,用于查看要为GCC构建目标的目标,并根据目标确定大量的makefile变量和代码片段。有关适用于x86_64 Linux目标的某些设置,请参见例如this sectiontmake_file变量实际上是gcc/config下通常包含多个文件的列表,这些文件以t-开头,这意味着它们包含要由主gcc Makefile包含的Makefile代码段。在这里gcc/config/i386/t-linux64文件被选中。从理论上讲,您可以将自己的自定义目标添加到该文件(某些x86_64-mycustom-linux)中,并使它加载自己的其他Makefile代码片段,以覆盖Linux的默认multilib选项。但是,我认为到那时,您最好只修补t-linux64并保留它。