This still isn't perfect. When the common/xbps-src/shutils/chroot.sh function chroot_init() is called, the value for $XBPS_FFLAGS, which is defined in common/build-profiles/bootstrap.sh, is empty. Put the immediate value into the generated /etc/xbps/xbps-src.conf file until someone finds out where passing the value of $XBPS_FFLAGS throughout the scripts is missing.
		
			
				
	
	
		
			792 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			792 lines
		
	
	
		
			25 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).
 | 
						|
 | 
						|
consistency-check
 | 
						|
    Runs a consistency check on all packages
 | 
						|
 | 
						|
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  <target>
 | 
						|
    Cross compile packages for this target machine. 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.
 | 
						|
    This flag requires xbps-uchroot(1).
 | 
						|
 | 
						|
_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
 | 
						|
        if [ -n "$IN_CHROOT" ]; then
 | 
						|
            _gitbranch="$(chroot-git symbolic-ref --short HEAD 2>/dev/null)"
 | 
						|
        else
 | 
						|
            _gitbranch="$(git symbolic-ref --short HEAD 2>/dev/null)"
 | 
						|
        fi
 | 
						|
        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="glibc-locales 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_configured; 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" "$1"
 | 
						|
}
 | 
						|
 | 
						|
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)
 | 
						|
readonly XBPS_GCC_VERSION_MAJOR=6
 | 
						|
readonly XBPS_GCC_VERSION_MINOR=3
 | 
						|
readonly XBPS_GCC_VERSION_BUILD=0
 | 
						|
readonly XBPS_GCC_VERSION=${XBPS_GCC_VERSION_MAJOR}.${XBPS_GCC_VERSION_MINOR}.${XBPS_GCC_VERSION_BUILD}
 | 
						|
 | 
						|
#
 | 
						|
# main()
 | 
						|
#
 | 
						|
XBPS_OPTIONS=
 | 
						|
XBPS_OPTSTRING="a:CEfgGhH:Ij:Lm:No:r:tV"
 | 
						|
 | 
						|
# Preprocess arguments in order to allow options before and after XBPS_TARGET.
 | 
						|
eval set -- $(getopt -- "$XBPS_OPTSTRING" "$@");
 | 
						|
 | 
						|
while getopts "$XBPS_OPTSTRING" 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 automake libtool pkg-config"
 | 
						|
 | 
						|
# 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 [ -z "$XBPS_REINIT" -a -s $XBPS_MASTERDIR/.xbps_chroot_init ]; then
 | 
						|
    export XBPS_ARCH=$(cat $XBPS_MASTERDIR/.xbps_chroot_init)
 | 
						|
    if [[ $XBPS_MACHINE == x86_64* ]] && [[ $XBPS_ARCH == i686* ]]; then
 | 
						|
        # reconfigure pkgs via linux32
 | 
						|
        linux32 xbps-reconfigure -r ${XBPS_MASTERDIR} -a &>/dev/null
 | 
						|
        # reexec itself via linux32
 | 
						|
        export XBPS_REINIT=1
 | 
						|
        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_FFLAGS 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 XBPS_ALLOW_RESTRICTED \
 | 
						|
    XBPS_USE_GIT_COMMIT_DATE XBPS_PKG_COMPTYPE
 | 
						|
 | 
						|
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
 | 
						|
    export XBPS_CHROOT_CMD="uchroot"
 | 
						|
    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
 | 
						|
        ;;
 | 
						|
    consistency-check)
 | 
						|
        consistency_check
 | 
						|
        ;;
 | 
						|
    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 ignore-broken
 | 
						|
        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)
 | 
						|
        for f in ${XBPS_COMMONDIR}/environment/setup/*.sh; do
 | 
						|
            source $f
 | 
						|
        done
 | 
						|
        source ${XBPS_COMMONDIR}/build-profiles/${XBPS_MACHINE}.sh
 | 
						|
        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 $?
 |