在没有 lib64 目录的情况下从头开始构建 gcc
Build gcc from scratch without lib64 directory
我正在尝试在 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
作为库目标?
事实证明这有点不平凡,具体取决于你想如何去做。在构建 GCC 时,您可以将其配置为支持大量目标平台和体系结构,并且这些目标中的每一个都可能需要它们自己的各种支持库版本。这些库(例如 libatomic.a)在每个目标上都有相同的名称,但当然必须根据目标位于不同的目录中。 Debian 的 MultiArch 约定是对 IIUC 的更正式的概括,GCC 中的 multilib 支持早于此。
因此,GCC 安装库的位置高度依赖于它支持的目标;这反过来有一些默认值,具体取决于您正在构建的主机系统(如果您没有在配置时指定一些目标)。对于 x86_64 Linux 目标,默认情况下有两个 multilib 选项,一个用于使用 -m32
构建(编译 32 位二进制文件),一个用于 -m64
,以及 -m64
情况下它需要在 ${libdir}/../lib64
中找到的库,而对于 -m32
它需要(通常)${libdir}/../lib
中的库。此信息可在 gcc/config/i386/t-linux64
生成文件片段中找到。
这些 MULTILIB_
变量的含义在 genmultilib
script to which they are passed by the Makefile
.
中有(某种程度上)解释
"But wait a sec",你可能会打断,“我将 --disable-multilib
传递给了 ./configure
所以它应该忘记所有这些 multilib 的东西并像我问的那样在 ${prefix}/lib
中安装东西.虽然不是那么简单。正如您在上一段链接的 Makefile 模板中看到的那样,如果您的目标恰好指定了一个非空的 $(MULTILIB_OSDIRNAMES)
,--disable-multilib
将被悄悄忽略。毕竟,目标在这种情况下,支持两个目标体系结构选项(-m64
和 -m32
), 有 来支持多个库,因此它仍然会生成 multilib 支持的设置。
所以如果你想要一个不同的目录布局,怎么办?理想情况下,因为在这种情况下我们只想覆盖 $(MULTILIB_OSDIRNAMES)
变量的默认值,所以如果我们可以在配置时或 运行 make(例如 make MULTILIB_OSDIRNAMES="m32=../lib32 m64=../lib"
).我相信这个 应该 工作是为了方便,但不幸的是它没有:顶层 Makefile
支持 GCC 稍微复杂的多阶段构建过程,它涉及几个递归的 make 调用,并且我无法在不进行一些修补的情况下将变量覆盖可靠地传递给相关的子品牌。我认为那是不幸的。
我发现目前最简单的方法是做 Debian 所做的,只是 patch gcc/config/i386/t-linux64
(以及其他架构的类似文件)来反映他们喜欢的目录布局。
另一种可能性是为 gcc/config.gcc script. This is the script that looks at what target you're building GCC for, and determines a number of makefile variables and snippets depending on the target. See for example this section 应用的某些设置修补 x86_64 Linux 目标。 tmake_file
变量实际上是 gcc/config
下通常有多个文件的列表,这些文件以 t-
开头,这意味着它们包含要包含在主 gcc Makefile 中的 Makefile 片段。这是 gcc/config/i386/t-linux64
文件以及其他文件被选中的地方。理论上,您可以将自己的自定义目标添加到此文件(某些 x86_64-mycustom-linux
),并让它加载自己的附加 Makefile 片段以覆盖 Linux 的默认 multilib 选项。但是,我认为到那时你还不如打补丁 t-linux64
并保留它。
我正在尝试在 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
作为库目标?
事实证明这有点不平凡,具体取决于你想如何去做。在构建 GCC 时,您可以将其配置为支持大量目标平台和体系结构,并且这些目标中的每一个都可能需要它们自己的各种支持库版本。这些库(例如 libatomic.a)在每个目标上都有相同的名称,但当然必须根据目标位于不同的目录中。 Debian 的 MultiArch 约定是对 IIUC 的更正式的概括,GCC 中的 multilib 支持早于此。
因此,GCC 安装库的位置高度依赖于它支持的目标;这反过来有一些默认值,具体取决于您正在构建的主机系统(如果您没有在配置时指定一些目标)。对于 x86_64 Linux 目标,默认情况下有两个 multilib 选项,一个用于使用 -m32
构建(编译 32 位二进制文件),一个用于 -m64
,以及 -m64
情况下它需要在 ${libdir}/../lib64
中找到的库,而对于 -m32
它需要(通常)${libdir}/../lib
中的库。此信息可在 gcc/config/i386/t-linux64
生成文件片段中找到。
这些 MULTILIB_
变量的含义在 genmultilib
script to which they are passed by the Makefile
.
"But wait a sec",你可能会打断,“我将 --disable-multilib
传递给了 ./configure
所以它应该忘记所有这些 multilib 的东西并像我问的那样在 ${prefix}/lib
中安装东西.虽然不是那么简单。正如您在上一段链接的 Makefile 模板中看到的那样,如果您的目标恰好指定了一个非空的 $(MULTILIB_OSDIRNAMES)
,--disable-multilib
将被悄悄忽略。毕竟,目标在这种情况下,支持两个目标体系结构选项(-m64
和 -m32
), 有 来支持多个库,因此它仍然会生成 multilib 支持的设置。
所以如果你想要一个不同的目录布局,怎么办?理想情况下,因为在这种情况下我们只想覆盖 $(MULTILIB_OSDIRNAMES)
变量的默认值,所以如果我们可以在配置时或 运行 make(例如 make MULTILIB_OSDIRNAMES="m32=../lib32 m64=../lib"
).我相信这个 应该 工作是为了方便,但不幸的是它没有:顶层 Makefile
支持 GCC 稍微复杂的多阶段构建过程,它涉及几个递归的 make 调用,并且我无法在不进行一些修补的情况下将变量覆盖可靠地传递给相关的子品牌。我认为那是不幸的。
我发现目前最简单的方法是做 Debian 所做的,只是 patch gcc/config/i386/t-linux64
(以及其他架构的类似文件)来反映他们喜欢的目录布局。
另一种可能性是为 gcc/config.gcc script. This is the script that looks at what target you're building GCC for, and determines a number of makefile variables and snippets depending on the target. See for example this section 应用的某些设置修补 x86_64 Linux 目标。 tmake_file
变量实际上是 gcc/config
下通常有多个文件的列表,这些文件以 t-
开头,这意味着它们包含要包含在主 gcc Makefile 中的 Makefile 片段。这是 gcc/config/i386/t-linux64
文件以及其他文件被选中的地方。理论上,您可以将自己的自定义目标添加到此文件(某些 x86_64-mycustom-linux
),并让它加载自己的附加 Makefile 片段以覆盖 Linux 的默认 multilib 选项。但是,我认为到那时你还不如打补丁 t-linux64
并保留它。