À porpos 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 une variété de plateformes Unix. Cela comprend des plateformes comm AIX, Solaris, IRIX, HP-UX et Cygwin ainsi que Linux. Les origines de cet outil sont assez anciennes. Il devait gérer les bibliothèques sur les systèmes avec des 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. Normalement les bibliothèques sont spécifiées dans le processus de construction pendant l'édition de lien. 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 appropriés, 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 contient 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 est de supprimer les fichiers .la. Cependant il y a un hic. Certains paquets, comme ImageMagick-7.0.9-23 utilisent une fonction de libtool, lt_dlopen, pour charger les bibliothèques requises pendant l'exécution et résoudre les dépendances à l'exécution. Dans ce cas, les fichiers .la devraient rester présents.

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 des bibliothèques normal. Il recherche aussi les références à des fichiers .la incluses dans les fichiers pkg-config (.pc) et les corrige en références de bibliothèques conventionnelles, ce qui est nécessaire lors de la construction d'une application ou d'une bibliothèque. Il peut être lancé au besoin pour nettoyer les répertoires qui peuvent causer 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 : http://wiki.linuxfromscratch.org/blfs/wiki/la-files

Last updated on 2017-12-23 16:56:03 +0100