c9dede4e23
localedef is only available with glibc, so that defer locale creation once the chroot is ready. This fixes installing bootstrap glibc pkgs on musl hosts.
209 lines
7.5 KiB
Bash
209 lines
7.5 KiB
Bash
# vim: set ts=4 sw=4 et:
|
|
|
|
chroot_init() {
|
|
XBPSSRC_CF=$XBPS_MASTERDIR/etc/xbps/xbps-src.conf
|
|
|
|
mkdir -p $XBPS_MASTERDIR/etc/xbps
|
|
|
|
cat > $XBPSSRC_CF <<_EOF
|
|
# Generated configuration file by xbps-src, DO NOT EDIT!
|
|
_EOF
|
|
if [ -e "$XBPS_CONFIG_FILE" ]; then
|
|
grep -E '^XBPS_.*' $XBPS_CONFIG_FILE >> $XBPSSRC_CF
|
|
fi
|
|
cat >> $XBPSSRC_CF <<_EOF
|
|
XBPS_MASTERDIR=/
|
|
XBPS_CFLAGS="$XBPS_CFLAGS"
|
|
XBPS_CXXFLAGS="$XBPS_CXXFLAGS"
|
|
XBPS_CPPFLAGS="$XBPS_CPPFLAGS"
|
|
XBPS_LDFLAGS="$XBPS_LDFLAGS"
|
|
XBPS_HOSTDIR=/host
|
|
_EOF
|
|
|
|
echo "# End of configuration file." >> $XBPSSRC_CF
|
|
|
|
# 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:/usr/sbin
|
|
|
|
exec env -i SHELL=/bin/sh PATH="\$PATH" DISTCC_HOSTS="\$XBPS_DISTCC_HOSTS" DISTCC_DIR="/host/distcc" @@XARCH@@ \
|
|
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
|
|
if [ -n "$XBPS_ARCH" ]; then
|
|
sed -e "s,@@XARCH@@,XBPS_ARCH=${XBPS_ARCH},g" -i $XBPS_MASTERDIR/bin/xbps-shell
|
|
else
|
|
sed -e 's,@@XARCH@@,,g' -i $XBPS_MASTERDIR/bin/xbps-shell
|
|
fi
|
|
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.
|
|
[ -f /etc/localtime ] && cp -f /etc/localtime $XBPS_MASTERDIR/etc
|
|
|
|
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 [ -z "$XBPS_TEMP_MASTERDIR" -a -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/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, comment out remote repositories from xbps.conf.
|
|
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 -a $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_ARCH \
|
|
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|build|configure|install|install-destdir|pkg|build-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
|
|
[ -n "$XBPS_CROSS_BUILD" ] && arg="$arg -a $XBPS_CROSS_BUILD"
|
|
[ -n "$XBPS_KEEP_ALL" ] && arg="$arg -C"
|
|
[ -n "$NOCOLORS" ] && arg="$arg -L"
|
|
[ -n "$XBPS_BUILD_FORCEMODE" ] && arg="$arg -f"
|
|
[ -n "$XBPS_MAKEJOBS" ] && arg="$arg -j$XBPS_MAKEJOBS"
|
|
[ -n "$XBPS_DEBUG_PKGS" ] && arg="$arg -g"
|
|
[ -n "$XBPS_SKIP_DEPS" ] && arg="$arg -I"
|
|
[ -n "$XBPS_ALT_REPOSITORY" ] && arg="$arg -r $XBPS_ALT_REPOSITORY"
|
|
[ -n "$XBPS_USE_GIT_REVS" ] && arg="$arg -G"
|
|
[ -n "$XBPS_PKG_OPTIONS" ] && arg="$arg -o $XBPS_PKG_OPTIONS"
|
|
[ -n "$XBPS_TEMP_MASTERDIR" ] && arg="$arg -t -C"
|
|
[ -n "$XBPS_BINPKG_EXISTS" ] && arg="$arg -E"
|
|
|
|
action="$arg $action"
|
|
env -i PATH="/usr/bin:/usr/sbin:$PATH" SHELL=/bin/sh \
|
|
HOME=/tmp IN_CHROOT=1 LC_COLLATE=C LANG=en_US.UTF-8 \
|
|
$XBPS_COMMONDIR/chroot-style/${XBPS_CHROOT_CMD:=uunshare}.sh \
|
|
$XBPS_MASTERDIR $XBPS_DISTDIR "$XBPS_HOSTDIR" "$XBPS_CHROOT_CMD_ARGS" \
|
|
/void-packages/xbps-src $action $pkg
|
|
rv=$?
|
|
fi
|
|
|
|
return $rv
|
|
}
|