web-dev-qa-db-fra.com

Comment déterminer le dossier par défaut Host Multi-Arch

Je veux créer un makefile qui installe une bibliothèque dans le dossier multi-Arch par défaut de l'hôte, comme /usr/lib/x86_64-linux-gnu et /usr/lib/i386-linux-gnu/ et /usr/lib/arm-linux-gnueabihf.

Mais sans utiliser dpkg-architecture et debhelper car ils ne sont pas toujours présents sur le périphérique hôte.

Utiliser uniquement gcc et make.

J'ai déjà trouvé le /etc/ld.so.conf.d dossier. Je pourrais analyser les fichiers * .conf à partir de là, mais est-ce une approche correcte? Le dossier multi-Arch sera toujours là?

Une autre méthode que j'ai bien analysée est le contenu de ldconfig -v | grep /usr/lib/ et obtenir le premier résultat (suppression du collon).

Existe-t-il un moyen plus simple de procéder?

3
Bernardo Ramos

Je publierai les scripts des méthodes que j'ai trouvées. Mais s'il existe un autre moyen par défaut, veuillez le poster.

Utilisation de ldconfig:

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

Je suppose qu'il peut retourner un autre dossier si quelqu'un configure un autre ordre de recherche, par exemple. en ajoutant un autre dossier avant le dossier multiarchives par défaut de l'hôte.

En utilisant le /etc/ld.so.conf.d dossier:

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

Il renverra le premier dossier sous /usr/lib qui vient après la ligne avec *Multiarch*.

Les deux scripts ont testé sur armv7 et x86_64 (installations par défaut, pas d'architectures étrangères) et ont renvoyé les résultats attendus.

Non testé dans des boîtiers avec une architecture étrangère installée.

1
Bernardo Ramos

J'ai suivi dpkg-architecture qui n'est qu'un 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

Une chose qui pourrait être un inconvénient, dans i386 installation gcc -dumpmachine rapports i686-linux-gnu. Cela fonctionnera bien parce que /usr/lib/i686-linux-gnu est dans ldconfig liste trop identique à /usr/lib/i386-linux-gnu; Cependant, le dossier créé par défaut par Ubuntu est /usr/lib/i386-linux-gnu.

1
user.dz