vp-build/xbps-src
Juan RP 5f030fe2f1 xbps-src: force reconfiguration of bootstrap pkgs on chroot setup.
Right now ca-certificates internally requires the `openssl` utility
to generate /etc/ssl/certs. Certainly we need to perform this task
only once and iff we are within the chroot, because the host might
not have it in PATH.

This should fix the travis issue seen since xbps-0.48 was released.
2015-11-02 20:25:16 +01:00

770 lines
24 KiB
Bash
Executable File

#!/bin/bash
# vim: set ts=4 sw=4 et:
print_cross_targets() {
local f
for f in common/cross-profiles/*.sh; do
f=${f%.sh}; f=${f##*/}; printf "\t$f\n"
done
}
usage() {
cat << _EOF
$(basename $0): [options] <target> [arguments]
Targets: (only one may be specified)
binary-bootstrap [arch]
Install bootstrap packages from host repositories into <masterdir>.
If the optional 'arch' argument is set, it will install bootstrap packages
from this architecture, and its required xbps utilities. The <masterdir>
will be initialized for chroot operations.
bootstrap
Build and install from source the bootstrap packages into <masterdir>.
bootstrap-update
Updates bootstrap packages with latest versions available from registered
repositories in the XBPS configuration file.
build <pkgname>
Build package source (fetch + extract + configure + build).
chroot
Enter to the chroot in <masterdir>.
clean [pkgname]
Removes auto dependencies, cleans up <masterdir>/builddir and <masterdir>/destdir.
If <pkgname> argument is specified, package files from <masterdir>/destdir and its
build directory in <masterdir>/buiddir are removed.
configure <pkgname>
Configure a package (fetch + extract + configure).
extract <pkgname>
Extract package source distribution file(s) into the build directory.
By default set to <masterdir>/builddir.
fetch <pkgname>
Download package source distribution file(s).
install <pkgname>
Install target package into <destdir> but not building the binary package
and not removing build directory for inspection purposes.
list
Lists installed packages in <masterdir>.
pkg <pkgname>
Build binary package for <pkgname> and all required dependencies.
remove <pkgname>
Remove target package from <destdir>. If <pkgname>-<version> is not matched
from build template nothing is removed.
remove-autodeps
Removes all package dependencies that were installed automatically.
purge-distfiles
Removes all obsolete distfiles in <hostdir>/sources.
show <pkgname>
Show information for the specified package.
show-avail <pkgname>
Returns 0 if package can be built for the given architecture,
any other error otherwise.
show-build-deps <pkgname>
Show required build dependencies for <pkgname>.
show-deps <pkgname>
Show required run-time dependencies for <pkgname>. Package must be
installed into destdir.
show-files <pkgname>
Show files installed by <pkgname>. Package must be installed into destdir.
show-options <pkgname>
Show available build options by <pkgname>.
show-shlib-provides <pkgname>
Show list of provided shlibs for <pkgname>. Package must be installed into destdir.
show-shlib-requires <pkgname>
Show list of required shlibs for <pkgname>. Package must be installed into destdir.
show-var <var>
Prints the value of <var> if it's defined in xbps-src.
show-repo-updates
Prints the list of outdated packages in XBPS repositories.
show-sys-updates
Prints the list of oudated packages in your system.
sort-dependencies <pkg> <pkgN+1> ...
Given a list of packages specified as additional arguments, a sorted dependency
list will be returned to stdout.
update-bulk
Rebuilds all packages in the system repositories that are outdated.
update-sys
Rebuilds all packages in your system that are outdated and updates them.
update-check <pkgname>
Check upstream site of <pkgname> for new releases.
update-hash-cache
Update the hash cache with existing source distfiles.
zap
Removes a masterdir but preserving ccache, distcc and host directories.
Options:
-a <profile>
Cross compile packages for this profile. Supported targets:
$(print_cross_targets)
-C Do not remove build directory, automatic dependencies and
package destdir after successful install.
-E If a binary package exists in a local repository for the target package,
do not try to build it, exit immediately.
-f Force running the specified stage (configure/build/install/pkg)
even if it ran successfully.
-G Enable XBPS_USE_GIT_REVS (see etc/defaults.conf for more information).
-g Enable building -dbg packages with debugging symbols.
-H <hostdir>
Absolute path to a directory to be bind mounted at <masterdir>/host.
The host directory stores binary packages, sources and package dependencies
downloaded from remote repositories.
If unset defaults to void-packages/hostdir.
-h Usage output.
-I Ignore required dependencies, useful for extracting/fetching sources.
-j Number of parallel build jobs to use when building packages.
-L Disable ASCII colors.
-m <masterdir>
Absolute path to a directory to be used as masterdir.
The masterdir is the main directory to build/store/compile packages.
If unset defaults to void-packages/masterdir.
-N Disable use of remote repositories to resolve dependencies.
-o <opt,~opt2,...>
Enable or disable (prefixed with ~) package build options. Note this overrides
options set via XBPS_PKG_OPTIONS from 'etc/conf'. This effectively has the same
effect than setting 'XBPS_PKG_OPTIONS_<pkgname>' in 'etc/conf'.
Supported options can be shown with the 'show-options' target.
-r <repo>
Use an alternative local repository to store generated binary packages.
If unset defaults to <hostdir>/binpkgs. If set the binpkgs will
be stored into <hostdir>/binpkgs/<repo>.
This alternative repository will also be used to resolve dependencies
with highest priority order than others.
-t Create a temporary masterdir to not pollute the current one. Note that
the existing masterdir must be fully populated with binary-bootstrap first.
Once the target has finished, this temporary masterdir will be removed.
_EOF
}
check_reqhost_utils() {
local broken
[ -n "$IN_CHROOT" ] && return 0
for f in ${REQHOST_UTILS}; do
if ! command -v ${f} &>/dev/null; then
echo "${f} is missing in your system, can't continue!"
broken=1
fi
done
[ -n "$broken" ] && exit 1
[ -z "$1" ] && return 0
for f in ${REQHOST_UTILS_BOOTSTRAP}; do
if ! command -v ${f} &>/dev/null; then
echo "${f} is missing in your system, can't continue!"
broken=1
fi
done
[ -n "$broken" ] && exit 1
}
check_config_vars() {
if [ -s "$XBPS_CONFIG_FILE" ]; then
. $XBPS_CONFIG_FILE &>/dev/null
fi
if [ -z "$XBPS_MASTERDIR" ]; then
export XBPS_MASTERDIR="${XBPS_DISTDIR}/masterdir"
fi
if [ -z "$XBPS_HOSTDIR" ]; then
export XBPS_HOSTDIR="${XBPS_DISTDIR}/hostdir"
[ ! -d $XBPS_HOSTDIR ] && mkdir -p $XBPS_HOSTDIR
fi
if [ -d "$XBPS_MASTERDIR" -a ! -w "$XBPS_MASTERDIR" ]; then
echo "ERROR: not enough perms for masterdir $XBPS_MASTERDIR."
exit 1
fi
}
check_build_requirements() {
local found
for f in $XBPS_SHUTILSDIR/*.sh; do
[ -r $f ] && . $f
done
case "$XBPS_TARGET" in
*bootstrap*) found=1;;
*) ;;
esac
if [ -z "$found" ]; then
xbps-uhelper cmpver "$XBPS_VERSION" "$XBPS_VERSION_REQ"
if [ $? -eq 255 ]; then
echo "ERROR: requires xbps>=${XBPS_VERSION_REQ}"
echo "Bootstrap packages must be updated with 'xbps-src bootstrap-update'"
exit 1
fi
fi
# Set XBPS_REPOSITORY to our current branch.
if [ -z "$XBPS_ALT_REPOSITORY" ]; then
pushd "$PWD" &>/dev/null
cd $XBPS_DISTDIR
_gitbranch="$(chroot-git symbolic-ref --short HEAD 2>/dev/null)"
if [ -n "${_gitbranch}" -a "${_gitbranch}" != "master" ]; then
export XBPS_ALT_REPOSITORY="${_gitbranch}"
export XBPS_REPOSITORY="${XBPS_REPOSITORY}/${_gitbranch}"
if [ -z "$IN_CHROOT" ]; then
msg_normal "Using \`$XBPS_REPOSITORY\' as local repository.\n"
fi
fi
popd &>/dev/null
else
export XBPS_REPOSITORY="${XBPS_REPOSITORY}/${XBPS_ALT_REPOSITORY}"
if [ -z "$IN_CHROOT" ]; then
msg_normal "Using \`$XBPS_REPOSITORY\' as local repository.\n"
fi
fi
}
install_bbootstrap() {
[ -n "$CHROOT_READY" ] && return
if [ "$1" = "bootstrap" ]; then
unset XBPS_TARGET_PKG XBPS_INSTALL_ARGS
else
XBPS_TARGET_PKG="$1"
fi
if [ -n "$XBPS_SKIP_REMOTEREPOS" ]; then
unset XBPS_INSTALL_ARGS
fi
# binary bootstrap
msg_normal "Installing bootstrap from binary package repositories...\n"
# XBPS_TARGET_PKG == arch
if [ -n "$XBPS_TARGET_PKG" ]; then
_bootstrap_arch="env XBPS_TARGET_ARCH=$XBPS_TARGET_PKG"
if [ "${XBPS_TARGET_PKG}" != "${XBPS_TARGET_PKG#*-}" ]; then
_subarch="-${XBPS_TARGET_PKG#*-}"
fi
fi
mkdir -p $XBPS_MASTERDIR/var/db/xbps/keys
cd $XBPS_MASTERDIR
cp -f $XBPS_COMMONDIR/repo-keys/*.plist $XBPS_MASTERDIR/var/db/xbps/keys
${_bootstrap_arch} $XBPS_INSTALL_CMD ${XBPS_INSTALL_ARGS:+-S $XBPS_INSTALL_ARGS} -y base-chroot${_subarch}
if [ $? -ne 0 ]; then
msg_error "Failed to install bootstrap packages!\n"
fi
# Reconfigure base-files to create dirs/symlinks.
if xbps-query -r $XBPS_MASTERDIR base-files &>/dev/null; then
XBPS_ARCH=$XBPS_TARGET_PKG xbps-reconfigure -r $XBPS_MASTERDIR -f base-files &>/dev/null
fi
msg_normal "Installed bootstrap successfully!\n"
chroot_prepare $XBPS_TARGET_PKG || msg_error "Failed to initialize chroot!\n"
}
reconfigure_bootstrap_pkgs() {
local statefile="$XBPS_MASTERDIR/.xbps_chroot_configured"
local pkgs="ca-certificates"
[ -z "$IN_CHROOT" -o -e $statefile ] && return 0
# Reconfigure ca-certificates.
msg_normal "Reconfiguring bootstrap packages...\n"
for f in ${pkgs}; do
if xbps-query $f &>/dev/null; then
xbps-reconfigure -f $f
fi
done
touch -f $statefile
}
bootstrap_update() {
if [ -z "$CHROOT_READY" ]; then
return
fi
remove_pkg_autodeps
msg_normal "xbps-src: cleaning up masterdir...\n"
rm -rf $XBPS_MASTERDIR/builddir $XBPS_MASTERDIR/destdir
msg_normal "xbps-src: updating $XBPS_MASTERDIR ...\n"
${XBPS_INSTALL_CMD} ${XBPS_INSTALL_ARGS} -Syu
return $?
}
masterdir_zap() {
for f in bin boot builddir destdir dev etc home lib lib32 lib64 mnt \
opt proc root run sbin sys tmp usr var host media xbps \
void-packages .xbps_chroot_init .xbps_chroot_reconfigured; do
if [ -d "$XBPS_MASTERDIR/$f" ]; then
echo "Removing directory $XBPS_MASTERDIR/$f ..."
rm -rf $XBPS_MASTERDIR/$f
elif [ -h "$XBPS_MASTERDIR/$f" ]; then
echo "Removing link $XBPS_MASTERDIR/$f ..."
rm -f $XBPS_MASTERDIR/$f
elif [ -f "$XBPS_MASTERDIR/$f" ]; then
echo "Removing file $XBPS_MASTERDIR/$f ..."
rm -f $XBPS_MASTERDIR/$f
fi
done
echo "$XBPS_MASTERDIR masterdir cleaned up."
}
exit_func() {
wait
if [ -n "$sourcepkg" ]; then
remove_pkg $XBPS_CROSS_BUILD
fi
if [ -z "$IN_CHROOT" ]; then
msg_red "xbps-src: a failure has ocurred! exiting...\n"
fi
exit 2
}
basename_cwd() {
echo $(basename $(pwd))
}
read_pkg() {
if [ -z "${XBPS_TARGET_PKG}" ]; then
[ ! -r ./template ] && msg_error "missing build template in $(pwd).\n"
XBPS_TARGET_PKG=$(basename_cwd)
fi
setup_pkg $XBPS_TARGET_PKG $XBPS_CROSS_BUILD
}
setup_distfiles_mirror() {
local mirror scheme path
# Scheme file:// mirror locations only work with uchroot or proot
for mirror in $XBPS_DISTFILES_MIRROR; do
scheme="file"
if [[ "$mirror" == *://* ]]; then
scheme="${mirror%%://*}"
path="${mirror#${scheme}://}"
else
path="$mirror"
fi
[ "$scheme" != "file" ] && continue
if [ "$XBPS_CHROOT_CMD" == "uchroot" -o "$XBPS_CHROOT_CMD" == "proot" ]; then
if [ ! -d "$path" ]; then
msg_warn "Invalid path in XBPS_DISTFILES_MIRROR ($mirror)\n"
continue
fi
mkdir -p "$XBPS_MASTERDIR/$path"
XBPS_CHROOT_CMD_ARGS+=" -b $path:$path"
else
msg_warn "File URLs ($mirror) don't work with '$XBPS_CHROOT_CMD'\n"
fi
done
}
readonly XBPS_VERSION_REQ="0.46"
readonly XBPS_VERSION=$(xbps-uhelper -V|awk '{print $2}')
readonly XBPS_SRC_VERSION="113"
export XBPS_MACHINE=$(xbps-uhelper arch)
#
# main()
#
XBPS_OPTIONS=
while getopts "a:CEfgGhH:Ij:Lm:No:r:tV" opt; do
case $opt in
a) readonly XBPS_CROSS_BUILD="$OPTARG"; XBPS_OPTIONS+=" -a $OPTARG";;
C) readonly XBPS_KEEP_ALL=1; XBPS_OPTIONS+=" -C";;
E) readonly XBPS_BINPKG_EXISTS=1; XBPS_OPTIONS+=" -E";;
f) readonly XBPS_BUILD_FORCEMODE=1; XBPS_OPTIONS+=" -f";;
G) readonly XBPS_USE_GIT_REVS=1; XBPS_OPTIONS+=" -G";;
g) readonly XBPS_DEBUG_PKGS=1; XBPS_OPTIONS+=" -g";;
H) readonly XBPS_HOSTDIR="$(readlink -m $OPTARG 2>/dev/null)"; XBPS_OPTIONS+=" -H $XBPS_HOSTDIR";;
h) usage && exit 0;;
I) readonly XBPS_SKIP_DEPS=1; XBPS_OPTIONS+=" -I";;
j) export XBPS_MAKEJOBS="$OPTARG"; XBPS_OPTIONS+=" -j $OPTARG";;
L) export NOCOLORS=1; XBPS_OPTIONS+=" -L";;
m) readonly XBPS_MASTERDIR=$(readlink -m $OPTARG 2>/dev/null); XBPS_OPTIONS+=" -m $XBPS_MASTERDIR";;
N) readonly XBPS_SKIP_REMOTEREPOS=1; XBPS_OPTIONS+=" -N";;
o) readonly XBPS_PKG_OPTIONS="$OPTARG"; XBPS_OPTIONS+=" -o $OPTARG";;
r) readonly XBPS_ALT_REPOSITORY="$OPTARG"; XBPS_OPTIONS+=" -r $OPTARG";;
t) export XBPS_TEMP_MASTERDIR=1; XBPS_OPTIONS+=" -t -C";;
V) echo $XBPS_SRC_VERSION && exit 0;;
--) shift; break;;
esac
done
shift $(($OPTIND - 1))
[ $# -eq 0 ] && usage && exit 1
umask 022
#
# Check for required utilities in host system.
#
# Required utilities in host system for the bootstrap target.
readonly REQHOST_UTILS_BOOTSTRAP="make gawk bash bison sed gcc g++ msgfmt makeinfo \
perl tar xz gzip bzip2 patch flex"
# Required utilities in host system for chroot ops.
readonly REQHOST_UTILS="xbps-install xbps-query xbps-rindex xbps-uhelper \
xbps-reconfigure xbps-remove xbps-create xbps-uchroot xbps-uunshare git"
check_reqhost_utils
if [ -n "$IN_CHROOT" ]; then
readonly XBPS_CONFIG_FILE=/etc/xbps/xbps-src.conf
readonly XBPS_DISTDIR=/void-packages
else
_distdir="$(readlink -f $(dirname $0))"
if [ "${_distdir}" = "." ]; then
readonly XBPS_DISTDIR="$(pwd -P)"
else
readonly XBPS_DISTDIR="${_distdir}"
fi
# Read defaults and then the local configuration file
if [ -f $XBPS_DISTDIR/etc/defaults.conf ]; then
. $XBPS_DISTDIR/etc/defaults.conf
fi
if [ -s $XBPS_DISTDIR/etc/conf ]; then
# Read user configuration first...
readonly XBPS_CONFIG_FILE=$XBPS_DISTDIR/etc/conf
elif [ -s $HOME/.xbps-src.conf ]; then
# ... fallback to ~/.xbps-src.conf otherwise.
readonly XBPS_CONFIG_FILE=$HOME/.xbps-src.conf
. $XBPS_CONFIG_FILE
fi
fi
#
# Check configuration vars before anyting else, and set defaults vars.
#
check_config_vars
if [ -n "$XBPS_HOSTDIR" ]; then
export XBPS_REPOSITORY=$XBPS_HOSTDIR/binpkgs
readonly XBPS_SRCDISTDIR=$XBPS_HOSTDIR/sources
else
export XBPS_REPOSITORY=$XBPS_MASTERDIR/host/binpkgs
readonly XBPS_SRCDISTDIR=$XBPS_MASTERDIR/host/sources
fi
if [ -n "$IN_CHROOT" ]; then
readonly XBPS_UHELPER_CMD="xbps-uhelper"
readonly XBPS_INSTALL_CMD="xbps-install"
readonly XBPS_QUERY_CMD="xbps-query"
readonly XBPS_RINDEX_CMD="xbps-rindex"
readonly XBPS_RECONFIGURE_CMD="xbps-reconfigure"
readonly XBPS_REMOVE_CMD="xbps-remove"
readonly XBPS_SRCPKGDIR=/void-packages/srcpkgs
readonly XBPS_COMMONDIR=/void-packages/common
readonly XBPS_DESTDIR=/destdir
readonly XBPS_BUILDDIR=/builddir
readonly XBPS_SHUTILSDIR=$XBPS_COMMONDIR/xbps-src/shutils
readonly XBPS_TRIGGERSDIR=$XBPS_SRCPKGDIR/xbps-triggers/files
readonly XBPS_CROSSPFDIR=$XBPS_COMMONDIR/cross-profiles
readonly XBPS_BUILDSTYLEDIR=$XBPS_COMMONDIR/build-style
readonly XBPS_LIBEXECDIR=$XBPS_COMMONDIR/xbps-src/libexec
else
readonly XBPS_UHELPER_CMD="xbps-uhelper -r $XBPS_MASTERDIR"
readonly XBPS_INSTALL_CMD="xbps-install -C /dev/null -c $XBPS_HOSTDIR/repocache --repository=$XBPS_REPOSITORY -r $XBPS_MASTERDIR"
readonly XBPS_QUERY_CMD="xbps-query -C /dev/null -c $XBPS_HOSTDIR/repoache -i --repository=$XBPS_REPOSITORY -r $XBPS_MASTERDIR"
readonly XBPS_RINDEX_CMD="xbps-rindex"
readonly XBPS_RECONFIGURE_CMD="xbps-reconfigure -r $XBPS_MASTERDIR"
readonly XBPS_REMOVE_CMD="xbps-remove -r $XBPS_MASTERDIR"
readonly XBPS_SRCPKGDIR=$XBPS_DISTDIR/srcpkgs
readonly XBPS_COMMONDIR=$XBPS_DISTDIR/common
readonly XBPS_SHUTILSDIR=$XBPS_COMMONDIR/xbps-src/shutils
readonly XBPS_DESTDIR=$XBPS_MASTERDIR/destdir
readonly XBPS_BUILDDIR=$XBPS_MASTERDIR/builddir
readonly XBPS_TRIGGERSDIR=$XBPS_SRCPKGDIR/xbps-triggers/files
readonly XBPS_CROSSPFDIR=$XBPS_COMMONDIR/cross-profiles
readonly XBPS_BUILDSTYLEDIR=$XBPS_COMMONDIR/build-style
readonly XBPS_LIBEXECDIR=$XBPS_COMMONDIR/xbps-src/libexec
fi
# XBPS_FETCH_CMD can be overriden
export XBPS_FETCH_CMD="xbps-uhelper fetch"
readonly XBPS_DIGEST_CMD="xbps-uhelper digest"
readonly XBPS_CMPVER_CMD="xbps-uhelper cmpver"
readonly XBPS_TARGET="$1"
if [ -n "$2" ]; then
XBPS_TARGET_PKG="${2##*/}"
fi
# Check if stdout is a tty; if false disable colors.
test -t 1 || export NOCOLORS=1
if [ -f $XBPS_MASTERDIR/.xbps_chroot_init ]; then
export CHROOT_READY=1
fi
if [ -s $XBPS_MASTERDIR/.xbps_chroot_init ]; then
export XBPS_ARCH=$(cat $XBPS_MASTERDIR/.xbps_chroot_init)
if [ "$XBPS_MACHINE" = "x86_64" -a "$XBPS_ARCH" = "i686" -a -z "$IN_CHROOT" ]; then
# reconfigure pkgs via linux32
linux32 xbps-reconfigure -r ${XBPS_MASTERDIR} -a &>/dev/null
# reexec itself via linux32
exec linux32 $0 ${XBPS_OPTIONS} $@
fi
fi
if [ -n "$XBPS_ARCH" ]; then
export XBPS_MACHINE=$XBPS_ARCH
fi
if [ -z "$XBPS_TARGET_MACHINE" ]; then
export XBPS_TARGET_MACHINE=${XBPS_ARCH:=$XBPS_MACHINE}
fi
export XBPS_SHUTILSDIR XBPS_CROSSPFDIR XBPS_TRIGGERSDIR \
XBPS_SRCPKGDIR XBPS_COMMONDIR XBPS_BUILDDIR XBPS_REPO_DELTAS \
XBPS_REPOSITORY XBPS_ALT_REPOSITORY XBPS_SRCDISTDIR XBPS_DIGEST_CMD \
XBPS_UHELPER_CMD XBPS_INSTALL_CMD XBPS_QUERY_CMD \
XBPS_RINDEX_CMD XBPS_RECONFIGURE_CMD XBPS_REMOVE_CMD \
XBPS_CMPVER_CMD XBPS_FETCH_CMD XBPS_VERSION XBPS_APIVER \
XBPS_BUILDSTYLEDIR XBPS_CPPFLAGS XBPS_CFLAGS XBPS_CXXFLAGS XBPS_LDFLAGS \
XBPS_MAKEJOBS XBPS_BUILD_FORCEMODE XBPS_USE_GIT_REVS XBPS_DEBUG_PKGS \
XBPS_CCACHE XBPS_DISTCC XBPS_DISTCC_HOSTS XBPS_SKIP_DEPS \
XBPS_SKIP_REMOTEREPOS XBPS_CROSS_BUILD XBPS_PKG_OPTIONS \
XBPS_CONFIG_FILE XBPS_KEEP_ALL XBPS_HOSTDIR XBPS_MASTERDIR \
XBPS_SRC_VERSION XBPS_DESTDIR XBPS_MACHINE XBPS_TEMP_MASTERDIR \
XBPS_BINPKG_EXISTS XBPS_LIBEXECDIR XBPS_DISTDIR XBPS_DISTFILES_MIRROR
for i in REPOSITORY DESTDIR BUILDDIR SRCDISTDIR; do
eval val="\$XBPS_$i"
if [ ! -d "$val" ]; then
mkdir -p $val
fi
unset val
done
# A temporary masterdir requires xbps-uchroot(8) and -O to use overlayfs
# on tmpfs (available with xbps-0.45).
if [ -z "$IN_CHROOT" -a -n "$XBPS_TEMP_MASTERDIR" ]; then
if [ "$XBPS_CHROOT_CMD" != "uchroot" ]; then
echo "ERROR: -t requires XBPS_CHROOT_CMD=uchroot, exiting..."
exit 1
fi
export XBPS_CHROOT_CMD_ARGS="-O"
fi
#
# Sanitize PATH.
#
if [ -z "$IN_CHROOT" ]; then
# In non chroot case always prefer host tools.
MYPATH="$XBPS_MASTERDIR/usr/bin:$XBPS_MASTERDIR/usr/sbin"
export PATH="$PATH:$MYPATH"
else
MYPATH="/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin"
export PATH="$MYPATH"
if [ -n "$XBPS_CCACHE" ]; then
CCACHEPATH="/usr/lib/ccache/bin"
export CCACHE_DIR="$XBPS_HOSTDIR/ccache"
# Avoid not using cached files just due to compiler mtime
# changes when e.g. bootstrapping
export CCACHE_COMPILERCHECK=content
export PATH="$CCACHEPATH:$PATH"
mkdir -p $CCACHE_DIR
fi
if [ -n "$XBPS_DISTCC" ]; then
if [ -n "$XBPS_CCACHE" ]; then
export CCACHE_PREFIX="/usr/bin/distcc"
else
DISTCCPATH="/usr/lib/distcc/bin"
export PATH="$DISTCCPATH:$PATH"
fi
export DISTCC_DIR="$XBPS_HOSTDIR/distcc-${XBPS_CROSS_BUILD:-${XBPS_MACHINE}}"
export DISTCC_HOSTS="$XBPS_DISTCC_HOSTS"
mkdir -p $DISTCC_DIR
fi
fi
check_build_requirements
if [ -z "$IN_CHROOT" ]; then
trap 'exit_func' INT TERM
if [ -n "$XBPS_DISTFILES_MIRROR" ]; then
setup_distfiles_mirror
fi
fi
reconfigure_bootstrap_pkgs
#
# Main switch.
#
case "$XBPS_TARGET" in
binary-bootstrap)
install_bbootstrap ${XBPS_TARGET_PKG:=$XBPS_MACHINE}
;;
bootstrap)
# bootstrap from sources
# check for required host utils
check_reqhost_utils bootstrap
[ ! -d $XBPS_SRCPKGDIR/base-chroot ] && \
msg_error "Cannot find $XBPS_SRCPKGDIR/base-chroot directory!\n"
bootstrap_vpkg=${XBPS_MASTERDIR}/etc/xbps.d/bootstrap-vpkgs.conf
mkdir -p ${XBPS_MASTERDIR}/etc/xbps.d
if [ ! -s ${bootstrap_vpkg} ]; then
# Fool xbps to resolve dependencies.
echo 'virtualpkg=libgcc-4.4.0_1:base-files' >> ${bootstrap_vpkg}
echo 'virtualpkg=libstdc++-4.4.0_1:base-files' >> ${bootstrap_vpkg}
fi
$XBPS_LIBEXECDIR/build.sh base-chroot base-chroot $XBPS_TARGET || exit 1
[ -d $XBPS_MASTERDIR ] && rm -rf $XBPS_MASTERDIR
install_bbootstrap bootstrap
;;
bootstrap-update)
bootstrap_update
;;
chroot)
chroot_handler chroot dummy
;;
clean)
if [ -z "$XBPS_TARGET_PKG" ]; then
if [ -n "$CHROOT_READY" -a -z "$IN_CHROOT" ]; then
chroot_handler remove-autodeps
else
remove_pkg_autodeps
fi
msg_normal "xbps-src: cleaning up masterdir...\n"
rm -rf $XBPS_MASTERDIR/builddir $XBPS_MASTERDIR/destdir
rm -f $XBPS_MASTERDIR/tmp/* >/dev/null 2>&1
else
read_pkg
if [ -n "$CHROOT_READY" -a -z "$IN_CHROOT" ]; then
chroot_handler $XBPS_TARGET $XBPS_TARGET_PKG || exit $?
else
remove_pkg_wrksrc $wrksrc
remove_pkg_statedir
if declare -f do_clean >/dev/null; then
run_func do_clean
fi
fi
remove_pkg $XBPS_CROSS_BUILD
fi
;;
remove-autodeps)
if [ -n "$CHROOT_READY" -a -z "$IN_CHROOT" ]; then
chroot_handler remove-autodeps
else
remove_pkg_autodeps
fi
;;
fetch|extract|build|configure|install|pkg)
read_pkg
if [ -n "$CHROOT_READY" -a -z "$IN_CHROOT" ]; then
chroot_handler $XBPS_TARGET $XBPS_TARGET_PKG
else
[ -z "$XBPS_KEEP_ALL" -a -z "$XBPS_SKIP_DEPS" ] && remove_pkg_autodeps
$XBPS_LIBEXECDIR/build.sh $XBPS_TARGET_PKG $XBPS_TARGET_PKG \
$XBPS_TARGET $XBPS_CROSS_BUILD || exit $?
fi
;;
remove|remove-destdir)
read_pkg
remove_pkg $XBPS_CROSS_BUILD
;;
list)
$XBPS_QUERY_CMD -l
;;
purge-distfiles)
purge_distfiles
;;
show)
read_pkg
show_pkg
;;
show-avail)
read_pkg
show_avail
;;
show-files)
read_pkg
show_pkg_files
;;
show-deps)
read_pkg
show_pkg_deps
;;
show-build-deps)
read_pkg
show_pkg_build_deps
;;
show-options)
read_pkg
show_pkg_build_options
;;
show-shlib-provides)
read_pkg
show_pkg_shlib_provides
;;
show-shlib-requires)
read_pkg
show_pkg_shlib_requires
;;
show-var)
eval value="\${$XBPS_TARGET_PKG}"
echo $value
;;
show-repo-updates)
bulk_build
;;
show-sys-updates)
bulk_build -i
;;
sort-dependencies)
bulk_sortdeps ${@/$XBPS_TARGET/}
;;
update-bulk)
bulk_update
;;
update-sys)
bulk_update -i
;;
update-check)
read_pkg
update_check
;;
update-hash-cache)
update_hash_cache
;;
zap)
masterdir_zap
;;
*)
msg_red "xbps-src: invalid target $XBPS_TARGET.\n"
usage && exit 1
;;
esac
exit_and_cleanup $?