关于这个软件包的详细资料位于 Section 6.11.4, "Contents of Glibc."
Glibc 包含了主要的C库。这个库提供了基本例程,用于分配内存、搜索目录、打开关闭文件、读写文件、字串处理、模式匹配、数学计算等等。
如果你把这个包缺省的优化参数(包括 -march 和 -mcpu 参数)改变的话,它会有些不正常的表现。因此,如果你定义了任何优化参数的话,比如 CFLAGS 和 CXXFLAGS ,我们劝你在编译时 unset 或修改它们。
一个值得注意的地方是,使用非本书建议的方法来编译 Glibc ,就是在拿系统的稳定性做赌注。
在 2.6.11.x 内核下,Glibc 会有两个测试项目不能通过,这是既不是 Glibc 也不是内核的原因,而是测试工具自身的原因造成的。如果你使用的是 2.6.11.x 内核,并且想运行测试套件的话,请先打上补丁:
patch -Np1 -i ../glibc-2.3.4-fix_test-1.patch
Glibc 文档推荐在源码目录之外的一个专门的编译目录下进行编译:
mkdir -v ../glibc-build cd ../glibc-build
接下来为 Glibc 做编译前的准备:
../glibc-2.3.4/configure --prefix=/tools \ --disable-profile --enable-add-ons \ --enable-kernel=2.6.0 --with-binutils=/tools/bin \ --without-gd --with-headers=/tools/include \ --without-selinux
配置选项的意思是:
它关掉了 profiling 信息相关的库文件编译。如果你打算做 profiling ,就省掉这个参数。
这个指示 Glibc 使用附加的 NPTL 包作为线程库。
这个告诉 Glibc 编译支持2.6.x内核的库。
这个参数并不是必需的。但它们能保证在编译 Glibc 时不会用错 Binutils 程序。
这个参数保证不生成 memusagestat 程序,这个程序会顽固地连接到宿主系统的库文件(libgd, libpng, libz 等等)。
这个参数指示 Glibc 按照前面刚刚安装到 tools 目录中的内核头文件编译自己,从而精确的知道内核的特性以根据这些特性对自己进行最佳化编译。
当从一个含有 SELinux 特性的宿主系统(如FC3)编译时,Glibc 将会将 SELinux 支持编译进来。由于 LFS 工具链并不包含 SELinux 支持,所以一个含有 SELinux 特性的 Glibc 将会导致许多操作失败。所以这里明确禁用它。
在这个阶段你可能会看到下面的警告:
configure: WARNING: *** These auxiliary programs are missing or *** incompatible versions: msgfmt *** some features will be disabled. *** Check the INSTALL file for required versions.
抱怨说缺少或有不兼容的 msgfmt 程序,这没有什么大问题,不过有时候可能会在运行测试套件的时候出问题。msgfmt 程序是宿主系统 Gettext 应当提供的一部分。如果担心宿主系统的 msgfmt 有兼容性问题,你可以升级宿主系统的 Gettext ,也可以忽略这个问题而不去管它。
编译软件包:
make
现在编译完成了。正如前面说过的,在这里运行测试没什么用处,但是如果你坚持要测试的话可以运行下列命令:
make check
关于测试失败重要性的讨论请参考这里: Section 6.11, "Glibc-2.3.4."
在这一章里,Glibc 的测试套件高度依赖于宿主系统的工具和环境,尤其是内核。因为这个原因,有时错误很难避免,但是无需太在意。Chapter 6 里面的 Glibc 才是我们最后所使用的,那里的 Glibc 需要通过绝大多数测试。但要注意的是,即使在 Chapter 6 里,有的失败还是会出现,比如 math 测试。
当遇到一个错误时,记录下来,再用 make check 继续。测试套件会从出错的地方继续进行。你也可以用 make -k check 来一次把测试做完。但如果你这样做的话,就要把屏幕输出记录到文件里( make -k check > ck_log ),以便最后检查到底出了多少错,哪些测试出错了。
在安装 Glibc 的过程中,它会警告缺少 /tools/etc/ld.so.conf 文件。其实这没什么关系,不过下面的命令能修正它:
mkdir -v /tools/etc touch /tools/etc/ld.so.conf
安装软件包:
make install
不同的国家和文化,使用不同的习俗来交流。这样的习俗很多,从比较简单的时间和日期格式,到非常复杂的语言发音。GNU 程序的"internationalization"(国际化,又称"i18n",18表示中间的18个字母)是以 locales 来实现的。
如果刚才没有运行测试套件,那么现在就没有必要安装 locales 。在下一章里面我们将会安装。
如果你一定要安装 locale ,请执行下面的命令:
make localedata/install-locales
为了节省时间,上一个命令(生成并安装所有的 locale )的替代方案是只安装想要和需要的 locale 。使用 localedef 命令可以做到这一点。关于这个命令的信息在 Glibc 的代码树里的 INSTALL 文件中有详细叙述。然而,为了将来的软件包通过测试,许多 locale 还是必需的,比如 GCC 中的 libstdc++ ,下面的命令能安装运行测试套件所必需的最少 locale :
mkdir -pv /tools/lib/locale localedef -i de_DE -f ISO-8859-1 de_DE localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro localedef -i en_HK -f ISO-8859-1 en_HK localedef -i en_PH -f ISO-8859-1 en_PH localedef -i en_US -f ISO-8859-1 en_US localedef -i es_MX -f ISO-8859-1 es_MX localedef -i fa_IR -f UTF-8 fa_IR localedef -i fr_FR -f ISO-8859-1 fr_FR localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro localedef -i it_IT -f ISO-8859-1 it_IT localedef -i ja_JP -f EUC-JP ja_JP
关于这个软件包的详细资料位于 Section 6.11.4, "Contents of Glibc."