diff --git a/common/xbps-src/libexec/build.sh b/common/xbps-src/libexec/build.sh index 7c533c2a86..9d8a333527 100755 --- a/common/xbps-src/libexec/build.sh +++ b/common/xbps-src/libexec/build.sh @@ -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, diff --git a/common/xbps-src/shutils/build_dependencies.sh b/common/xbps-src/shutils/build_dependencies.sh index 88704d7634..830269992a 100644 --- a/common/xbps-src/shutils/build_dependencies.sh +++ b/common/xbps-src/shutils/build_dependencies.sh @@ -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 diff --git a/common/xbps-src/shutils/cross.sh b/common/xbps-src/shutils/cross.sh index 0846ca4503..f04bdbb988 100644 --- a/common/xbps-src/shutils/cross.sh +++ b/common/xbps-src/shutils/cross.sh @@ -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() { diff --git a/common/xbps-src/shutils/pkgtarget.sh b/common/xbps-src/shutils/pkgtarget.sh index addd7eb060..c6befbe347 100644 --- a/common/xbps-src/shutils/pkgtarget.sh +++ b/common/xbps-src/shutils/pkgtarget.sh @@ -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=