PKGBUILD を作成する前に、必ず ldd ユーティリティを使用して、アプリケーションに必要なライブラリを再確認してください。ソフトウェア開発者はreadme /インストールファイルから必要なパッケージを省略することが多く、パッケージ名はディストリビューションによって異なります。一部のパッケージは、あるディストリビューションでは必要な場合がありますが、別のディストリビューションでは必要ない場合があります。私はlddがパッケージの依存関係の基本的なリストを決定するのに非常に便利だと思います。
しかし、コアパッケージと他の共通パッケージが多すぎるため、PKGBUILDの両方に含める必要はありません。依存関係リストから安全に除外できるライブラリはいくつですか?たとえば、ほぼすべてのGUIアプリケーションは、同じx11ライブラリを一覧表示します。私は個人的にWaylandを使用していませんが、アプリケーションがWaylandシステムでコンパイルされると、これらのx11ライブラリがWaylandライブラリに置き換えられると仮定します。したがって、x11またはwaylandライブラリを依存関係として含めることは意味がないかもしれません。
例: libx11, libxau, libxcb, libxdamage, libxdmcp, libxext, libxfixes, libxshmfence, libxxf86vm
lddにリストされているライブラリのうち、実際にPKGBUILDに関連するライブラリはいくつですか? libdrmとlibglがリストされているほとんどすべてのアプリケーションを見ることができます。ユーザーがGLの代わりにxrenderを使用するとどうなりますか? libdrmがインストールされておらず、ユーザーがインストールしたくない場合はどうなりますか?
依存関係としてリストする必要があるコアパッケージはありますか?アプリケーションは zlib、systemd、または glibc なしでは実行できませんが、これらのパッケージはほとんどすべてのシステムに存在すると仮定します。これらのパッケージを依存関係として含めることは重複しているようです。
システムでアプリケーションを正常にコンパイルしたが、すべての依存関係がリストされているかどうかわからない場合は、パッケージの依存関係の完全なリストを確認するための最良の方法は何ですか?
私の問題を説明するのに役立つように、このbashスクリプトを設定しました。特定のバイナリに必要なすべてのライブラリを検出します。次に、それをパッケージ名で解決します。 readlink、ldd、pkgfile、および sort が必要です。
使用法: getdependents -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 (i.e., 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 a-z 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に含まれていないことがわかります。それでは、依存関係として含めるパッケージをどのように決定しますか?