6.9.1. Installation of Glibc
Note
Some packages outside of LFS suggest installing GNU libiconv in
order to translate data from one encoding to another. The
project's home page (http://www.gnu.org/software/libiconv/)
says “This library provides an
iconv()
implementation, for use on
systems which don't have one, or whose implementation cannot
convert from/to Unicode.” Glibc provides an
iconv()
implementation and can
convert from/to Unicode, therefore libiconv is not required on an
LFS system.
The Glibc build system is self-contained and will install
perfectly, even though the compiler specs file and linker are still
pointing at /tools
. The specs and
linker cannot be adjusted before the Glibc install because the
Glibc autoconf tests would give false results and defeat the goal
of achieving a clean build.
In the vi_VN.TCVN locale, bash enters an infinite loop at
startup. It is unknown whether this is a bash bug or a Glibc problem.
Disable installation of this locale in order to avoid the problem:
sed -i '/vi_VN.TCVN/d' localedata/SUPPORTED
First apply two patches which correct failures in the test suite:
patch -Np1 -i ../glibc-2.8-20080929-iconv_tests-1.patch
patch -Np1 -i ../glibc-2.8-20080929-ildoubl_test-1.patch
The ldd shell script
contains Bash-specific syntax. Change its default program
interpreter to /bin/bash in case another
/bin/sh is installed
as described in the
Shells chapter of the BLFS book:
sed -i 's|@BASH@|/bin/bash|' elf/ldd.bash.in
The Glibc documentation recommends building Glibc outside of the
source directory in a dedicated build directory:
mkdir -v ../glibc-build
cd ../glibc-build
Again, add the needed compiler flag to CFLAGS:
echo "CFLAGS += -march=i486 -mtune=native" > configparms
Prepare Glibc for compilation:
../glibc-2.8-20080929/configure --prefix=/usr \
--disable-profile --enable-add-ons \
--enable-kernel=2.6.0 --libexecdir=/usr/lib/glibc
The meaning of the new configure options:
-
--libexecdir=/usr/lib/glibc
-
This changes the location of the pt_chown program from its
default of /usr/libexec
to
/usr/lib/glibc
.
Compile the package:
make
Important
In this section, the test suite for Glibc is considered critical.
Do not skip it under any circumstance.
Before running the tests, copy a file from the source tree into our
build tree to prevent a couple of test failures, then test the
results:
cp -v ../glibc-2.8-20080929/iconvdata/gconv-modules iconvdata
make -k check 2>&1 | tee glibc-check-log
grep Error glibc-check-log
You will probably see an expected (ignored) failure in the
posix/annexc test. In
addition the Glibc test suite is somewhat dependent on the host
system. This is a list of the most common issues:
-
The nptl/tst-cancel1
test will fail when using the 4.1 series of GCC.
-
The nptl/tst-clock2
and tst-attr3 tests
sometimes fail. The reason is not completely understood, but
indications are that a heavy system load can trigger these
failures.
-
The math tests sometimes fail when running on systems where
the CPU is not a relatively new genuine Intel or authentic
AMD processor.
-
If you have mounted the LFS partition with the noatime
option, the
atime test will fail.
As mentioned in Section 2.4,
“Mounting the New Partition”, do not use the
noatime
option while
building LFS.
-
When running on older and slower hardware or on systems under
load, some tests can fail because of test timeouts being
exceeded.
Though it is a harmless message, the install stage of Glibc will
complain about the absence of /etc/ld.so.conf
. Prevent this warning with:
touch /etc/ld.so.conf
Install the package:
make install
The locales that can make the system respond in a different
language were not installed by the above command. None of the
locales are required, but if some of them are missing, testsuites
of the future packages would skip important testcases.
Individual locales can be installed using the localedef program. E.g., the
first localedef
command below combines the /usr/share/i18n/locales/de_DE
charset-independent
locale definition with the /usr/share/i18n/charmaps/ISO-8859-1.gz
charmap
definition and appends the result to the /usr/lib/locale/locale-archive
file. The
following instructions will install the minimum set of locales
necessary for the optimal coverage of tests:
mkdir -pv /usr/lib/locale
localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8
localedef -i de_DE -f ISO-8859-1 de_DE
localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro
localedef -i de_DE -f UTF-8 de_DE.UTF-8
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 en_US -f UTF-8 en_US.UTF-8
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 fr_FR -f UTF-8 fr_FR.UTF-8
localedef -i it_IT -f ISO-8859-1 it_IT
localedef -i ja_JP -f EUC-JP ja_JP
localedef -i tr_TR -f UTF-8 tr_TR.UTF-8
In addition, install the locale for your own country, language and
character set.
Alternatively, install all locales listed in the glibc-2.8-20080929/localedata/SUPPORTED
file (it
includes every locale listed above and many more) at once with the
following time-consuming command:
make localedata/install-locales
Then use the localedef command to create and
install locales not listed in the glibc-2.8-20080929/localedata/SUPPORTED
file in
the unlikely case you need them.
6.9.2. Configuring Glibc
The /etc/nsswitch.conf
file needs to
be created because, although Glibc provides defaults when this file
is missing or corrupt, the Glibc defaults do not work well in a
networked environment. The time zone also needs to be configured.
Create a new file /etc/nsswitch.conf
by running the following:
cat > /etc/nsswitch.conf << "EOF"
# Begin /etc/nsswitch.conf
passwd: files
group: files
shadow: files
hosts: files dns
networks: files
protocols: files
services: files
ethers: files
rpc: files
# End /etc/nsswitch.conf
EOF
One way to determine the local time zone, run the following script:
tzselect
After answering a few questions about the location, the script will
output the name of the time zone (e.g., America/Edmonton). There are also some
other possible timezones listed in /usr/share/zoneinfo
such as Canada/Eastern or EST5EDT that are not identified by the
script but can be used.
Then create the /etc/localtime
file
by running:
cp -v --remove-destination /usr/share/zoneinfo/<xxx>
\
/etc/localtime
Replace <xxx>
with
the name of the time zone selected (e.g., Canada/Eastern).
The meaning of the cp option:
-
--remove-destination
-
This is needed to force removal of the already existing
symbolic link. The reason for copying the file instead of
using a symlink is to cover the situation where /usr
is on a separate partition. This could
be important when booted into single user mode.