À propos des fichiers d'archive libtool (.la)

Fichiers avec une extension .la

Dans LFS et BLFS, de nombreux paquets utilisent une copie interne de libtool pour se construire sur diverses plateformes Unix. Cela comprend des plateformes comme AIX, Solaris, IRIX, HP-UX et Cygwin, ainsi que Linux. Les origines de cet outil sont assez anciennes. Son objectif premier était de gérer les bibliothèques sur des systèmes aux capacités moins avancées qu'un système Linux moderne.

Sur un système Linux, les fichiers spécifiques à libtool sont généralement inutiles. En temps normal, les bibliothèques sont spécifiées dans le processus de construction pendant l'édition des liens. Comme un système Linux utilise le format exécutable et liable (ELF) pour les exécutables et les bibliothèques, les informations nécessaires à cette tâche sont incluses dans les fichiers. Aussi bien le chargeur de programme que l'éditeur des liens peuvent demander les fichiers requis, ainsi que charger et exécuter correctement le programme.

Le bibliothèques statiques sont rarement utilisées dans LFS et BLFS. De nos jours la plupart des paquets stockent les informations requises pour la liaisons aux bibliothèques statiques dans un fichier .pc, au lieu de s'appuyer sur libtool. La commande pkg-config --static --libs affichera les drapeaux nécessaires à l'éditeur des liens pour se lier à une bibliothèque statique sans la magie de libtool.

Le problème est que libtool crée typiquement un ou plusieurs fichiers texte pour les paquets de bibliothèques appelés archives libtool. Ces petits fichiers ont l'extension « .la » et contiennent des informations identiques à celles incluses dans les bibliothèques ou les fichiers pkg-config. Lors de la construction d'un paquet qui utilise libtool, le processus cherche automatiquement ces fichiers. Parfois un fichier .la peut contenir le nom ou le chemin d'une bibliothèque statique utilisée pendant la construction mais jamais installée, et le processus de construction échoue car le fichier .la se réfère à un objet inexistant sur le système. De même, si un paquet est mis à jour et n'utilise plus de fichier .la, le processus de construction peut échouer à cause de l'ancien fichier .la.

La solution consiste à supprimer les fichiers .la, mais il y a un inconvénient. Certains paquets, comme ImageMagick-7.1.0-61, utilisent une fonction de libtool, lt_dlopen, pour charger les bibliothèques requises pendant l'exécution et résoudre leurs dépendances à l'exécution. Dans ce cas, les fichiers .la ne doivent pas être supprimés.

Le script ci-dessous supprime tous les fichiers .la inutiles et les sauvegarde dans un répertoire, /var/local/la-files par défaut, qui ne se trouve pas dans le chemin de recherche habituel des bibliothèques. Il recherche également les références à des fichiers .la dans les fichiers pkg-config (.pc) et les transforme en références de bibliothèques conventionnelles qui sont nécessaires lors de la construction d'une application ou d'une bibliothèque. Il peut être lancé au besoin pour nettoyer les répertoires qui causent des problèmes.

cat > /usr/sbin/remove-la-files.sh << "EOF"
#!/bin/bash

# /usr/sbin/remove-la-files.sh
# Written for Beyond Linux From Scratch
# by Bruce Dubbs <bdubbs@linuxfromscratch.org>

# Make sure we are running with root privs
if test "${EUID}" -ne 0; then
    echo "Error: $(basename ${0}) must be run as the root user! Exiting..."
    exit 1
fi

# Make sure PKG_CONFIG_PATH is set if discarded by sudo
source /etc/profile

OLD_LA_DIR=/var/local/la-files

mkdir -p $OLD_LA_DIR

# Only search directories in /opt, but not symlinks to directories
OPTDIRS=$(find /opt -mindepth 1 -maxdepth 1 -type d)

# Move any found .la files to a directory out of the way
find /usr/lib $OPTDIRS -name "*.la" ! -path "/usr/lib/ImageMagick*" \
  -exec mv -fv {} $OLD_LA_DIR \;
###############

# Fix any .pc files that may have .la references

STD_PC_PATH='/usr/lib/pkgconfig
             /usr/share/pkgconfig
             /usr/local/lib/pkgconfig
             /usr/local/share/pkgconfig'

# For each directory that can have .pc files
for d in $(echo $PKG_CONFIG_PATH | tr : ' ') $STD_PC_PATH; do

  # For each pc file
  for pc in $d/*.pc ; do
    if [ $pc == "$d/*.pc" ]; then continue; fi

    # Check each word in a line with a .la reference
    for word in $(grep '\.la' $pc); do
      if $(echo $word | grep -q '.la$' ); then
        mkdir -p $d/la-backup
        cp -fv  $pc $d/la-backup

        basename=$(basename $word )
        libref=$(echo $basename|sed -e 's/^lib/-l/' -e 's/\.la$//')

        # Fix the .pc file
        sed -i "s:$word:$libref:" $pc
      fi
    done
  done
done

EOF

chmod +x /usr/sbin/remove-la-files.sh

Notes utilisateur : https://wiki.linuxfromscratch.org/blfs/wiki/la-files