10.7.1. Installation de EGLIBC
Remarque
Certains paquets non compris dans CLFS suggèrent d'installer GNU
libiconv pour traduire les données d'un encodage en un autre. La
page d'accueil du projet (http://www.gnu.org/software/libiconv/)
précise que « Cette bibliothèque fournit
une implémentation de iconv()
à
utiliser sur les systèmes qui n'en disposent pas ou dont
l'implémentation ne convertit pas l'Unicode. » EGLIBC
fournit une implémentation d'iconv()
et peut convertir de l'Unicode, du coup
libiconv n'est pas requis sur un système CLFS.
À la fin de l'installation, le système de construction exécutera un
test de propreté pour s'assurer que tout s'est installé
correctement. Ce script essaiera de tester la présence d'une
bibliothèque utilisée uniquement pour la suite de tests, et elle
n'est jamais installée. Empêchez le script de tester la présence de
cette bibliothèque avec la commande suivante :
sed -i 's/\(&& $name ne\) "db1"/ & \1 "nss_test1"/' scripts/test-installation.pl
Ce même script effectue ses tests en essayant de compiler des
programmes de test contre certaines bibliothèques. Cependant, il ne
spécifie pas le ld.so, or notre ensemble d'outils est configuré
pour utiliser celui de /tools. L'ensemble de commandes suivant
obligera le script à utiliser le chemin complet du nouveau ld.so
qu'on vient d'installer :
LINKER=$(readelf -l /tools/bin/bash | sed -n 's@.*interpret.*/tools\(.*\)]$@\1@p')
sed -i "s|libs -o|libs -L/usr/lib -Wl,-dynamic-linker=${LINKER} -o|" \
scripts/test-installation.pl
unset LINKER
Le système de construction d'EGLIBC est autosuffisant et s'installe
parfaitement, même si notre fichier specs pour le compilateur et
l'éditeur de liens pointent toujours vers /tools
. Les specs et l'éditeur de liens ne
peuvent pas être ajustés avant l'installation de la EGLIBC parce
que les tests d'autoconf d'EGLIBC donneraient alors des résultats
faussés, défaussant ainsi notre but d'achever une construction
propre.
La documentation d'EGLIBC recommande de construire EGLIBC en dehors
du répertoire des sources dans un répertoire de construction
dédié :
mkdir -v ../eglibc-build
cd ../eglibc-build
Dites à EGLIBC d'installer ses bibliothèques dans /lib
:
echo "slibdir=/lib" >> configparms
Préparez la compilation d'EGLIBC :
CFLAGS="-O2" \
../eglibc-2.18/configure --prefix=/usr \
--disable-profile --enable-kernel=2.6.32 \
--libexecdir=/usr/lib/eglibc --libdir=/usr/lib \
--enable-obsolete-rpc
Voici la signification de la nouvelle option de
configure :
-
--libexecdir=/usr/lib/glibc
-
Ceci modifie l'emplacement de l'outil getconf de celui par défaut
/usr/libexec
vers /usr/lib/glibc
.
Compilez le paquet :
make
Important
La suite de tests d'EGLIBC est considérée comme critique. Ne la
sautez sous aucun prétexte.
Testez les résultats :
cp -v ../eglibc-2.18/iconvdata/gconv-modules iconvdata
make -k check 2>&1 | tee eglibc-check-log; grep Error eglibc-check-log
La suite de tests EGLIBC est très dépendante de certaines fonctions
du système hôte, en particulier du noyau. Normalement, le test
posix/annexc échoue et vous devriez voir Error 1 (ignored)
dans la sortie. Excepté cela, la
suite de tests d'EGLIBC devrait toujours passer. Néanmoins, dans
certaines circonstances, certains échecs sont inévitables. Si un
test échoue à cause d'un programme manquant (ou d'un lien
symbolique manquant), ou du fait d'une erreur de segmentation, vous
verrez un code d'erreur supérieur à 127 et les détails seront dans
le journal. De manière plus générale, les tests échoueront avec
Error 2
- pour eux le contenu du
fichier .out
, comme posix/annexc.out
peut vous donner des
informations. Voici une liste des problèmes les plus
fréquents :
-
Les tests math
échouent quelque fois. Certaines optimisations sont connues
pour être une cause de cela.
-
Si vous avez monté la partition CLFS avec l'option noatime
, le test atime échouera. Comme mentionné
dans Section 2.4,
« Monter la nouvelle partition », n'utilisez
pas l'option noatime
lors de la construction de CLFS.
-
Lors d'une exécution sur un matériel ancien et lent, quelques
tests peuvent échouer à cause de délais dépassés.
Bien que ce ne soit qu'un simple message, l'étape d'installation de
EGLIBC se plaindra de l'absence de /etc/ld.so.conf
. Supprimez ce message
d'avertissement avec :
touch /etc/ld.so.conf
L'installation va finir en vérifiant que tout est correctement
installé. Malheureusement, il va tester pour une installation
multilib. Sur x86_64 Pure64, cela signifie qu'il va essayer de
tester un chargeur 32 bits inexistant qui a un nom différent du
chargeur 64 bits (contrairement aux autres architectures 64 bits).
On le trompe en créant un lien symbolique vers le chargeur réel.
ln -sv ld-2.18.so /lib/ld-linux.so.2
Installez le paquet :
make install
Maintenant, nous pouvons supprimer ce lien symbolique. Nous avons
aussi besoin de corriger le script /usr/bin/ldd - si vous le
regardez, vous verrez qu'il ne se réfère pas seulement à l'éditeur
de liens 32 bits mais aussi à /lib64 où il pense que se trouve
l'éditeur de liens. Le sed suivant va corriger
cela :
rm -v /lib/ld-linux.so.2
cp -v /usr/bin/ldd{,.bak}
sed '/RTLDLIST/s%/ld-linux.so.2 /lib64%%' /usr/bin/ldd.bak >/usr/bin/ldd
Vérifiez le script pour être sûr que le sed a fonctionné
correctement puis effacez la sauvegarde.
rm -v /usr/bin/ldd.bak
L'en-tête stubs.h installée par EGLIBC cherche stubs-32.h et
stubs-64.h. Cette configuration d'EGLIBC ne génère qu'un
stubs-64.h. Corrigez cela avec ce qui suit :
mv -v /usr/include/gnu/stubs{-64,}.h
10.7.2.
Internationalisation
Les locales qui permettent à votre système de répondre en une
langue différente n'ont pas été installées avec la commande
ci-dessus. Aucune n'est indispensable, mais si certaines sont
absentes, les suites de test des futurs paquets peuvent sauter des
situations de test importantes.
make localedata/install-locales
Pour gagner du temps, une alternative au lancement de la commande
précédente (qui génère et installe toutes les locales listées dans
le fichier EGLIBC-2.18/localedata/SUPPORTED
est de
n'installer que les locales nécessaires et exigées. Vous pouvez
faire cela avec la commande localedef. Des informations sur
cette commande se trouvent dans le fichier INSTALL
des sources d'EGLIBC. Néanmoins, il y a
un nombre de locales essentielles pour que les tests des paquets à
venir passent, en particulier les tests libstdc++ de GCC. Les instructions
suivantes au lieu de la cible install-locales
utilisée ci-dessus,
installeront l'ensemeble minimal des locales nécessaires pour que
les tests s'exécutent avec succès :
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 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
Certaines locales installées par la commande make localedata/install-locales
ci-dessus ne sont pas supportées correctement par certaines
applications qui sont dans CLFS et CBLFS. À la vue des divers
problèmes survenus du fait de certains présupposés des programmeurs
de certaines applications, lesquelles se cassent dans de telles
locales, vous ne devriez pas utiliser CLFS dans des locales
utilisant des encodages multioctets (y compris UTF-8) ou le sens
d'écriture de droite à gauche. De nombreux correctifs non officiels
et instables sont nécessaires pour corriger ces problèmes et les
développeurs de CLFS ont décidé de ne pas supporter des locales
complexes pour l'instant. Ceci s'applique aux locales ja_JP et
fa_IR — elles n'ont été installées que pour que les tests de
GCC et de Gettext passent et le programme watch (qui fait partie du paquet
Procps) ne fonctionne pas correctement avec elles. Diverses
solutions pour contourner ces restrictions sont documentées dans
les astuces liées à l'internationalisation.
10.7.3. Configurer
EGLIBC
Le fichier /etc/nsswitch.conf
doit
être créé car, bien que EGLIBC en fournisse un par défaut lorsque
ce fichier est manquant ou corrompu, les valeurs par défaut
d'EGLIBC ne fonctionnent pas bien dans un environnement en réseau.
De plus, le fuseau horaire a besoin d'être configuré.
Créez un nouveau fichier /etc/nsswitch.conf
en exécutant ce qui
suit :
cat > /etc/nsswitch.conf << "EOF"
# Début de /etc/nsswitch.conf
passwd: files
group: files
shadow: files
hosts: files dns
networks: files
protocols: files
services: files
ethers: files
rpc: files
# Fin de /etc/nsswitch.conf
EOF
Installez les données de fuseau horaire :
tar -xf ../tzdata2013g.tar.gz
ZONEINFO=/usr/share/zoneinfo
mkdir -pv $ZONEINFO/{posix,right}
for tz in etcetera southamerica northamerica europe africa antarctica \
asia australasia backward pacificnew solar87 solar88 solar89 \
systemv; do
zic -L /dev/null -d $ZONEINFO -y "sh yearistype.sh" ${tz}
zic -L /dev/null -d $ZONEINFO/posix -y "sh yearistype.sh" ${tz}
zic -L leapseconds -d $ZONEINFO/right -y "sh yearistype.sh" ${tz}
done
cp -v zone.tab iso3166.tab $ZONEINFO
zic -d $ZONEINFO -p America/New_York
unset ZONEINFO
Voici la signification de ces commandes :
-
zic -L /dev/null
...
-
Ceci crée des fuseaux horaires posix sans décalage de
secondes. Par convention, on les met dans zoneinfo
et dans zoneinfo/posix
. Il faut mettre les fuseaux
horaires POSIX dans zoneinfo
,
sans quoi plusieurs suites de tests renverront des erreurs.
Sur un système embarqué, où l'espace est limité et où vous ne
souhaitez jamais mettre à jour les fuseaux horaires, vous
pouvez économiser 1.9Mo en n'utilisant pas le répertoire
posix
, mais il se peut que les
suites de tests de certaines applications donnent de moins
bons résultats
-
zic -L
leapseconds ...
-
Ceci crée des fuseaux horaires incluant les sauts de
secondes. Sur un système embarqué, où l'espace est limité et
où vous ne souhaitez jamais mettre à jour les fuseaux
horaires, vous pouvez économiser 1.9Mo en ne mettant pas de
répertoire right
.
-
zic ... -p
...
-
Cela crée le fichier posixrules
. Nous utilisons New York car
POSIX exige des règles d'heures de sauvegarde quotidiennes
correspondant aux règles américaines.
Pour déterminer dans quel fuseau horaire vous vous situez, exécutez
le script suivant :
tzselect
Après avoir répondu à quelques questions sur votre localisation, le
script affichera le nom du fuseau horaire (quelque chose comme
EST5EDT ou Canada/Eastern). Puis créez le fichier
/etc/localtime
en lançant :
cp -v --remove-destination /usr/share/zoneinfo/[xxx]
\
/etc/localtime
Remplacez [xxx]
par le
nom du fuseau horaire sélectionné (par exemple Canada/Eastern).
Voici la signification de l'option de cp :
-
--remove-destination
-
Ceci est nécessaire pour forcer la suppression du lien
symbolique déjà existant. La raison pour laquelle nous
copions plutôt que de simplement créer un lien symbolique est
d'anticiper la situation où /usr
est une partition séparée. Ceci
pourrait être important en démarrant en mode utilisateur
unique.