#!/bin/sh # # Copyright (c) 2008-2010 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. #- trap "echo && exit 1" INT QUIT : ${XBPS_CONFIG_FILE:=@@XBPS_INSTALL_ETCDIR@@/xbps-src.conf} : ${progname:=$(basename $0)} : ${fakeroot_cmd:=fakeroot} : ${fakeroot_cmd_args:=--} : ${sudo_cmd:=sudo} : ${chroot_cmd:=chroot} : ${xbps_machine:=$(uname -m)} : ${XBPS_UTILS_REQVER:=20100121} usage() { cat << _EOF $progname: [-Ch] [-c ] [-m ] [-p ] Targets: bootstrap Build and install the bootstrap packages into masterdir. build Build a package (fetch + extract + configure + build). build-pkg [all] Build a binary package from . Package must be installed into destdir. If the keyword is used all packages currently installed will be used. chroot Enter to the chroot in masterdir. configure Configure a package (fetch + extract + configure). extract Extract distribution file(s) into build directory. fetch Download distribution file(s). info Show information for current pkg build template. install-destdir build + install into destdir. install install-destdir + stow. list List installed packages in masterdir. listfiles List installed files from . make-repoidx Build a package index for the local repository associated with the master directory, or updates it. remove Remove package completely (destdir + masterdir). stow Stow files from destdir into masterdir and register package in database. unstow Remove files from masterdir 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 at @@XBPS_INSTALL_ETCDIR@@/xbps-src.conf. -p Package directory, overwritting default path at /pkg-binpkgs. _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 if [ -z "$config_file_specified" ]; then config_file_paths="$XBPS_CONFIG_FILE ./etc/xbps-src.conf" for f in $config_file_paths; do [ -f $f ] && XBPS_CONFIG_FILE=$f && \ cffound=yes && break done [ -z "$cffound" ] && msg_error "cannot find a config file" fi run_file ${XBPS_CONFIG_FILE} XBPS_CONFIG_FILE=$path_fixed if [ ! -f "$XBPS_CONFIG_FILE" ]; then msg_error "cannot find configuration file: $XBPS_CONFIG_FILE" fi eval val="\$XBPS_MASTERDIR" [ -z "$val" ] && msg_error "'XBPS_MASTERDIR' not set in configuration file" if [ ! -d "$val" ]; then mkdir "$val" [ $? -ne 0 ] && msg_error "couldn't create 'XBPS_MASTERDIR' directory" fi export PATH="@@XBPS_INSTALL_PREFIX@@/sbin:$PATH" } # # main() # while getopts "Cc:hm:p:" opt; do case $opt in C) export dontrm_builddir=yes;; c) config_file_specified=yes; XBPS_CONFIG_FILE="$OPTARG";; h) usage && exit 0;; m) _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 ;; --) shift; break;; esac done shift $(($OPTIND - 1)) [ $# -eq 0 -o $# -gt 2 ] && usage && exit 1 target="$1" if [ -z "$target" ]; then echo "=> ERROR: missing target." usage && exit 1 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 . $XBPS_SHUTILSDIR/common_funcs.sh 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 # Main switch case "$target" in bootstrap) . $XBPS_SHUTILSDIR/tmpl_funcs.sh . $XBPS_SHUTILSDIR/pkgtarget_funcs.sh [ ! -d $XBPS_SRCPKGDIR/xbps-base-chroot ] && \ msg_error "Cannot find $XBPS_SRCPKGDIR/xbps-base-chroot directory!" cd $XBPS_SRCPKGDIR/xbps-base-chroot && setup_tmpl $(basename_cwd) install_pkg $pkgname ;; build|configure) . $XBPS_SHUTILSDIR/tmpl_funcs.sh [ ! -r ./template ] && msg_error "missing build template file." . ./template if [ -z "$base_chroot" -a -z "$in_chroot" ]; then . $XBPS_SHUTILSDIR/chroot.sh xbps_chroot_handler $target $(basename_cwd) else setup_tmpl $(basename_cwd) . $XBPS_SHUTILSDIR/fetch_funcs.sh fetch_distfiles if [ ! -f "$XBPS_EXTRACT_DONE" ]; then . $XBPS_SHUTILSDIR/extract_funcs.sh extract_distfiles fi if [ "$target" = "configure" ]; then . $XBPS_SHUTILSDIR/configure_funcs.sh configure_src_phase else if [ ! -f "$XBPS_CONFIGURE_DONE" ]; then . $XBPS_SHUTILSDIR/configure_funcs.sh configure_src_phase fi . $XBPS_SHUTILSDIR/build_funcs.sh build_src_phase fi fi ;; build-pkg) . $XBPS_SHUTILSDIR/make-binpkg.sh . $XBPS_SHUTILSDIR/tmpl_funcs.sh 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 setup_tmpl $(basename_cwd) xbps_make_binpkg fi ;; chroot) . $XBPS_SHUTILSDIR/chroot.sh xbps_chroot_handler chroot dummy ;; extract|fetch|info) . $XBPS_SHUTILSDIR/tmpl_funcs.sh setup_tmpl $(basename_cwd) if [ "$target" = "info" ]; then . $XBPS_SHUTILSDIR/tmpl_funcs.sh info_tmpl exit $? fi if [ "$target" = "fetch" ]; then . $XBPS_SHUTILSDIR/fetch_funcs.sh fetch_distfiles $update_checksum exit $? fi . $XBPS_SHUTILSDIR/extract_funcs.sh extract_distfiles ;; install|install-destdir) . $XBPS_SHUTILSDIR/tmpl_funcs.sh [ ! -r ./template ] && msg_error "missing build template file." . ./template install_destdir_target=no [ "$target" = "install-destdir" ] && install_destdir_target=yes [ -z "$dontrm_builddir" ] && dontrm_builddir=no if [ -z "$in_chroot" -a -z "$base_chroot" ]; then . $XBPS_SHUTILSDIR/chroot.sh xbps_chroot_handler $target $(basename_cwd) $dontrm_builddir else . $XBPS_SHUTILSDIR/pkgtarget_funcs.sh setup_tmpl $(basename_cwd) install_pkg $pkgname fi ;; list|listfiles) if [ "$target" = "list" ]; then $XBPS_BIN_CMD list exit $? fi . $XBPS_SHUTILSDIR/pkgtarget_funcs.sh 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..." ${XBPS_REPO_CMD} genindex ${XBPS_PACKAGESDIR} 2>/dev/null [ $? -eq 0 ] && echo "=> done." ;; remove) . $XBPS_SHUTILSDIR/pkgtarget_funcs.sh setup_tmpl $(basename_cwd) remove_pkg ;; stow) stow_flag=yes . $XBPS_SHUTILSDIR/tmpl_funcs.sh setup_tmpl $(basename_cwd) . $XBPS_SHUTILSDIR/stow_funcs.sh stow_pkg_handler stow ;; unstow) . $XBPS_SHUTILSDIR/tmpl_funcs.sh setup_tmpl $(basename_cwd) . $XBPS_SHUTILSDIR/stow_funcs.sh stow_pkg_handler unstow ;; *) echo "=> ERROR: invalid target: $target." usage && exit 1 esac # Agur exit $?