Как определить зависимости для пакета

Прежде чем создать PKGBUILD, я всегда проверяю необходимые библиотеки приложения с помощью утилиты ldd. Разработчики программного обеспечения часто пропускают необходимые пакеты из своих файлов README / INSTALL, а имена пакетов часто различаются между дистрибутивами. Некоторые пакеты могут потребоваться в одном дистрибутиве, но в других дистрибутивах они не нужны. Я нашел ldd бесценным для определения основного списка зависимостей пакетов.

Тем не менее, существует так много основных пакетов и других распространенных пакетов, которые кажутся ненужными для включения их в PKGBUILD. Сколько из этих библиотек безопасно исключить из списка зависимых? Например, почти все приложения gui будут перечислять те же библиотеки x11. Я лично не использовал Wayland, но я бы предположил, что если приложение было скомпилировано в системе wayland, то эти x11 libs будут заменены на wayland libs. Поэтому, вероятно, не имеет смысла включать x11 или wayland libs в качестве зависимостей.

Примеры: libx11, libxau, libxcb, libxdamage, libxdmcp, libxext, libxfixes, libxshmfence, libxxf86vm

Сколько библиотек, перечисленных в ldd, действительно имеет отношение к PKGBUILD? Я вижу libdrm и libgl для почти каждого приложения. Что делать, если пользователь использует xrender вместо GL? Что делать, если libdrm не установлен и пользователь не хочет его устанавливать?

Существуют ли какие-либо базовые пакеты, которые должны быть указаны как зависимости? Приложение может не работать без zlib, systemd или glibc, но я бы предположил, что эти пакеты присутствуют почти в каждой системе. Кажется излишним включать эти пакеты в зависимости.

Если вы успешно скомпилировали приложение в своей системе, и вы не уверены, указали ли вы все зависимости, что лучший способ определить полный список зависимостей пакетов?


Чтобы проиллюстрировать мои вопросы, я собрал этот сценарий bash. Он обнаружит все необходимые библиотеки для любого заданного двоичного файла. Затем он разрешит их имена пакетов. Он требует readlink, ldd, pkgfile и сортировки.

Использование: getdepends -i / usr / bin / ark -f -e

-f будет форматировать вывод для вставки непосредственно в PKGBUILD. -e пропустит базовые пакеты (может не работать во всех дистрибутивах на основе арки).

#!/bin/bash usage() { echo "Usage: $0 [-i <input file path>] [-f <format output for PKGBUILD>] [-e <exclude core packages>]" 1>&2; exit 0; } while getopts ":i:fe" o; do case "${o}" in i) i=${OPTARG} INPATH=$(readlink -mn "$i") ;; f) FMT=1 ;; e) EXC=1 ;; *) usage ;; esac done shift $((OPTIND-1)) if [ ! -e "$INPATH" ]; then echo "The specified input path does not exist." usage fi LIBS=$(ldd "$INPATH" | sort) TAB=$'\t' IFS=$'\n' PKGS=() for l in $LIBS; do # strip all characters from ldd output up to "=> " l="${l#*=> }" # strip all characters from ldd output from " (" to end of string l="${l% (*}" # continue if library path doesn't exist if [ ! -e "$l" ]; then continue; fi # get name of package that contains library file path PKG=$(pkgfile -ri "$l") # continue if no package found if [ -z "$PKG" ]; then continue; fi # exclude option detected. skip core packages. if [ ! -z "$EXC" ] && [[ "${PKG}" =~ ^core/ ]]; then continue; fi # strip all characters up to leading slash (ie, core/readline) PKG="${PKG#*/}" # strip all characters following a new line. this may occur # if the same file and path are found in multiple packages. # since there's no way of determining which package the app # requires when there are duplicates of the same file we just # take the first package listed. PKG=${PKG%%"$IFS"*} if [ ! -z "$FMT" ]; then # format option detected. add tabs and single quotes. PKGS+=("$TAB'${PKG}'") else # do not format output PKGS+=("${PKG}") fi done # sort az and remove duplicates PKGSORT=($(sort -u <<< "${PKGS[*]}")) if [ ! -z "$FMT" ]; then # format option detected. declare depends array. echo "depends=(" fi printf '%s\n' "${PKGSORT[@]}" if [ ! -z "$FMT" ]; then # format option detected. close depends array. echo -n ")" fi unset IFS 

Если бы вы запустили этот скрипт в двоичном коде ark, вы заметили бы, что отображено довольно много пакетов, которые не включены в арку PKGBUILD. Итак, как кто-то определяет, какие пакеты включать в качестве зависимостей?

ковчег PKGBUILD

    Interesting Posts
    Linux и Unix - лучшая ОС в мире.