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에 포함되어 있지 않다는 것을 알 수 있습니다. 그렇다면 종속성으로 포함할 패키지를 어떻게 결정합니까?