Newer
Older
# script to build apk packages (light version of makepkg)
# Copyright (c) 2008 Natanael Copa <natanael.copa@gmail.com>
#
# Distributed under GPL-2
#
# Depends on: busybox utilities, fakeroot,
#
abuild_ver=@VERSION@
sysconfdir=@sysconfdir@
abuildrepo_base=@abuildrepo@
abuild_path=$(readlink -f $0)
BUILD_BASE="build-base"
FAKEROOT=${FAKEROOT:-"fakeroot"}
: ${SUDO_APK:=abuild-apk}
: ${APK:=apk}
: ${ADDUSER:=abuild-adduser}
: ${ADDGROUP:=abuild-addgroup}
apk_opt_wait="--wait 30"
ABUILD_CONF=${ABUILD_CONF:-"$sysconfdir/abuild.conf"}
default_colors() {
NORMAL="\033[1;0m"
STRONG="\033[1;1m"
RED="\033[1;31m"
GREEN="\033[1;32m"
YELLOW="\033[1;33m"
BLUE="\033[1;34m"
}
monochrome() {
NORMAL=""
STRONG=""
RED=""
GREEN=""
YELLOW=""
BLUE=""
}
#colors
if [ -n "$USE_COLORS" ]; then
default_colors
local prompt="$GREEN>>>${NORMAL}"
local fake="${FAKEROOTKEY:+${BLUE}*${NORMAL}}"
local name="${STRONG}${subpkgname:-$pkgname}${NORMAL}"
printf "${prompt} ${name}${fake}: %s\n" "$1" >&2
}
msg2() {
[ -n "$quiet" ] && return 0
# ">>> %s"
printf " %s\n" "$1" >&2
}
warning() {
local prompt="${YELLOW}>>> WARNING:${NORMAL}"
local fake="${FAKEROOTKEY:+${BLUE}*${NORMAL}}"
local name="${STRONG}${subpkgname:-$pkgname}${NORMAL}"
printf "${prompt} ${name}${fake}: %s\n" "$1" >&2
}
warning2() {
# ">>> WARNING:
printf " %s\n" "$1" >&2
}
error() {
local prompt="${RED}>>> ERROR:${NORMAL}"
local fake="${FAKEROOTKEY:+${BLUE}*${NORMAL}}"
local name="${STRONG}${subpkgname:-$pkgname}${NORMAL}"
printf "${prompt} ${name}${fake}: %s\n" "$1" >&2
}
error2() {
# ">>> ERROR:
printf " %s\n" "$1" >&2
if [ "$TERM" = xterm ] && [ -n "$USE_COLORS" ]; then
if [ -z "$install_after" ] && [ -n "$uninstall_after" ]; then
msg "Uninstalling dependencies..."
$SUDO_APK del --quiet $apk_opt_wait $uninstall_after
if [ -n "$CLEANUP_FILES" ]; then
rm -f $CLEANUP_FILES
fi
# check if apkbuild is basicly sane
msg "Checking sanity of $APKBUILD..."
[ -z "$pkgname" ] && die "Missing pkgname in APKBUILD"
[ -z "${pkgname##* *}" ] && die "pkgname contains spaces"
[ -z "$pkgver" ] && die "Missing pkgver in APKBUILD"
if [ "$pkgver" != "volatile" ] && [ -z "$nodeps" ]; then
$APK version --check -q "$pkgver" ||\
die "$pkgver is not a valid version"
fi
[ -z "$pkgrel" ] && die "Missing pkgrel in APKBUILD"
[ -z "$pkgdesc" ] && die "Missing pkgdesc in APKBUILD"
[ -z "$url" ] && die "Missing url in APKBUILD"
[ -z "$license" ] && die "Missing license in APKBULID"
if [ -n "$replaces_priority" ] \
&& ! echo $replaces_priority | egrep -q '^[0-9]+$'; then
die "replaces_priority must be a number"
fi
# check so no package names starts with -
for i in $pkgname $subpackages; do
case $i in
-*) die "${i%:*} is not a valid package name";;
esac
done
# check if CARCH, CBUILD, CHOST and CTARGET is set
if [ -z "$CARCH" ]; then
case "$(uname -m)" in
i[0-9]86) suggestion=" (Suggestion: CARCH=x86)";;
x86_64) suggestion=" (Suggestion: CARCH=x86_64)";;
esac
die "Please set CARCH in /etc/abuild.conf$suggestion"
fi
[ -z "$CHOST" ] && die "Please set CHOST in /etc/abuild.conf"
case "$suff" in
pre-install|post-install|pre-upgrade|post-upgrade|pre-deinstall|post-deinstall);;
*) die "$i: unknown install script suffix"
esac
if ! subpackages_has "$n" && [ "$n" != "$pkgname" ]; then
die "$i: install script does not match pkgname or any subpackage"
[ -e "$startdir/$i" ] || die "install script $i is missing"
for j in chown chmod chgrp; do
if grep -q $j "$startdir"/$i; then
warning "$i: found $j"
warning2 "Permissions should be fixed in APKBUILD package()"
fi
done
for i in $triggers; do
local f=${i%=*}
local p=${f%.trigger}
[ "$f" = "$i" ] && die "$f: triggers must contain '='"
[ "$p" = "$f" ] && die "$f: triggers scripts must have .trigger suffix"
if ! subpackages_has "$p" && [ "$p" != "$pkgname" ]; then
die "$p: trigger script does not match pkgname or any subpackage"
fi
[ -e "$startdir"/$f ] || die "trigger script $f is missing"
done
if [ -n "$source" ]; then
for i in $source; do
if install_has "$i"; then
warning "You should not have \$install in source"
continue
fi
md5sums_has ${i##*/} || die "${i##*/} is missing in md5sums"
https://*) makedepends_has wget && warning "wget no longer need to be in makedepends when source has https://" ;;
done
fi
if [ -n "$md5sums" ]; then
for i in $(echo "$md5sums" | awk '{ print $2 }'); do
source_has $i || die "$i exists in md5sums but is missing in source"
done
fi
# common spelling errors
[ -n "$depend" ] && die "APKBUILD contains 'depend'. It should be depends"
[ -n "$makedepend" ] && die "APKBUILD contains 'makedepend'. It should be makedepends"
grep '^# Maintainer:' $APKBUILD >/dev/null || warning "No maintainer"
makedepends_has 'g++' && warning "g++ should not be in makedepends"
sanitycheck() {
default_sanitycheck
}
local dummy f endreturnval originalparams origin file
if [ -z "$source" ]; then
return 0
fi
if [ -z "$md5sums" ]; then
die "Use 'abuild checksum' to generate/update the checksum(s)"
if [ "$(echo $source | wc -l)" -ne "$(echo $md5sums | wc -l)" ]; then
die "Number of md5sums does not correspond to number of sources"
fi
msg "Checking md5sums..."
IFS=$'\n'
endreturnval=0
originalparams=$@
set -- $source
for src in $md5sums; do
origin=$1; shift
echo "$src" | md5sum -c
if [ $? -ne 0 ]; then
is_remote $origin || continue
echo "Because the remote file above failed the md5sum check it will be deleted."
echo "Rebuilding will cause it to re-download which in some cases may fix the problem."
file=`echo "$src" | sed 's/.*[ \t\n]\(.*\)/\1/'`
echo "Deleting: $file"
rm $file
fi
done
unset IFS
set -- $originalparams
return $endreturnval
# verify upstream sources
sourcecheck() {
local uri
for uri in $source; do
is_remote $uri || continue
case "$uri" in
saveas-*://*)
uri=${uri#saveas-}
uri=${uri%/*}
;;
esac
wget -q -s "$uri" || return 1
# convert curl options to wget options and call wget instead of curl
wget_fallback() {
local wget_opts= outfile= opt=
case $opt in
'L') ;; # --location. wget does this by default
'f') ;; # --fail. wget does this by default
'C') wget_opts="$wget_opts -c";; # --continue-at
's') wget_opts="$wget_opts -q";; # --silent
'o') wget_opts="$wget_opts -O $OPTARG";; # --output
'k') wget_opts="$wget_opts --no-check-certificate";; #gnu wget
esac
done
shift $(( $OPTIND - 1 ))
wget $wget_opts "$1"
}
local d="${uri##*/}" # $(basename $uri)
local opts
[ -n "$quiet" ] && opts="-s"
local lockfile="$SRCDEST/$d".lock
# fix saveas-*://* URIs
case "$uri" in
# remove 'saveas-' from beginning and
# '/filename' from end of URI
saveas-*://*) uri="${uri:7:$(expr ${#uri} - 7 - ${#d} - 1)}";;
https://*) opts="-k";;
CLEANUP_FILES="$CLEANUP_FILES $lockfile"
(
flock -n -x 9 || msg "Waiting for ${lockfile##*/}..."
flock -x 9
[ -f "$SRCDEST/$d" ] && exit 0 # use exit since its a subshell
if [ -f "$SRCDEST/$d.part" ]; then
msg "Partial download found. Trying to resume"
opts="$opts -C -"
# fallback to wget if curl is missing. useful for bootstrapping
if ! [ -x "$(which curl)" ]; then
fetcher=wget_fallback
opts="$opts -L -f -k"
fi
$fetcher $opts -o "$SRCDEST/$d.part" "$uri" \
&& mv "$SRCDEST/$d.part" "$SRCDEST/$d"
local rc=$?
rm -f "$lockfile"
return $rc
is_remote() {
case "$1" in
http://*|ftp://*|https://*|saveas-*://*)
return 0;;
esac
return 1
}
# try download from file from mirror first
uri_fetch_mirror() {
local uri="$1"
local d="${uri##*/}" # $(basename $uri)
if [ -n "$DISTFILES_MIRROR" ]; then
if is_remote "$DISTFILES_MIRROR"; then
uri_fetch "$DISTFILES_MIRROR"/$d && return 0
else
cp "$DISTFILES_MIRROR"/$d "$SRCDEST" && return 0
fi
fi
uri_fetch "$uri"
}
default_fetch() {
for s in $source; do
if is_remote "$s"; then
uri_fetch_mirror "$s" || return 1
ln -sf "$SRCDEST/${s##*/}" "$srcdir"/
else
ln -sf "$startdir/$s" "$srcdir/"
fi
fetch() {
default_fetch
}
# verify that all init.d scripts are openrc runscripts
initdcheck() {
local i
for i in $source; do
case $i in
*.initd)
head -n 1 "$srcdir"/$i | grep -q '/sbin/runscript' \
&& continue
error "$i is not an openrc #!/sbin/runscript"
return 1
;;
esac
done
}
default_unpack() {
if [ -z "$force" ]; then
md5check || return 1
mkdir -p "$srcdir"
for u in $source; do
local s="$SRCDEST/${u##*/}" # $(basename $s)
case "$s" in
*.tar)
msg "Unpacking $s..."
tar -C "$srcdir" -xf "$s" || return 1;;
*.tar.lzma)
msg "Unpacking $s..."
unlzma -c "$s" | tar -C "$srcdir" -x \
|| return 1;;
*.tar.xz)
msg "Unpacking $s..."
unxz -c "$s" | tar -C "$srcdir" -x || return 1;;
*.zip)
msg "Unpacking $s..."
unzip "$s" -d "$srcdir" || return 1;;
unpack() {
default_unpack
}
msg "Cleaning temporary build dirs..."
}
# cleanup fetched sources
cleancache() {
local s
for s in $source; do
if is_remote "$s"; then
msg "Cleaning downloaded ${s##*/}..."
rm -f "$SRCDEST/${s##*/}"
fi
listpkgnames() {
local i
for i in $pkgname $subpackages; do
echo ${i%:*}
done
for i in $linguas; do
echo $pkgname-lang-$i
done
}
getpkgver || return 1
msg "Cleaning built packages..."
local p="${i%:*}-$pkgver-r$pkgrel"
rm -f "$PKGDEST/$p.apk" "$PKGDEST/$p.src.tar.gz" \
"$abuildrepo"/$p.apk "$abuildrepo"/*/$p.apk
# remove given packages from index
# clean all packages except current
cleanoldpkg() {
local i j
getpkgver || return 1
msg "Cleaning all packages except $pkgver-r$pkgrel..."
local pn=${i%:*}
for j in "$PKGDEST"/$pn-[0-9]*.apk ; do
[ "$j" = "$PKGDEST/$pn-$pkgver-r$pkgrel.apk" ] \
&& continue
rm -f "$j" "$abuildrepo"/*/${j##*/}
done
done
return 0
}
for i in $pkggroups; do
if ! getent group $i >/dev/null; then
msg "Creating group $i"
$ADDGROUP -S $i || return 1
fi
done
for i in $pkgusers; do
if ! getent passwd $i >/dev/null; then
if getent group $i >/dev/null; then
gopt="-G $i"
fi
$ADDUSER -S -D -H $gopt $i || return 1
[ -n "$DEBUG" ] && msg "$part"
$part || die "$part failed"
}
# override those in your build script
getpkgver() {
# this func is supposed to be overridden by volatile packages
if [ "$pkgver" = "volatile" ]; then
error "Please provide a getpkgver() function in your APKBUILD"
return 1
fi
}
# generate a simple tar.gz package of pkgdir
targz() {
cd "$pkgdir" || return 1
tar -czf "$PKGDEST"/$pkgname-$pkgver-r$pkgrel.tar.gz *
}
get_split_func() {
# get the 'func' from "sub-pkg:func"
local func=${1##*:}
# get 'func' from "sub-pkg-func" if there was no :func
[ "$func" = "$1" ] && func=${func##*-}
echo $func
}
postcheck() {
local dir="$1" name="$2" i=
msg "Running postcheck for $name"
if ! options_has "!fhs"; then
for i in "$dir"/srv/* "$dir"/usr/local/* "$dir"/opt/*; do
if [ -e "$i" ]; then
error "Packages must not put anything under /srv, /usr/local or /opt"
return 1
fi
done
fi
# look for *.la files
i=$(find "$dir" -name '*.la' | sed "s|^$dir|\t|")
if [ -n "$i" ] && ! options_has "libtool"; then
error "Libtool archives (*.la) files found and \$options has no 'libtool' flag:"
echo "$i"
return 1
fi
# check directory permissions
i=$(find "$dir" -type d -perm -777 | sed "s|^$dir|\t|")
if [ -n "$i" ]; then
warning "World writeable directories found:"
echo "$i"
fi
# check so we dont have any suid root binaries that are not
i=$(find "$dir" -type f -perm +6000 \
| xargs scanelf --nobanner --etype ET_EXEC \
| sed "s|ET_EXEC $dir|\t|")
if [ -n "$i" ]; then
error "Found non-PIE files that has SUID:"
echo "$i"
return 1
fi
Natanael Copa
committed
prepare_subpackages() {
local func=$(get_split_func $i)
# call abuild recursively, setting subpkg{dir,name}
msg "Running split function $func..."
local dir="$pkgbasedir/${i%:*}" name="${i%:*}"
subpkgdir="$dir" subpkgname="$name" \
Natanael Copa
committed
$0 $func prepare_package || return 1
postcheck "$dir" "$name" || return 1
postcheck "$pkgdir" "$pkgname" || return 1
# post check for /usr/share/locale
if [ -d "$pkgdir"/usr/share/locale ]; then
warning "Found /usr/share/locale"
warning2 "Maybe add \$pkgname-lang to subpackages?"
pkgdesc="Languages for package $pkgname"
install_if="$pkgname=$pkgver-r$pkgrel lang"
arch="noarch"
local dir
for dir in ${langdir:-/usr/share/locale}; do
mkdir -p "$subpkgdir"/${dir%/*}
mv "$pkgdir"/"$dir" "$subpkgdir"/"$dir" || return 1
done
}
lang() {
default_lang
}
default_lang_subpkg() {
if [ -z "$lang" ]; then
error "lang is not set"
return 1
fi
pkgdesc="$pkgname language pack for $lang"
arch="noarch"
install_if="$pkgname=$pkgver-r$pkgrel lang-$lang"
local dir
for dir in ${langdir:-/usr/share/locale}; do
mkdir -p "$subpkgdir"/$dir
mv "$pkgdir"/$dir/$lang* \
"$subpkgdir"/$dir/ \
done
}
lang_subpkg() {
default_lang_subpkg
}
prepare_language_packs() {
for lang in $linguas; do
lang="$lang" \
subpkgname="$pkgname-lang-$lang" \
subpkgdir="$pkgbasedir"/$subpkgname \
$0 lang_subpkg prepare_package || return 1
done
}
# echo '-dirty' if git is not clean
git_dirty() {
if [ $(git status -s "$startdir" | wc -l) -ne 0 ]; then
echo "-dirty"
fi
}
# echo last commit hash id
git_last_commit() {
git log --format=oneline -n 1 "$startdir" | awk '{print $1}'
}
get_maintainer() {
if [ -z "$maintainer" ]; then
maintainer=$(awk -F': ' '/\# *Maintainer/ {print $2}' "$APKBUILD")
fi
}
Natanael Copa
committed
prepare_metafiles() {
getpkgver || return 1
local name=${subpkgname:-$pkgname}
[ -z "${name##* *}" ] && die "package name contains spaces"
local pkg="$name-$pkgver-r$pkgrel.apk"
local pkginfo="$controldir"/.PKGINFO
[ ! -d "$dir" ] && die "Missing $dir"
cd "$dir"
local builddate=$(date -u "+%s")
local size=$(du -sk | awk '{print $1 * 1024}')
# we need to wait with setting noarch til our build infra can handle it
# if [ "$arch" = "noarch" ]; then
# parch="noarch"
# fi
echo "# Generated by $(basename $0) $abuild_ver" >"$pkginfo"
echo "# using $($FAKEROOT -v)" >> "$pkginfo"
echo "# $(date -u)" >> "$pkginfo"
cat >> "$pkginfo" <<EOF
pkgdesc = $pkgdesc
url = $url
builddate = $builddate
packager = ${PACKAGER:-"Unknown"}
size = $size
local i deps
deps="$depends"
if [ "$pkgname" != "busybox" ] && ! depends_has busbox; then
for i in $install $triggers; do
local s=${i%=*}
[ "$name" != "${s%.*}" ] && continue
if head -n 1 "$startdir/$s" | grep '^#!/bin/sh' >/dev/null ; then
msg "Script found. busybox added as a dependency for $pkg"
deps="$deps busybox"
break
fi
done
local last_commit="$(git_last_commit)$(git_dirty)"
if [ -n "$last_commit" ]; then
echo "commit = $last_commit" >> "$pkginfo"
fi
get_maintainer
if [ -n "$maintainer" ]; then
echo "maintainer = $maintainer" >> "$pkginfo"
fi
if [ -n "$replaces_priority" ]; then
echo "replaces_priority = $replaces_priority" >> "$pkginfo"
echo "license = $i" >> "$pkginfo"
echo "replaces = $i" >> "$pkginfo"
for i in $deps; do
echo "depend = $i" >> "$pkginfo"
echo "conflict = $i" >> "$pkginfo"
echo "provides = $i" >> "$pkginfo"
for i in $triggers; do
local f=${i%=*}
local dirs=${i#*=}
[ "${f%.trigger}" != "$name" ] && continue
echo "triggers = ${dirs//:/ }" >> "$pkginfo"
done
if [ -n "$install_if" ]; then
echo "install_if = $(echo $install_if)" >> "$pkginfo"
fi
for i in $install $triggers; do
local f=${i%=*}
local n=${f%.*}
if [ "$n" != "$name" ]; then
cp "$startdir/$f" "$controldir/$script" || return 1
chmod +x "$controldir/$script"
metafiles="$metafiles $script"
done
echo $metafiles | tr ' ' '\n' > "$controldir"/.metafiles
prepare_tracedeps() {
local dir=${subpkgdir:-$pkgdir}
local etype= soname= file= sover=
[ "$arch" = "noarch" ] && return 0
options_has "!tracedeps" && return 0
# lets tell all the places we should look for .so files - all rpaths
scanelf --quiet --recursive --rpath "$dir" \
| sed -e 's/[[:space:]].*//' -e 's/:/\n/' | sort -u \
if grep -q -x '/usr/lib' "$controldir"/.rpaths; then
warning "Redundat /usr/lib in rpath found"
fi
if grep '^/home/' "$controldir"/.rpaths; then
error "Has /home/... in rpath"
return 1
fi
# check if dir has arch specific binaries
dir_has_arch_binaries() {
local dir="$1"
# if scanelf returns something, then we have binaries
[ -n "$(scanelf -R "$dir" | head -n 1)" ] && return 0
# look for static *.a
[ -n "$(find "$dir" -type f -name '*.a' | head -n 1)" ] && return 0
return 1
}
# returns true if this is the -dev package
is_dev_pkg() {
test "${subpkgname%-dev}" != "$subpkgname"
}
# check that noarch is set if needed
archcheck() {
options_has "!archcheck" && return 0
if dir_has_arch_binaries "${subpkgdir:-$pkgdir}"; then
[ "$arch" != "noarch" ] && return 0
error "Arch specific binaries found so arch must not be set to \"noarch\""
return 1
elif [ "$arch" != "noarch" ] && ! is_dev_pkg; then
# we dont want -dev package go to noarch
warning "No arch specific binaries found so arch should probably be set to \"noarch\""
Natanael Copa
committed
prepare_package() {
msg "Preparing ${subpkgname:+sub}package ${subpkgname:-$pkgname}..."
prepare_metafiles && prepare_tracedeps || return 1
archcheck
Natanael Copa
committed
}
pkginfo_val() {
local key="$1"
local file="$2"
awk -F ' = ' "\$1 == \"$key\" {print \$2}" "$file"
}
# find real path to so files
real_so_path() {
local so="$1"
shift
while [ $# -gt 0 ]; do
[ -e "$1"/$so ] && realpath "$1/$so" && return 0
shift
done
error "$so: path not found"
return 1
}
# search rpaths and /usr/lib /lib for given so files
find_so_files() {
local rpaths=$(cat "$1")
shift
while [ $# -gt 0 ]; do
real_so_path "$1" /usr/lib /lib $rpaths || return 1
shift
done
return 0
}
trace_apk_deps() {
local name="$1"
local dir="$2"
local i= j= found= autodeps= deppkgs= missing= so_paths= self_provided=
msg "Tracing dependencies..."
# add pkgconfig if usr/lib/pkgconfig is found
if [ -d "$pkgbasedir"/$name/usr/lib/pkgconfig ] \
&& ! grep -q '^depend = pkgconfig' "$dir"/.PKGINFO; then
msg " added pkgconfig (found /usr/lib/pkgconfig)"
autodeps="$autodeps pkgconfig"
fi
# special case for libpthread: we need depend on libgcc
if [ -f "$dir"/.needs-so ] && grep -q -w '^libpthread.so.*' "$dir"/.needs-so \
&& ! grep -q -w "^depend = libgcc" "$dir"/.PKGINFO; then
autodeps="$autodeps libgcc"
msg " added libgcc (due to libpthread)"
[ -f "$dir"/.needs-so ] && for i in $(cat "$dir"/.needs-so); do
found=
# first check if its provide by same apkbuild
for j in "$dir"/../.control.*/.provides-so; do
grep -q -w "^$i" "$j" || continue
found=${j%/.provides-so}
break
if [ -n "$found" ]; then
if ! list_has "$found" $self_provided; then
self_provided="$self_provided $found"
fi
else
missing="$missing $i"
done
# find all packages that holds the so files
if [ -f "$dir"/.rpaths ]; then
so_files=$(find_so_files "$dir"/.rpaths $missing) || return 1
deppkgs=$($APK info -q -W $so_files) || return 1
fi
for found in $self_provided $deppkgs; do
if grep -w "^depend = ${found}$" "$dir"/.PKGINFO >/dev/null ; then
warning "You can remove '$found' from depends"
continue
fi
if [ "$found" != "$name" ] && ! list_has "$found" $autodeps; then
autodeps="$autodeps $found"
echo "# automatically detected:" >> "$dir"/.PKGINFO
sed 's/^\(.*\) \([0-9].*\)/provides = so:\1=\2/' "$dir"/.provides-so \
for i in $autodeps; do
echo "depend = $i" >> "$dir"/.PKGINFO
done
}
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
find_scanelf_paths() {
local controldir="$1" datadir="$2"
local paths="$datadir/lib:$datadir/usr/lib" i= rpath=
if [ -n "$ldpath" ]; then
paths="$paths:$ldpath"
fi
# search in all rpaths
for rpath in "$pkgbasedir"/.control.*/.rpath; do
[ -f "$rpath" ] || continue
while read i; do
if [ -d "$datadir/$i" ]; then
paths="$paths:$datadir/$i"
fi
done < "$rpath"
done
echo "$paths"
}
scan_shared_objects() {
local name="$1" controldir="$2" datadir="$3"
# allow spaces in paths
IFS=:
set -- $(find_scanelf_paths "$controldir" "$datadir")
unset IFS
msg "Scanning shared objects"
# lets tell all the .so files this package provides in .provides-so
scanelf --nobanner --soname "$@" | while read etype soname file; do
# if soname field is missing, soname will be the filepath
# we only want shared libs
sover=0
case $soname in
*.so|*.so.[0-9]*)
soname=${soname##*/}
case "$file" in
*.so.[0-9]*) sover=${file##*.so.};;
esac
echo "$soname $sover"
;;
esac
done > "$controldir"/.provides-so
# now find the so dependencies
scanelf --nobanner --recursive --needed "$datadir" | tr ' ' ':' \
| awk -F ":" '$1 == "ET_DYN" || $1 == "ET_EXEC" {print $2}' \
| sed 's:,:\n:g' | sort -u \
| while read i; do
# only add files that are not self provided
grep -q -w "^$i" "$controldir"/.provides-so \
|| echo $i
done > "$controldir"/.needs-so
}
Natanael Copa
committed
create_apks() {
local file= dir= name= ver= apk= datadir=
getpkgver || return 1
if [ "$arch" != "noarch" ] && ! options_has "!tracedeps"; then
for file in "$pkgbasedir"/.control.*/.PKGINFO; do
dir="${file%/.PKGINFO}"
name="$(pkginfo_val pkgname $file)"
datadir="$pkgbasedir"/$name
subpkgname=$name
scan_shared_objects "$name" "$dir" "$datadir"
done
fi
for file in "$pkgbasedir"/.control.*/.PKGINFO; do
dir="${file%/.PKGINFO}"
name=$(pkginfo_val pkgname $file)
ver=$(pkginfo_val pkgver $file)
apk=$name-$ver.apk
datadir="$pkgbasedir"/$name
subpkgname=$name
trace_apk_deps "$name" "$dir" || return 1