Antes de criar um PKGBUILD eu sempre dou uma olhada nas bibliotecas necessárias de um aplicativo com o utilitário ldd. Os desenvolvedores de software freqüentemente omitem os pacotes necessários de seus arquivos README / INSTALL e os nomes de pacotes freqüentemente diferem entre distribuições. Alguns pacotes podem ser necessários em uma distribuição enquanto são desnecessários em outras distribuições. Eu achei o ldd inestimável para determinar a lista essencial de dependências de pacotes.
No entanto, existem tantos pacotes principais e outros pacotes comuns exibidos que parece desnecessário incluí-los todos em um PKGBUILD. Quantas dessas bibliotecas são seguras para excluir da lista de dependências? Por exemplo, quase todos os aplicativos gui listarão as mesmas bibliotecas x11. Eu pessoalmente não usei o Wayland, mas eu diria que se um aplicativo fosse compilado em um sistema de rotas, as bibliotecas do x11 seriam substituídas por bibliotecas do wayland. Então, provavelmente não faria sentido incluir bibliotecas x11 ou wayland como dependências.
Exemplos: libx11, libxau, libxcb, libxdamage, libxdmcp, libxext, libxfixes, libxshmfence, libxxf86vm
Quantas bibliotecas listadas pelo ldd são realmente relevantes para um PKGBUILD? Eu vejo libdrm e libgl listados para quase todas as aplicações. E se um usuário estiver usando xrender em vez de GL? E se a libdrm não estiver instalada e o usuário não a quiser instalar?
Existem alguns pacotes principais que devem ser listados como dependências? O aplicativo pode não ser capaz de executar sem zlib, systemd ou glibc, mas eu diria que esses pacotes estão presentes em quase todos os sistemas. Parece redundante incluir esses pacotes como dependências.
Se você tiver compilado com sucesso um aplicativo em seu sistema e não tiver certeza se listou todas as dependências, qual é a melhor maneira de determinar a lista completa de dependências de pacotes?
Para ajudar a ilustrar minhas perguntas, eu reuni este script bash. Ele detectará todas as bibliotecas necessárias para qualquer arquivo binário. Em seguida, ele os resolverá para nomes de pacotes. Requer readlink, ldd, pkgfile e sort.
Uso: getdepends -i / usr / bin / arca -f -e
O -f formata a saída para colar diretamente em um PKGBUILD. O -e irá ignorar os pacotes principais (pode não funcionar em todas as distribuições baseadas em arco).
#!/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
Se você executasse esse script no binário da arca, perceberia que há alguns pacotes exibidos que não estão incluídos no PKGBUILD. Então, como alguém determina quais pacotes incluir como dependências?