e4984d01ea
- use xbps-checkvers(1) to resolve dependencies. - all dependencies are installed at once for the host and target. - the show-build-deps target is now much faster. - the update-bulk/show-repo-updates targets are now much faster. - the update-sys/show-sys-updates targets are now much faster. - the bootstrap target now works on musl hosts. - simplified some loops. - use cut(1) rather than awk(1) where applicable. - multiple random changes to improve performance. Based on work started by @Duncaen on #12433 Close #12433 Close #11282
196 lines
7.0 KiB
Bash
196 lines
7.0 KiB
Bash
# vim: set ts=4 sw=4 et:
|
|
|
|
# FIXME: $XBPS_FFLAGS is not set when chroot_init() is run
|
|
# It is set in common/build-profiles/bootstrap.sh but lost somewhere?
|
|
chroot_init() {
|
|
mkdir -p $XBPS_MASTERDIR/etc/xbps
|
|
|
|
cat > $XBPS_MASTERDIR/etc/xbps/xbps-src.conf <<_EOF
|
|
# Generated configuration file by xbps-src, DO NOT EDIT!
|
|
$(grep -E '^XBPS_.*' "$XBPS_CONFIG_FILE")
|
|
XBPS_MASTERDIR=/
|
|
XBPS_CFLAGS="$XBPS_CFLAGS"
|
|
XBPS_CXXFLAGS="$XBPS_CXXFLAGS"
|
|
XBPS_FFLAGS="-fPIC -pipe"
|
|
XBPS_CPPFLAGS="$XBPS_CPPFLAGS"
|
|
XBPS_LDFLAGS="$XBPS_LDFLAGS"
|
|
XBPS_HOSTDIR=/host
|
|
# End of configuration file.
|
|
_EOF
|
|
|
|
# Create custom script to start the chroot bash shell.
|
|
cat > $XBPS_MASTERDIR/bin/xbps-shell <<_EOF
|
|
#!/bin/sh
|
|
|
|
XBPS_SRC_VERSION="$XBPS_SRC_VERSION"
|
|
|
|
. /etc/xbps/xbps-src.conf
|
|
|
|
PATH=/void-packages:/usr/bin
|
|
|
|
exec env -i -- SHELL=/bin/sh PATH="\$PATH" DISTCC_HOSTS="\$XBPS_DISTCC_HOSTS" DISTCC_DIR="/host/distcc" \
|
|
${XBPS_ARCH+XBPS_ARCH=$XBPS_ARCH} ${XBPS_CHECK_PKGS+XBPS_CHECK_PKGS=$XBPS_CHECK_PKGS} \
|
|
CCACHE_DIR="/host/ccache" IN_CHROOT=1 LC_COLLATE=C LANG=en_US.UTF-8 TERM=linux HOME="/tmp" \
|
|
PS1="[\u@$XBPS_MASTERDIR \W]$ " /bin/bash +h
|
|
_EOF
|
|
|
|
chmod 755 $XBPS_MASTERDIR/bin/xbps-shell
|
|
|
|
cp -f /etc/resolv.conf $XBPS_MASTERDIR/etc
|
|
|
|
# Update xbps alternative repository if set.
|
|
mkdir -p $XBPS_MASTERDIR/etc/xbps.d
|
|
if [ -n "$XBPS_ALT_REPOSITORY" ]; then
|
|
( \
|
|
echo "repository=/host/binpkgs/${XBPS_ALT_REPOSITORY}"; \
|
|
echo "repository=/host/binpkgs/${XBPS_ALT_REPOSITORY}/nonfree"; \
|
|
echo "repository=/host/binpkgs/${XBPS_ALT_REPOSITORY}/debug"; \
|
|
) > $XBPS_MASTERDIR/etc/xbps.d/00-repository-alternative.conf
|
|
if [ "$XBPS_MACHINE" = "x86_64" ]; then
|
|
( \
|
|
echo "repository=/host/binpkgs/${XBPS_ALT_REPOSITORY}/multilib"; \
|
|
echo "repository=/host/binpkgs/${XBPS_ALT_REPOSITORY}/multilib/nonfree"; \
|
|
) >> $XBPS_MASTERDIR/etc/xbps.d/00-repository-alternative.conf
|
|
fi
|
|
else
|
|
rm -f $XBPS_MASTERDIR/etc/xbps.d/00-repository-alternative.conf
|
|
fi
|
|
}
|
|
|
|
chroot_prepare() {
|
|
local f=
|
|
|
|
if [ -f $XBPS_MASTERDIR/.xbps_chroot_init ]; then
|
|
return 0
|
|
elif [ ! -f $XBPS_MASTERDIR/bin/bash ]; then
|
|
msg_error "Bootstrap not installed in $XBPS_MASTERDIR, can't continue.\n"
|
|
fi
|
|
|
|
# Create some required files.
|
|
if [ -f /etc/localtime ]; then
|
|
cp -f /etc/localtime $XBPS_MASTERDIR/etc
|
|
elif [ -f /usr/share/zoneinfo/UTC ]; then
|
|
cp -f /usr/share/zoneinfo/UTC $XBPS_MASTERDIR/etc/localtime
|
|
fi
|
|
|
|
for f in dev sys proc host boot; do
|
|
[ ! -d $XBPS_MASTERDIR/$f ] && mkdir -p $XBPS_MASTERDIR/$f
|
|
done
|
|
|
|
# Copy /etc/passwd and /etc/group from base-files.
|
|
cp -f $XBPS_SRCPKGDIR/base-files/files/passwd $XBPS_MASTERDIR/etc
|
|
echo "$(whoami):x:$(id -u):$(id -g):$(whoami) user:/tmp:/bin/xbps-shell" \
|
|
>> $XBPS_MASTERDIR/etc/passwd
|
|
cp -f $XBPS_SRCPKGDIR/base-files/files/group $XBPS_MASTERDIR/etc
|
|
echo "$(whoami):x:$(id -g):" >> $XBPS_MASTERDIR/etc/group
|
|
|
|
# Copy /etc/hosts from base-files.
|
|
cp -f $XBPS_SRCPKGDIR/base-files/files/hosts $XBPS_MASTERDIR/etc
|
|
|
|
mkdir -p $XBPS_MASTERDIR/etc/xbps.d
|
|
echo "syslog=false" >> $XBPS_MASTERDIR/etc/xbps.d/xbps.conf
|
|
echo "cachedir=/host/repocache" >> $XBPS_MASTERDIR/etc/xbps.d/xbps.conf
|
|
ln -sf /dev/null $XBPS_MASTERDIR/etc/xbps.d/00-repository-main.conf
|
|
|
|
# Prepare default locale: en_US.UTF-8.
|
|
if [ -s ${XBPS_MASTERDIR}/etc/default/libc-locales ]; then
|
|
echo 'en_US.UTF-8 UTF-8' >> ${XBPS_MASTERDIR}/etc/default/libc-locales
|
|
fi
|
|
|
|
touch -f $XBPS_MASTERDIR/.xbps_chroot_init
|
|
[ -n "$1" ] && echo $1 >> $XBPS_MASTERDIR/.xbps_chroot_init
|
|
|
|
return 0
|
|
}
|
|
|
|
chroot_sync_repos() {
|
|
local f=
|
|
|
|
# Copy xbps configuration files to the masterdir.
|
|
install -Dm644 ${XBPS_DISTDIR}/etc/xbps.conf \
|
|
${XBPS_MASTERDIR}/etc/xbps.d/00-xbps-src.conf
|
|
install -Dm644 ${XBPS_DISTDIR}/etc/repos-local.conf \
|
|
${XBPS_MASTERDIR}/etc/xbps.d/10-repository-local.conf
|
|
install -Dm644 ${XBPS_DISTDIR}/etc/repos-remote.conf \
|
|
${XBPS_MASTERDIR}/etc/xbps.d/20-repository-remote.conf
|
|
|
|
if [ "$XBPS_MACHINE" = "x86_64" ]; then
|
|
install -Dm644 ${XBPS_DISTDIR}/etc/repos-local-x86_64.conf \
|
|
${XBPS_MASTERDIR}/etc/xbps.d/12-repository-local-x86_64.conf
|
|
install -Dm644 ${XBPS_DISTDIR}/etc/repos-remote-x86_64.conf \
|
|
${XBPS_MASTERDIR}/etc/xbps.d/22-repository-remote-x86_64.conf
|
|
fi
|
|
|
|
# if -N is set, get rid of remote repos from x86_64 (glibc).
|
|
if [ -n "$XBPS_SKIP_REMOTEREPOS" ]; then
|
|
rm -f ${XBPS_MASTERDIR}/etc/xbps.d/20-repository-remote.conf
|
|
rm -f ${XBPS_MASTERDIR}/etc/xbps.d/22-repository-remote-x86_64.conf
|
|
fi
|
|
|
|
# Copy host repos to the cross root.
|
|
if [ -n "$XBPS_CROSS_BUILD" ]; then
|
|
rm -rf $XBPS_MASTERDIR/$XBPS_CROSS_BASE/etc/xbps.d
|
|
mkdir -p $XBPS_MASTERDIR/$XBPS_CROSS_BASE/etc/xbps.d
|
|
cp ${XBPS_MASTERDIR}/etc/xbps.d/*.conf \
|
|
$XBPS_MASTERDIR/$XBPS_CROSS_BASE/etc/xbps.d
|
|
rm -f $XBPS_MASTERDIR/$XBPS_CROSS_BASE/etc/xbps.d/*-x86_64.conf
|
|
fi
|
|
|
|
if [ -z "$XBPS_SKIP_REMOTEREPOS" ]; then
|
|
# Make sure to sync index for remote repositories.
|
|
xbps-install -r $XBPS_MASTERDIR -S
|
|
fi
|
|
|
|
if [ -n "$XBPS_CROSS_BUILD" ]; then
|
|
# Copy host keys to the target rootdir.
|
|
mkdir -p $XBPS_MASTERDIR/$XBPS_CROSS_BASE/var/db/xbps/keys
|
|
cp $XBPS_MASTERDIR/var/db/xbps/keys/*.plist \
|
|
$XBPS_MASTERDIR/$XBPS_CROSS_BASE/var/db/xbps/keys
|
|
# Make sure to sync index for remote repositories.
|
|
if [ -z "$XBPS_SKIP_REMOTEREPOS" ]; then
|
|
env -- XBPS_TARGET_ARCH=$XBPS_TARGET_MACHINE \
|
|
xbps-install -r $XBPS_MASTERDIR/$XBPS_CROSS_BASE -S
|
|
fi
|
|
fi
|
|
|
|
return 0
|
|
}
|
|
|
|
chroot_handler() {
|
|
local action="$1" pkg="$2" rv=0 arg= _envargs=
|
|
|
|
if [ -n "$IN_CHROOT" -o -z "$CHROOT_READY" ]; then
|
|
return 0
|
|
fi
|
|
if [ ! -d $XBPS_MASTERDIR/void-packages ]; then
|
|
mkdir -p $XBPS_MASTERDIR/void-packages
|
|
fi
|
|
|
|
[ -z "$action" -a -z "$pkg" ] && return 1
|
|
|
|
case "$action" in
|
|
fetch|extract|patch|configure|build|check|install|pkg|bootstrap-update|chroot)
|
|
chroot_prepare || return $?
|
|
chroot_init || return $?
|
|
chroot_sync_repos || return $?
|
|
;;
|
|
esac
|
|
|
|
if [ "$action" = "chroot" ]; then
|
|
$XBPS_COMMONDIR/chroot-style/${XBPS_CHROOT_CMD:=uunshare}.sh \
|
|
$XBPS_MASTERDIR $XBPS_DISTDIR "$XBPS_HOSTDIR" "$XBPS_CHROOT_CMD_ARGS" /bin/xbps-shell
|
|
rv=$?
|
|
else
|
|
env -i -- PATH="/usr/bin:$PATH" SHELL=/bin/sh \
|
|
HOME=/tmp IN_CHROOT=1 LC_COLLATE=C LANG=en_US.UTF-8 \
|
|
SOURCE_DATE_EPOCH="$SOURCE_DATE_EPOCH" \
|
|
XBPS_ALLOW_CHROOT_BREAKOUT="$XBPS_ALLOW_CHROOT_BREAKOUT" \
|
|
$XBPS_COMMONDIR/chroot-style/${XBPS_CHROOT_CMD:=uunshare}.sh \
|
|
$XBPS_MASTERDIR $XBPS_DISTDIR "$XBPS_HOSTDIR" "$XBPS_CHROOT_CMD_ARGS" \
|
|
/void-packages/xbps-src $XBPS_OPTIONS $action $pkg
|
|
rv=$?
|
|
fi
|
|
|
|
return $rv
|
|
}
|