#!/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)} : ${XBPS_UTILS_REQVER:=20100511} # Required utilities in host system. REQHOST_UTILS="gawk bash sed gcc msgfmt patch makeinfo perl fakeroot tar xz" check_reqhost_utils() { [ -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! exiting..." exit 1 fi done } usage() { cat << _EOF $progname: [-ChS] [-c ] [-m ] [-p ] [-s ] [] Targets: bootstrap Build and install the bootstrap packages into . build [pkgname] Build a package (fetch + extract + configure + build). build-pkg [pkgname|all] Build a binary package from . Package must be installed into destdir. If the keyword is used all packages currently installed in / will be used. Otherwise if specified, or the one in cwd. checkvers Checks installed package versions against srcpkgs 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 distribution file(s) into build directory. Build directory is always available in /pkg-builddir/. fetch [pkgname] Download distribution file(s). info [pkgname] Show information for current pkg build template. install-destdir [pkgname] build + install into destdir. install [pkgname] install-destdir + stow. list List installed packages in . listfiles List installed files from . make-repoidx Build a package index for the local repository associated with the master directory or , or updates it. remove [pkgname] Remove package completely (destdir + masterdir). stow [pkgname] Stow files from into and register package in database. unstow [pkgname] Remove files from and unregister package from database. Options: -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. -h Usage output. -m Master directory, overwritting the value set in the configuration file xbps-src.conf. -p Package directory, overwritting default path at /pkg-binpkgs. -S Overrides and disables XBPS_PREFER_BINPKG_DEPS even if it was set in the configuration file xbps-src.conf. it was set in the configuration file. -s Source distribution files directory, overwritting default path at /pkg-srcdistdir. _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 "Cc:hm:p:Ss:" opt; do case $opt in C) KEEP_WRKSRC=1;; c) XBPS_CONFIG_FILE="$OPTARG";; h) usage && exit 0;; 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 $(echo @@XBPS_INSTALL_SHAREDIR@@/shutils/*.sh); do if [ -r "$f" -a "$(basename $f)" != "chroot.sh" ]; then . $f fi 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@@/xbps-src-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="$XBPS_MASTERDIR/bin:$XBPS_MASTERDIR/usr/bin:$PATH" 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" fi # In chroot always prefer tools from bootstrap. MYPATH="$CCACHEPATH:/tools/bin:/usr/local/sbin:/usr/local/bin" MYPATH="$MYPATH:/bin:/sbin:/usr/bin:/usr/sbin" fi export PATH="$MYPATH" # # 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 ;; build|configure) if [ -z "${_pkgname}" ]; then [ ! -r ./template ] && msg_error "missing build template in $(pwd).\n" . ./template _pkgname=$(basename_cwd) fi if [ -z "$base_chroot" -a -z "$in_chroot" ]; then . $XBPS_SHUTILSDIR/chroot.sh 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 if [ ! -f "$XBPS_EXTRACT_DONE" ]; then extract_distfiles fi if [ "$target" = "configure" ]; then configure_src_phase else if [ ! -f "$XBPS_CONFIGURE_DONE" ]; then configure_src_phase fi build_src_phase 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_SHUTILSDIR/chroot.sh 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 extract_distfiles ;; install|install-destdir) if [ -z "${_pkgname}" ]; then [ ! -r ./template ] && msg_error "missing build template in $(pwd).\n" _pkgname=$(basename_cwd) fi setup_tmpl ${_pkgname} [ "$target" = "install-destdir" ] && DESTDIR_ONLY_INSTALL=1 _ORIGINPKG="${_pkgname}" if [ -z "$in_chroot" -a -z "$base_chroot" ]; then . $XBPS_SHUTILSDIR/chroot.sh xbps_chroot_handler $target ${_ORIGINPKG} $KEEP_WRKSRC else setup_tmpl ${_ORIGINPKG} install_pkg $pkgname fi ;; list|listfiles) if [ "$target" = "list" ]; then $XBPS_BIN_CMD list exit $? fi list_pkg_files $2 ;; make-repoidx) if [ -n "${_PACKAGEDIR}" ]; then export XBPS_PACKAGESDIR=${_PACKAGEDIR} fi echo "=> Updating package index for local repository at" echo " $XBPS_PACKAGESDIR..." [ ! -d "$XBPS_PACKAGESDIR/$(uname -m)" ] && \ mkdir -p "$XBPS_PACKAGESDIR/$(uname -m)" ${XBPS_REPO_CMD} genindex ${XBPS_PACKAGESDIR} 2>/dev/null [ $? -eq 0 ] && echo "=> done." ;; 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 "$base_chroot" ]; then . $XBPS_SHUTILSDIR/chroot.sh xbps_chroot_handler $target ${_pkgname} $KEEP_WRKSRC 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 ;; *) echo "=> ERROR: invalid target: $target." usage && exit 1 esac # Agur exit $?