xbps-src: make -N -a <target> work.

If required cross pkgs are not available in xbps repos, those are now built
automagically.
This commit is contained in:
Juan RP 2015-03-23 12:42:35 +01:00
parent a8549d6fb4
commit 03ef5b6804
4 changed files with 76 additions and 40 deletions

View file

@ -7,8 +7,9 @@
# $2 - target pkgname (origin) to build [REQUIRED]
# $3 - xbps target [REQUIRED]
# $4 - cross target [OPTIONAL]
# $5 - internal [OPTIONAL]
if [ $# -lt 3 -o $# -gt 4 ]; then
if [ $# -lt 3 -o $# -gt 5 ]; then
echo "$(basename $0): invalid number of arguments: pkgname targetpkg target [cross-target]"
exit 1
fi
@ -17,6 +18,7 @@ readonly PKGNAME="$1"
readonly TARGET_PKG="$2"
readonly TARGET="$3"
readonly XBPS_CROSS_BUILD="$4"
readonly XBPS_CROSS_PREPARE="$5"
for f in $XBPS_SHUTILSDIR/*.sh; do
. $f
@ -25,11 +27,15 @@ done
setup_pkg "$PKGNAME" $XBPS_CROSS_BUILD
show_pkg_build_options
check_pkg_arch $XBPS_CROSS_BUILD
install_cross_pkg $XBPS_CROSS_BUILD
if [ -z "$XBPS_CROSS_PREPARE" ]; then
install_cross_pkg $XBPS_CROSS_BUILD || exit $?
prepare_cross_sysroot $XBPS_CROSS_BUILD || exit $?
fi
# Install dependencies from binary packages
if [ "$PKGNAME" != "$TARGET_PKG" -o -z "$XBPS_SKIP_DEPS" ]; then
install_pkg_deps $PKGNAME $TARGET_PKG pkg $XBPS_CROSS_BUILD || exit $?
install_pkg_deps $PKGNAME $TARGET_PKG pkg $XBPS_CROSS_BUILD $XBPS_CROSS_PREPARE || exit $?
fi
# Fetch distfiles after installing required dependencies,

View file

@ -190,7 +190,7 @@ check_installed_pkg() {
# Installs all dependencies required by a package.
#
install_pkg_deps() {
local pkg="$1" targetpkg="$2" target="$3" cross="$4"
local pkg="$1" targetpkg="$2" target="$3" cross="$4" cross_prepare="$5"
local rval _realpkg curpkgdepname pkgn iver _props _exact
local i j found rundep checkver
@ -364,7 +364,7 @@ install_pkg_deps() {
setup_pkg $pkg $cross
msg_error "$pkgver: required target dependency '$i' cannot be resolved!\n"
fi
exec env XBPS_BINPKG_EXISTS=1 $XBPS_LIBEXECDIR/build.sh $sourcepkg $pkg $target $cross || exit $?
exec env XBPS_BINPKG_EXISTS=1 $XBPS_LIBEXECDIR/build.sh $sourcepkg $pkg $target $cross $cross_prepare || exit $?
) || exit $?
binpkg_deps+=("$i")
done

View file

@ -22,49 +22,63 @@ remove_pkg_cross_deps() {
rm -f $tmplogf
}
prepare_cross_sysroot() {
local cross="$1"
[ -z "$cross" -o "$cross" = "" ] && return 0
if [ ! -d ${XBPS_CROSS_BASE}/var/db/xbps/keys ]; then
mkdir -p ${XBPS_CROSS_BASE}/var/db/xbps/keys
cp ${XBPS_MASTERDIR}/var/db/xbps/keys/*.plist \
${XBPS_CROSS_BASE}/var/db/xbps/keys
fi
# Check for cross-vpkg-dummy available for the target arch, otherwise build it.
pkg_available cross-vpkg-dummy $cross
if [ $? -eq 0 ]; then
$XBPS_LIBEXECDIR/build.sh cross-vpkg-dummy cross-vpkg-dummy pkg $cross init || return $?
fi
errlog=$(mktemp)
msg_normal "Installing $cross cross pkg: cross-vpkg-dummy ...\n"
$XBPS_INSTALL_XCMD -r $XBPS_CROSS_BASE -SAyd cross-vpkg-dummy &>$errlog
rval=$?
if [ $rval -ne 0 -a $rval -ne 17 ]; then
msg_red "failed to install cross-vpkg-dummy (error $rval)\n"
cat $errlog
rm -f $errlog
msg_error "cannot continue due to errors above\n"
fi
rm -f $errlog
return 0
}
install_cross_pkg() {
local cross="$1" rval errlog
[ -z "$cross" -o "$cross" = "" ] && return 0
source_file ${XBPS_CROSSPFDIR}/${cross}.sh
if [ -z "$CHROOT_READY" ]; then
echo "ERROR: chroot mode not activated (install a bootstrap)."
exit 1
elif [ -z "$IN_CHROOT" ]; then
return 0
# Check if the cross compiler pkg is available in repos, otherwise build it.
msg_normal "Installing $cross cross compiler: cross-${XBPS_CROSS_TRIPLET} ...\n"
pkg_available cross-${XBPS_CROSS_TRIPLET}
rval=$?
if [ $rval -eq 0 ]; then
$XBPS_LIBEXECDIR/build.sh cross-${XBPS_CROSS_TRIPLET} cross-${XBPS_CROSS_TRIPLET} pkg || return $rval
fi
# Install required pkgs for cross building.
if [ "$XBPS_TARGET" != "remove-autodeps" ]; then
errlog=$(mktemp)
check_installed_pkg cross-${XBPS_CROSS_TRIPLET}-0.1_1
if [ $? -ne 0 ]; then
msg_normal "Installing cross pkg: cross-${XBPS_CROSS_TRIPLET} ...\n"
$XBPS_INSTALL_CMD -Syd cross-${XBPS_CROSS_TRIPLET} &>$errlog
rval=$?
if [ $rval -ne 0 -a $rval -ne 17 ]; then
msg_red "failed to install cross-${XBPS_CROSS_TRIPLET} (error $rval)\n"
cat $errlog
rm -f $errlog
msg_error "cannot continue due to errors above\n"
fi
fi
if [ ! -d ${XBPS_CROSS_BASE}/var/db/xbps/keys ]; then
mkdir -p ${XBPS_CROSS_BASE}/var/db/xbps/keys
cp ${XBPS_MASTERDIR}/var/db/xbps/keys/*.plist \
${XBPS_CROSS_BASE}/var/db/xbps/keys
fi
$XBPS_INSTALL_CMD -r ${XBPS_CROSS_BASE} -SAyd cross-vpkg-dummy &>$errlog
rval=$?
if [ $rval -ne 0 -a $rval -ne 17 ]; then
msg_red "failed to install cross-vpkg-dummy (error $rval)\n"
cat $errlog
rm -f $errlog
msg_error "cannot continue due to errors above\n"
fi
errlog=$(mktemp)
$XBPS_INSTALL_CMD -Syd cross-${XBPS_CROSS_TRIPLET} &>$errlog
rval=$?
if [ $rval -ne 0 -a $rval -ne 17 ]; then
msg_red "failed to install cross-${XBPS_CROSS_TRIPLET} (error $rval)\n"
cat $errlog
rm -f $errlog
msg_error "cannot continue due to errors above\n"
fi
rm -f $errlog
return 0
}
remove_cross_pkg() {

View file

@ -24,6 +24,22 @@ check_pkg_arch() {
fi
}
# Returns 1 if pkg is available in xbps repositories, 0 otherwise.
pkg_available() {
local pkg="$1" cross="$2" pkgver
if [ -n "$cross" ]; then
pkgver=$($XBPS_QUERY_XCMD -R -ppkgver "${pkg}" 2>/dev/null)
else
pkgver=$($XBPS_QUERY_CMD -R -ppkgver "${pkg}" 2>/dev/null)
fi
if [ -z "$pkgver" ]; then
return 0
fi
return 1
}
remove_pkg_autodeps() {
local rval= tmplogf=