Acerca dos arquivos de Arquivamento do Libtool (.la)

Arquivos com uma extensão .la

No LFS e no BLFS, muitos pacotes usam uma cópia da "libtool" enviada internamente para construir em uma variedade de plataformas Unix. Isso inclui plataformas como "AIX", "Solaris", "IRIX", "HP-UX" e "Cygwin", bem como Linux. As origens dessa ferramenta são bastante antigas. Ela era destinada gerenciar bibliotecas em sistemas com capacidades menos avançadas que um sistema Linux moderno.

Em um sistema Linux, os arquivos específicos da "libtool" geralmente são desnecessários. Normalmente as bibliotecas são especificadas no processo de construção durante a fase de ligação. Como um sistema Linux usa o Executable and Linkable Format (ELF) para executáveis e bibliotecas dinâmicas, as informações necessárias para concluir a tarefa são embutidas nos arquivos. Tanto o vinculador quanto o carregador de aplicativos podem consultar os arquivos apropriados e vincular ou executar o aplicativo adequadamente.

Bibliotecas estáticas raramente são usadas no LFS e no BLFS. E hoje em dia a maioria dos pacotes armazena as informações necessárias para vincular a uma biblioteca estática em um arquivo ".pc", em vez de depender da "libtool". Um comando pkg-config --static --libs gerará os sinalizadores suficientes para o vinculador para vincular-se a uma biblioteca estática sem qualquer mágica da "libtool".

O problema é que a "libtool" geralmente cria um ou mais arquivos de texto para bibliotecas de pacotes, chamados arquivamentos "libtool". Esses pequenos arquivos tem uma extensão ".la" e contém informações semelhantes àquelas embutidas nas bibliotecas ou nos arquivos "pkg-config". Ao construir um pacote que usa "libtool", o processo procura automaticamente por esses arquivos. Às vezes, um arquivo ".la" pode conter o nome ou caminho de uma biblioteca estática usada durante a construção, mas não instalada, então o processo de construção será interrompido porque o arquivo ".la" se refere a algo inexistente no sistema. Da mesma forma, se um pacote for atualizado e não mais usar o arquivo ".la", então o processo de construção poderá quebrar com os arquivos ".la" antigos.

A solução é a de remover os arquivos .la. No entanto, existe uma pegadinha. Alguns pacotes, tais como o ImageMagick-7.1.1-15, usam uma função do libtool, lt_dlopen, para carregar bibliotecas conforme necessárias durante a execução e resolver as dependências deles em tempo de execução. Nesse caso, os arquivos .la deveriam permanecer.

O script abaixo remove todos os arquivos .la desnecessários e os salva em um diretório, /var/local/la-files, por padrão, não no caminho normal de biblioteca. Ele também procura em todos os arquivos pkg-config (.pc) por referências embutidas a arquivos .la e os corrige para serem referências convencionais de biblioteca necessárias quando uma aplicação ou biblioteca for construída. Ele pode ser executado conforme necessário para limpar os diretórios que possivelmente estejam causando problemas.

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

# /usr/sbin/remove-la-files.sh
# Escrito para o Beyond Linux From Scratch
# por Bruce Dubbs <bdubbs@linuxfromscratch.org>

# Certifique-se de que estamos executando com privilégios de "root"
if test "${EUID}" -ne 0; then
    echo "Erro: $(basename ${0}) precisa ser executado como o(a) usuário(a) root! Saindo..."
    exit 1
fi

# Certifique-se de que PKG_CONFIG_PATH esteja definido se descartado pelo "sudo"
source /etc/profile

OLD_LA_DIR=/var/local/la-files

mkdir -p $OLD_LA_DIR

# Pesquise somente diretórios em /opt, mas não links simbólicos para diretórios
OPTDIRS=$(find /opt -mindepth 1 -maxdepth 1 -type d)

# Mova todos os arquivos ".la" encontrados para um diretório fora do caminho
find /usr/lib $OPTDIRS -name "*.la" ! -path "/usr/lib/ImageMagick*" \
  -exec mv -fv {} $OLD_LA_DIR \;
###############

# Corrija quaisquer arquivos ".pc" que possam ter referências ".la"

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

# Para cada diretório que pode conter arquivos ".pc"
for d in $(echo $PKG_CONFIG_PATH | tr : ' ') $STD_PC_PATH; do

  # Para cada arquivo "pc"
  for pc in $d/*.pc ; do
    if [ $pc == "$d/*.pc" ]; then continue; fi

    # Verifique cada palavra em uma linha com uma referência ".la"
    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$//')

        # Corrige o arquivo ".pc"
        sed -i "s:$word:$libref:" $pc
      fi
    done
  done
done

EOF

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