b1dcc3623a
This target will update the bootstrap packages in masterdir (if it was installed thru binary packages) to the most newer version available in registered repositories.
510 lines
13 KiB
Bash
510 lines
13 KiB
Bash
#!/bin/sh
|
|
#
|
|
# Copyright (c) 2008-2011 Juan Romero Pardines.
|
|
# All rights reserved.
|
|
#
|
|
# Redistribution and use in source and binary forms, with or without
|
|
# modification, are permitted provided that the following conditions
|
|
# are met:
|
|
# 1. Redistributions of source code must retain the above copyright
|
|
# notice, this list of conditions and the following disclaimer.
|
|
# 2. Redistributions in binary form must reproduce the above copyright
|
|
# notice, this list of conditions and the following disclaimer in the
|
|
# documentation and/or other materials provided with the distribution.
|
|
#
|
|
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
#-
|
|
|
|
XBPS_CONFIG_FILE=@@XBPS_INSTALL_ETCDIR@@/xbps-src.conf
|
|
|
|
progname=$(basename $0)
|
|
fakeroot_cmd=/usr/bin/fakeroot
|
|
fakeroot_cmd_args="--"
|
|
sudo_cmd=sudo
|
|
chroot_cmd=chroot
|
|
xbps_machine=$(uname -m)
|
|
|
|
# Required utilities in host system.
|
|
REQHOST_UTILS="awk bash bison sed gcc msgfmt patch makeinfo \
|
|
perl fakeroot tar xz gzip bzip2"
|
|
|
|
check_reqhost_utils()
|
|
{
|
|
local broken
|
|
|
|
[ -n "$IN_CHROOT" ] && return 0
|
|
[ -r "$XBPS_MASTERDIR/.xbps_perms_done" ] && return 0
|
|
|
|
for f in ${REQHOST_UTILS}; do
|
|
if ! command -v ${f} 2>&1 >/dev/null; then
|
|
echo "${f} is missing in your system, can't continue!"
|
|
broken=1
|
|
fi
|
|
done
|
|
|
|
[ -n "$broken" ] && exit 1
|
|
}
|
|
|
|
usage()
|
|
{
|
|
cat << _EOF
|
|
$progname: [-BCDhKS] [-c file] [-m dir] [-p dir] [-s dir] [target] [pkgname]
|
|
|
|
Targets:
|
|
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, by default set to
|
|
<masterdir>/usr/local/etc/xbps-conf.plist.
|
|
|
|
build [pkgname]
|
|
Build package source (fetch + extract + configure + build).
|
|
|
|
build-pkg [pkgname|all]
|
|
Build a binary package from <pkgname> or all packages with the <all>
|
|
keyword. The package(s) must be installed into <destdir> for this to work.
|
|
|
|
checkvers
|
|
Checks installed package versions in <masterdir> against the srcpkgs tree
|
|
for new available versions.
|
|
|
|
chroot
|
|
Enter to the chroot in <masterdir>.
|
|
|
|
clean [pkgname]
|
|
Remove <pkgname> build directory.
|
|
|
|
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).
|
|
|
|
info [pkgname]
|
|
Show information for the specified package.
|
|
|
|
install [pkgname]
|
|
Installs a package into destination directory and \`stows' its files into
|
|
<masterdir>. If a package is not from bootstrap group, its files will be
|
|
symlinked rather than being fully copied.
|
|
|
|
list
|
|
List installed packages in <masterdir>.
|
|
|
|
list-files <pkgname>
|
|
List package files from <pkgname>. Package must be fully installed
|
|
into <masterdir> for this to work.
|
|
|
|
make-repoidx
|
|
Build a package index for the local repository associated with the
|
|
master directory <masterdir>. By default set to <masterdir/host/binpkgs.
|
|
To specify another repo, use -p <dir>.
|
|
|
|
remove [pkgname]
|
|
Remove package completely from <destdir> and <masterdir>.
|
|
|
|
stow [pkgname]
|
|
Stow <pkgname> files from <destdir> into <masterdir> and register package
|
|
in database. When a package is \`stown', its files will be available in
|
|
<masterdir>, and other packages will be able to found it.
|
|
|
|
unstow [pkgname]
|
|
Remove <pkgname> files from <masterdir> and unregister package
|
|
from database.
|
|
|
|
On targets that accept [pkgname], a package name can be specified and xbps-src
|
|
will execute the task on any CWD (Current Working Directory). If the argument
|
|
is omitted xbps-src assumes that CWD is in the target package. Example:
|
|
|
|
$ cd srcpkgs/libX11 && xbps-src install
|
|
$ xbps-src install libX11
|
|
|
|
Both ways are equivalent.
|
|
|
|
Options:
|
|
-B Used in the install target, a binary package is built for any
|
|
required dependency as well as for <pkgname>. The local repository
|
|
pkg-index is created or updated after a successful package installation.
|
|
-C Do not remove build directory after successful installation.
|
|
-c Path to global configuration file:
|
|
if not specified @@XBPS_INSTALL_ETCDIR@@/xbps-src.conf is used.
|
|
-D Only install <pkgname> to package's destdir (set to
|
|
<masterdir>/destdir/<pkgname>-<version> by default).
|
|
-h Usage output.
|
|
-K Do not remove automatic package dependencies while building
|
|
or installing a package with XBPS_PREFER_BINPKG_DEPS enabled.
|
|
-m Master directory, overwritting the value set in the configuration
|
|
file xbps-src.conf.
|
|
-p Local packages repository, overwritting default path at
|
|
<masterdir>/host/binpkgs or if XBPS_HOSTDIR is set <hostdir>/binpkgs.
|
|
-S Overrides and disables XBPS_PREFER_BINPKG_DEPS even if it was
|
|
set in the configuration file xbps-src.conf.
|
|
-s Source distribution files directory, overwritting default path at
|
|
<masterdir>/host/sources or if XBPS_HOSTDIR is set <hostdir>/sources.
|
|
_EOF
|
|
}
|
|
|
|
basename_cwd()
|
|
{
|
|
echo $(basename $(pwd))
|
|
}
|
|
|
|
check_path()
|
|
{
|
|
eval local orig="$1"
|
|
|
|
case "$orig" in
|
|
/) ;;
|
|
/*) orig="${orig%/}" ;;
|
|
*) orig="$(pwd)/${orig%/}" ;;
|
|
esac
|
|
|
|
path_fixed="$orig"
|
|
}
|
|
|
|
run_file()
|
|
{
|
|
local file="$1"
|
|
|
|
check_path "$file"
|
|
. $path_fixed
|
|
}
|
|
|
|
check_config_vars()
|
|
{
|
|
local val cffound f cfpaths cf="xbps-src.conf"
|
|
|
|
if [ -z "$XBPS_CONFIG_FILE" ]; then
|
|
cfpaths="@@XBPS_INSTALL_PREFIX@@/etc/${cf} ./etc/${cf}"
|
|
for f in $cfpaths; do
|
|
if [ -f ${f} ]; then
|
|
XBPS_CONFIG_FILE=${f}
|
|
cffound=yes
|
|
break
|
|
fi
|
|
done
|
|
[ -z "$cffound" ] && msg_error "cannot find a config file\n"
|
|
fi
|
|
|
|
run_file ${XBPS_CONFIG_FILE}
|
|
export XBPS_CONFIG_FILE=$path_fixed
|
|
|
|
if [ ! -f "$XBPS_CONFIG_FILE" ]; then
|
|
msg_error "cannot find configuration file: $XBPS_CONFIG_FILE\n"
|
|
fi
|
|
|
|
for f in XBPS_DISTRIBUTIONDIR XBPS_MASTERDIR; do
|
|
eval val="\$${f}"
|
|
if [ -z "$val" ]; then
|
|
msg_error "'${f}' not set in configuration file!\n"
|
|
fi
|
|
done
|
|
if [ ! -d "$XBPS_MASTERDIR" ]; then
|
|
mkdir -p "$val"
|
|
if [ $? -ne 0 ]; then
|
|
msg_error "couldn't create 'XBPS_MASTERDIR' directory\n"
|
|
fi
|
|
fi
|
|
[ -z "${_MASTERDIR_FLAG}" ] && export _MASTERDIR="$XBPS_MASTERDIR"
|
|
}
|
|
|
|
#
|
|
# main()
|
|
#
|
|
while getopts "CBc:DhKm:p:Ss:" opt; do
|
|
case $opt in
|
|
B) export BUILD_BINPKG=1;;
|
|
C) export KEEP_WRKSRC=1;;
|
|
c) XBPS_CONFIG_FILE="$OPTARG";;
|
|
D) export DESTDIR_ONLY_INSTALL=1;;
|
|
h) usage && exit 0;;
|
|
K) export KEEP_AUTODEPS=1;;
|
|
m)
|
|
_MASTERDIR_FLAG=1
|
|
_MASTERDIR="$OPTARG"
|
|
if [ ! -d ${_MASTERDIR} ]; then
|
|
mkdir -p ${_MASTERDIR}
|
|
fi
|
|
;;
|
|
p)
|
|
_PACKAGEDIR="$OPTARG"
|
|
if [ ! -d ${_PACKAGEDIR} ]; then
|
|
mkdir -p ${_PACKAGEDIR}/${xbps_machine}
|
|
mkdir -p ${_PACKAGEDIR}/noarch
|
|
fi
|
|
;;
|
|
S) UNSET_PREFER_BINPKG_DEPS=1;;
|
|
s) export XBPS_SRCDISTDIR="$OPTARG";;
|
|
--) shift; break;;
|
|
esac
|
|
done
|
|
shift $(($OPTIND - 1))
|
|
|
|
[ $# -eq 0 -o $# -gt 2 ] && usage && exit 1
|
|
|
|
target="$1"
|
|
_pkgname="$2"
|
|
|
|
if [ -z "$target" ]; then
|
|
echo "=> ERROR: missing target."
|
|
usage && exit 1
|
|
fi
|
|
|
|
if [ -n "$IN_CHROOT" ]; then
|
|
XBPS_CONFIG_FILE="/usr/local/etc/xbps-src.conf"
|
|
fi
|
|
|
|
#
|
|
# Check configuration vars before anyting else, and set defaults vars.
|
|
#
|
|
check_config_vars
|
|
if [ -n "${_MASTERDIR}" ]; then
|
|
export XBPS_MASTERDIR=${_MASTERDIR}
|
|
fi
|
|
. @@XBPS_INSTALL_SHAREDIR@@/shutils/init_funcs.sh
|
|
set_defvars
|
|
for f in $XBPS_SHUTILSDIR/*.sh; do
|
|
[ -r "$f" ] && . $f
|
|
done
|
|
|
|
# Disable XBPS_PREFER_BINPKG_DEPS if requested.
|
|
[ -n "$UNSET_PREFER_BINPKG_DEPS" ] && unset XBPS_PREFER_BINPKG_DEPS
|
|
|
|
#
|
|
# Check for required utilities in host system.
|
|
#
|
|
check_reqhost_utils
|
|
|
|
#
|
|
# Fix up some vars when XBPS_USE_CAPABILITIES is set.
|
|
#
|
|
if [ -n "$XBPS_USE_CAPABILITIES" ]; then
|
|
chroot_cmd="@@XBPS_INSTALL_LIBEXECDIR@@/capchroot"
|
|
unset sudo_cmd
|
|
fi
|
|
|
|
if [ "$(id -u)" -eq 0 ]; then
|
|
# disable sudo and fakeroot if uid==0
|
|
chroot_cmd="chroot"
|
|
unset sudo_cmd
|
|
if [ -n "$IN_CHROOT" ]; then
|
|
unset fakeroot_cmd
|
|
unset fakeroot_cmd_args
|
|
fi
|
|
fi
|
|
|
|
#
|
|
# Sanitize PATH.
|
|
#
|
|
if [ -z "$IN_CHROOT" ]; then
|
|
# In non chroot case always prefer host tools.
|
|
MYPATH="$PATH:$XBPS_MASTERDIR/bin:$XBPS_MASTERDIR/usr/bin"
|
|
MYPATH="$XBPS_MASTERDIR/usr/local/bin:$MYPATH"
|
|
MYPATH="$XBPS_MASTERDIR/usr/local/sbin:$MYPATH"
|
|
else
|
|
if [ -n "$XBPS_CCACHE" ]; then
|
|
CCACHEPATH="/usr/lib/ccache/bin"
|
|
if [ -n "$XBPS_HOSTDIR" ]; then
|
|
[ ! -d "$XBPS_HOSTDIR/ccache" ] && \
|
|
mkdir -p $XBPS_HOSTDIR/ccache
|
|
export CCACHE_DIR="$XBPS_HOSTDIR/ccache"
|
|
else
|
|
[ ! -d "$XBPS_MASTERDIR/host/ccache" ] && \
|
|
mkdir -p $XBPS_MASTERDIR/host/ccache
|
|
export CCACHE_DIR="$XBPS_MASTERDIR/host/ccache"
|
|
fi
|
|
fi
|
|
# In chroot always prefer tools from bootstrap.
|
|
MYPATH="$CCACHEPATH:/tools/bin:/usr/local/sbin:/bin:/usr/bin"
|
|
MYPATH="$MYPATH:/sbin:/usr/local/bin:/usr/sbin"
|
|
fi
|
|
export PATH="$MYPATH"
|
|
|
|
#
|
|
# If masterdir is ready (base-chroot installed and chroot set up) and
|
|
# XBPS_PREFER_BINPKG_DEPS enabled, force ignoring rules to handle
|
|
# bootstrap packages.
|
|
#
|
|
if [ -n "$DESTDIR_ONLY_INSTALL" -a -n "$XBPS_PREFER_BINPKG_DEPS" \
|
|
-a -f "$XBPS_MASTERDIR/.xbps_perms_done" ]; then
|
|
export BOOTSTRAP_PKG_REBUILD=1
|
|
fi
|
|
|
|
#
|
|
# Main switch.
|
|
#
|
|
case "$target" in
|
|
bootstrap)
|
|
[ ! -d $XBPS_SRCPKGDIR/base-chroot ] && \
|
|
msg_error "Cannot find $XBPS_SRCPKGDIR/base-chroot directory!\n"
|
|
cd $XBPS_SRCPKGDIR/base-chroot && _ORIGINPKG="$(basename_cwd)"
|
|
setup_tmpl ${_ORIGINPKG} && install_pkg $pkgname
|
|
;;
|
|
bootstrap-update)
|
|
if [ -z "$IN_CHROOT" ]; then
|
|
xbps_chroot_handler ${target} dummy
|
|
else
|
|
${fakeroot_cmd} ${fakeroot_cmd_args} ${XBPS_BIN_CMD} -y autoupdate
|
|
fi
|
|
;;
|
|
build|configure)
|
|
if [ -z "${_pkgname}" ]; then
|
|
[ ! -r ./template ] && msg_error "missing build template in $(pwd).\n"
|
|
. ./template
|
|
_pkgname=$(basename_cwd)
|
|
fi
|
|
|
|
if [ -z "$bootstrap" -a -z "$IN_CHROOT" ]; then
|
|
xbps_chroot_handler $target ${_pkgname}
|
|
else
|
|
_ORIGINPKG="${_pkgname}"
|
|
setup_tmpl ${_ORIGINPKG}
|
|
# If pkg has dependencies, install them first.
|
|
install_dependencies_pkg "$pkgname-$version"
|
|
if [ $? -ne 0 ]; then
|
|
msg_red "cannot install required deps for $pkgname.\n"
|
|
exit 1
|
|
fi
|
|
# All deps were installed, continue with the origin pkg...
|
|
setup_tmpl ${_ORIGINPKG}
|
|
fetch_distfiles || exit $?
|
|
if [ ! -f "$XBPS_EXTRACT_DONE" ]; then
|
|
extract_distfiles || exit $?
|
|
fi
|
|
if [ "$target" = "configure" ]; then
|
|
configure_src_phase || exit $?
|
|
else
|
|
if [ ! -f "$XBPS_CONFIGURE_DONE" ]; then
|
|
configure_src_phase || exit $?
|
|
fi
|
|
build_src_phase || exit $?
|
|
fi
|
|
fi
|
|
;;
|
|
build-pkg)
|
|
if [ -n "${_PACKAGEDIR}" ]; then
|
|
export XBPS_PACKAGESDIR=${_PACKAGEDIR}
|
|
fi
|
|
if [ "$2" = "all" ]; then
|
|
for f in $($XBPS_BIN_CMD list|awk '{print $1}'); do
|
|
pkg=$(${XBPS_PKGDB_CMD} getpkgname $f)
|
|
setup_tmpl $pkg
|
|
if [ "${pkg}" = "${sourcepkg}" ]; then
|
|
xbps_make_binpkg
|
|
fi
|
|
done
|
|
else
|
|
if [ -z "${_pkgname}" ]; then
|
|
[ ! -r ./template ] && msg_error "missing build template in $(pwd).\n"
|
|
_pkgname=$(basename_cwd)
|
|
fi
|
|
setup_tmpl ${_pkgname}
|
|
xbps_make_binpkg
|
|
fi
|
|
;;
|
|
checkvers)
|
|
check_installed_packages
|
|
;;
|
|
chroot)
|
|
xbps_chroot_handler chroot dummy
|
|
;;
|
|
clean)
|
|
if [ -z "${_pkgname}" ]; then
|
|
[ ! -r ./template ] && msg_error "missing build template in $(pwd).\n"
|
|
_pkgname=$(basename_cwd)
|
|
fi
|
|
setup_tmpl ${_pkgname}
|
|
remove_tmpl_wrksrc $wrksrc
|
|
;;
|
|
extract|fetch|info)
|
|
if [ -z "${_pkgname}" ]; then
|
|
[ ! -r ./template ] && msg_error "missing build template in $(pwd).\n"
|
|
_pkgname=$(basename_cwd)
|
|
fi
|
|
setup_tmpl ${_pkgname}
|
|
if [ "$target" = "info" ]; then
|
|
info_tmpl
|
|
exit $?
|
|
fi
|
|
fetch_distfiles $update_checksum
|
|
[ "$target" = "extract" ] && extract_distfiles
|
|
;;
|
|
install)
|
|
if [ -z "${_pkgname}" ]; then
|
|
[ ! -r ./template ] && msg_error "missing build template in $(pwd).\n"
|
|
_pkgname=$(basename_cwd)
|
|
fi
|
|
setup_tmpl ${_pkgname}
|
|
_ORIGINPKG="${_pkgname}"
|
|
if [ -z "$IN_CHROOT" -a -z "$bootstrap" ]; then
|
|
xbps_chroot_handler $target ${_ORIGINPKG} || exit $?
|
|
else
|
|
install_pkg $pkgname || exit $?
|
|
fi
|
|
;;
|
|
list)
|
|
$XBPS_BIN_CMD list
|
|
;;
|
|
list-files)
|
|
list_pkg_files ${_pkgname}
|
|
;;
|
|
make-repoidx)
|
|
if [ -n "${_PACKAGEDIR}" ]; then
|
|
export XBPS_PACKAGESDIR=${_PACKAGEDIR}
|
|
fi
|
|
msg_normal "Updating pkg-index for local repository at:\n"
|
|
msg_normal " $XBPS_PACKAGESDIR\n"
|
|
${XBPS_REPO_CMD} genindex ${XBPS_PACKAGESDIR} 2>/dev/null
|
|
;;
|
|
remove)
|
|
if [ -z "${_pkgname}" ]; then
|
|
[ ! -r ./template ] && msg_error "missing build template in $(pwd).\n"
|
|
_pkgname=$(basename_cwd)
|
|
fi
|
|
setup_tmpl ${_pkgname}
|
|
if [ -z "$IN_CHROOT" -a -z "$bootstrap" ]; then
|
|
xbps_chroot_handler $target ${_pkgname}
|
|
else
|
|
remove_pkg
|
|
fi
|
|
;;
|
|
stow)
|
|
stow_flag=yes
|
|
if [ -z "${_pkgname}" ]; then
|
|
[ ! -r ./template ] && msg_error "missing build template in $(pwd).\n"
|
|
_pkgname=$(basename_cwd)
|
|
fi
|
|
setup_tmpl ${_pkgname}
|
|
stow_pkg_handler stow
|
|
;;
|
|
unstow)
|
|
if [ -z "${_pkgname}" ]; then
|
|
[ ! -r ./template ] && msg_error "missing build template in $(pwd).\n"
|
|
_pkgname=$(basename_cwd)
|
|
fi
|
|
setup_tmpl ${_pkgname}
|
|
stow_pkg_handler unstow
|
|
;;
|
|
*)
|
|
msg_red "xbps-src: invalid target $target.\n"
|
|
usage && exit 1
|
|
esac
|
|
|
|
# Agur
|
|
exit $?
|