827 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			827 lines
		
	
	
		
			27 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).
 | |
| 
 | |
| check <pkgname>
 | |
|     Run the package check(s) after building the package source.
 | |
| 
 | |
| 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="1a:CEfgGhH:iIj:Lm:No:qQr: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
 | |
|         1) export XBPS_BUILD_ONLY_ONE_PKG=yes; XBPS_OPTIONS+=" -1";;
 | |
|         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 -f $OPTARG 2>/dev/null)"; XBPS_OPTIONS+=" -H $XBPS_HOSTDIR";;
 | |
|         h) usage && exit 0;;
 | |
|         i) export XBPS_INFORMATIVE_RUN=1; XBPS_OPTIONS+=" -i";;
 | |
|         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 -f $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";;
 | |
|         q) export XBPS_QUIET=1; XBPS_OPTIONS+=" -q";;
 | |
|         Q) export XBPS_CHECK_PKGS=0; XBPS_OPTIONS+=" -Q";;
 | |
|         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/repocache -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=${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_BUILD_ONLY_ONE_PKG \
 | |
|     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_CHECK_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|check|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-problems
 | |
|         show_pkg
 | |
|         ;;
 | |
|     show-avail)
 | |
|         read_pkg
 | |
|         show_avail
 | |
|         ;;
 | |
|     show-files)
 | |
|         read_pkg ignore-problems
 | |
|         show_pkg_files
 | |
|         ;;
 | |
|     show-deps)
 | |
|         read_pkg ignore-problems
 | |
|         show_pkg_deps
 | |
|         ;;
 | |
|     show-build-deps)
 | |
|         read_pkg ignore-problems
 | |
|         show_pkg_build_deps
 | |
|         ;;
 | |
|     show-pkg-var)
 | |
|         read_pkg ignore-problems
 | |
|         for sub_name in $subpackages; do
 | |
|             if [ $sub_name = $XBPS_TARGET_PKG ]; then
 | |
|                 ${sub_name}_package
 | |
|             fi
 | |
|         done
 | |
| 	while IFS= read -r pkg_var; do
 | |
| 		print_var=
 | |
| 		case "${pkg_var}" in
 | |
| 		    bootstrap) print_var="$bootstrap ";;
 | |
| 		    broken) print_var="$broken ";;
 | |
| 		    depends) print_var="$depends ";;
 | |
| 		    hostmakedepends) print_var="$hostmakedepends ";;
 | |
| 		    makedepends) print_var="$makedepends ";;
 | |
| 		    noarch) print_var="$noarch ";;
 | |
| 		    nocross) print_var="$nocross ";;
 | |
| 		    only_for_archs) print_var="$only_for_archs ";;
 | |
| 		    pkgname) print_var="$pkgname ";;
 | |
| 		    restricted) print_var="$restricted ";;
 | |
| 		    revision) print_var="$revision ";;
 | |
| 		    subpackages) print_var="$subpackages ";;
 | |
| 		    version) print_var="$version ";;
 | |
| 		esac # the space at the end of each is essential for unset vars
 | |
| 		if [ -n "$print_var" ]; then
 | |
| 			printf "%s\n" "$(printf "${print_var% }" | tr -t '\n\r' ' ')"
 | |
| 		fi # The trailing space gets stripped before printing anyway
 | |
| 	done
 | |
|         ;;
 | |
|     show-options)
 | |
|         read_pkg ignore-problems
 | |
|         show_pkg_build_options
 | |
|         ;;
 | |
|     show-shlib-provides)
 | |
|         read_pkg ignore-problems
 | |
|         show_pkg_shlib_provides
 | |
|         ;;
 | |
|     show-shlib-requires)
 | |
|         read_pkg ignore-problems
 | |
|         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 ignore-problems
 | |
|         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 $?
 | 
