Como determinar a pasta padrão do Multi-Arch do host

3

Eu quero fazer um makefile que instale uma biblioteca na pasta multi-arch padrão do host, como /usr/lib/x86_64-linux-gnu e /usr/lib/i386-linux-gnu/ e /usr/lib/arm-linux-gnueabihf .

Mas sem usar dpkg-architecture e debhelper , pois nem sempre estão presentes no dispositivo host.

Usando apenas gcc e make .

Eu já encontrei a pasta /etc/ld.so.conf.d . Eu poderia analisar os arquivos * .conf de lá, mas esta é uma abordagem correta? A pasta multi-arch sempre estará lá?

Outro método é analisar o conteúdo de ldconfig -v | grep /usr/lib/ e obter o primeiro resultado (removendo o collon).

Existe uma maneira mais fácil de fazer isso?

    
por Bernardo Ramos 16.01.2017 / 08:43

2 respostas

1

Vou postar os scripts para os métodos que encontrei. Mas se houver outra maneira padrão, poste-a.

Usando o ldconfig:

ldconfig -v 2>>/dev/null | grep /usr/lib* | head --lines=1 | sed -e 's/://'

Eu acho que ele pode retornar outra pasta se alguém configurar outra ordem de pesquisa, por exemplo. adicionando outra pasta antes da pasta multiarch do host padrão.

Usando a pasta /etc/ld.so.conf.d :

lines=$(cat /etc/ld.so.conf.d/* 2>>/dev/null)
for line in $lines ; do
    case "$line" in
    *Multiarch*)
        found_multiarch=1
        ;;
    /usr/lib/*)
        if [ "$found_multiarch" = 1 ] ; then
            folder=$line
            break
        fi
        ;;
    esac
done
echo $folder

Ele retornará a primeira pasta em /usr/lib que vem depois da linha com *Multiarch* .

Ambos os scripts foram testados em armv7 e x86_64 (instalações padrão, sem arquiteturas estrangeiras) e retornando os resultados esperados.

Não testado em caixas com arquitetura estrangeira instalada.

    
por Bernardo Ramos 16.01.2017 / 10:45
1

Eu segui dpkg-architecture , que é apenas um script Perl:

$ which dpkg-architecture 
/usr/bin/dpkg-architecture

$ file /usr/bin/dpkg-architecture
/usr/bin/dpkg-architecture: a /usr/bin/perl script, UTF-8 Unicode text executable

$ more /usr/bin/dpkg-architecture
use Dpkg::Arch qw(get_raw_build_arch get_raw_host_arch get_host_gnu_type
                  debarch_to_cpuattrs
                  get_valid_arches debarch_eq debarch_is debarch_to_debtriplet
                  debarch_to_gnutriplet gnutriplet_to_debarch
                  debarch_to_multiarch);

$ man Dpkg::Arch

$ locate "Dpkg/Arch"
/usr/share/perl5/Dpkg/Arch.pm

$ more /usr/share/perl5/Dpkg/Arch.pm

## this may fails if multi-arch is not supported
$ dpkg --print-architecture
amd64

## it seems this what are you looking for
$ gcc -dumpmachine
x86_64-linux-gnu

Uma coisa que poderia ser uma desvantagem, em i386 installation gcc -dumpmachine reports i686-linux-gnu . Ele funcionará bem, porque /usr/lib/i686-linux-gnu está em ldconfig listando o mesmo que /usr/lib/i386-linux-gnu ; No entanto, a pasta criada por padrão pelo Ubuntu é /usr/lib/i386-linux-gnu .

    
por user.dz 17.01.2017 / 09:18