Как определить папку значения по умолчанию Мультидуги хоста

Я хочу сделать make-файл, который устанавливает библиотеку в папке мультидуги значения по умолчанию хоста, как /usr/lib/x86_64-linux-gnu и /usr/lib/i386-linux-gnu/ и /usr/lib/arm-linux-gnueabihf.

Но без использования dpkg-architecture и debhelper поскольку они не всегда присутствуют на устройстве хоста.

Только использование gcc и make.

Я уже нашел /etc/ld.so.conf.d папка. Я мог проанализировать *.conf файлы оттуда, но действительно ли это - корректный подход? Папка мультидуги всегда будет там?

Другой метод I, хотя анализирует содержание ldconfig -v | grep /usr/lib/ и получая первый результат (удаляющий двоеточие).

Существует ли более легкий способ сделать это?

3
задан 16 January 2017 в 11:18

2 ответа

Я отправлю сценарии для методов, которые я нашел. Но если существует другой путь по умолчанию, отправьте его.

Используя ldconfig:

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

я предполагаю, что это может возвратить другую папку, если кто-то конфигурирует другой поисковый порядок, например, добавляющий другую папку перед папкой мультидуги хоста по умолчанию.

Используя /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

Это возвратит первую папку под /usr/lib, который прибывает после строки с *Multiarch*.

Оба сценария, протестированные на armv7 и x86_64 (стандартные установки, никакая внешняя архитектура) и возврат ожидаемых результатов.

Не протестированный в полях с внешней установленной архитектурой.

1
ответ дан 1 December 2019 в 16:56

Я следовал dpkg-architecture, который является просто сценарием 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

Одна вещь, которая может быть недостатком, в i386 установке gcc -dumpmachine сообщает i686-linux-gnu. Он будет работать нормально, потому что /usr/lib/i686-linux-gnu находится в списке ldconfig слишком, как /usr/lib/i386-linux-gnu; Однако папка, созданная по умолчанию в Ubuntu: /usr/lib/i386-linux-gnu.

1
ответ дан 1 December 2019 в 16:56

Другие вопросы по тегам:

Похожие вопросы: