#!/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. #- readonly XBPS_SRC_BUILD_VERSION=20111115-1 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 xbps-bin.static \ xbps-repo.static xbps-uhelper.static" check_reqhost_utils() { local broken [ -n "$IN_CHROOT" ] && 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 . bootstrap-update Updates bootstrap packages with latest versions available from registered repositories in the XBPS configuration file, by default set to /usr/local/etc/xbps/repositories.plist. build [pkgname] Build package source (fetch + extract + configure + build). build-pkg [pkgname|all] Build a binary package from or all packages with the keyword. The package(s) must be installed into for this to work. checkvers Checks installed package versions in against the srcpkgs tree for new available versions. chroot Enter to the chroot in . clean [pkgname] Remove 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 /builddir. fetch [pkgname] Download package source distribution file(s). install [pkgname] Installs a package into destination directory and \`stows' its files into . If a package is not from bootstrap group, its files will be symlinked rather than being fully copied. list List installed packages in . make-repoidx Build a package index for the local repository associated with the master directory . By default set to . remove [pkgname] Remove package completely from and . show [pkgname] Show information for the specified package. show-files Show package files from . Package must be fully installed into for this to work (stowed). show-revdeps Show reverse dependencies for , i.e packages that are currently depending on . stow [pkgname] Stow files from into and register package in database. When a package is \`stowed', its files will be available in , and other packages will be able to found it. unstow [pkgname] Remove files from 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 . 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 to package's destdir (set to /destdir/- 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 /host/binpkgs or if XBPS_HOSTDIR is set /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 /host/sources or if XBPS_HOSTDIR is set /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 [ ! -w "$XBPS_MASTERDIR" ]; then echo "ERROR: not enough perms for masterdir $XBPS_MASTERDIR.\n" exit 1 fi } # # main() # while getopts "CBc:DhKm:p:Ss:V" 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";; V) echo $XBPS_SRC_BUILD_VERSION && exit 0;; --) 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="$MYPATH:$XBPS_MASTERDIR/usr/local/bin" MYPATH="$MYPATH:$XBPS_MASTERDIR/usr/local/sbin" 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) 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 ;; make-repoidx) if [ -n "${_PACKAGEDIR}" ]; then export XBPS_PACKAGESDIR=${_PACKAGEDIR} fi make_repoidx ;; 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 ;; show) if [ -z "${_pkgname}" ]; then [ ! -r ./template ] && msg_error "missing build template in $(pwd).\n" _pkgname=$(basename_cwd) fi setup_tmpl ${_pkgname} info_tmpl ;; show-files) list_pkg_files ${_pkgname} ;; show-revdeps) show_pkg_revdeps ${_pkgname} ;; 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) else pkgname=${_pkgname} fi stow_pkg_handler unstow ;; *) msg_red "xbps-src: invalid target $target.\n" usage && exit 1 esac # Agur exit $?