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

Fichiers avec une extension .la

Dans LFS, nous avons installé un paquet, libtool, qui est utilisé par de nombreux paquets pour pouvoir se construire sur différentes 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. À l'exécution le chargeur de programme peut demander les fichiers requis, ainsi que charger et exécuter correctement le programme.

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. Lors de la construction d'un paquet qui utilise libtool, le processus cherche automatiquement ces fichiers. Si un paquet est mis à jour et n'utilise plus de fichier .la, le processus de construction peut échouer.

La solution consiste à supprimer les fichiers .la, mais il y a un inconvénient. Certains paquets, comme ImageMagick-7.1.0-25, 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

Last updated on