#!/bin/sh # # Copyright (c) 2008-2009 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} : ${xbps_machine:=$(uname -m)} : ${XBPS_UTILS_REQVER:=20091107} usage() { cat << _EOF $progname: [-C] [-c ] [-u] Targets: 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 . reinstall remove + install. remove Remove package completely (destdir + masterdir). stow Copy 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. -u Update the checksum in template file if used in 'fetch' target. _EOF exit 1 } 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 } set_defvars() { local DDIRS i instver instsharedir instsharedir=@@XBPS_INSTALL_SHAREDIR@@ : ${XBPS_TRIGGERSDIR:=$instsharedir/triggers} : ${XBPS_HELPERSDIR:=$instsharedir/helpers} : ${XBPS_SHUTILSDIR:=$instsharedir/shutils} : ${XBPS_COMMONVARSDIR:=$instsharedir/common} : ${XBPS_DBDIR:=$XBPS_MASTERDIR/var/db/xbps} : ${XBPS_META_PATH:=$XBPS_DBDIR/} : ${XBPS_PKGMETADIR:=$XBPS_DBDIR/metadata} : ${XBPS_SRCPKGDIR:=$XBPS_DISTRIBUTIONDIR/srcpkgs} DDIRS="XBPS_TRIGGERSDIR XBPS_HELPERSDIR" DDIRS="$DDIRS XBPS_COMMONVARSDIR XBPS_SHUTILSDIR" for i in ${DDIRS}; do eval val="\$$i" [ ! -d "$val" ] && msg_error "cannot find $i, aborting." done export XBPS_PKGDB_CMD="xbps-pkgdb.static -r $XBPS_MASTERDIR" export XBPS_BIN_CMD="xbps-bin.static -r $XBPS_MASTERDIR" export XBPS_DIGEST_CMD="xbps-digest.static" export XBPS_CMPVER_CMD="xbps-cmpver.static" export XBPS_FETCH_CMD="xbps-fetch.static" # # Check that installed xbps utils version is recent enough. # instver=$(${XBPS_PKGDB_CMD} -V) ${XBPS_CMPVER_CMD} "${instver}" "${XBPS_UTILS_REQVER}" if [ $? -eq 255 ]; then echo -n "Your xbps utilities are too old, " echo "required version: ${XBPS_UTILS_REQVER}" exit 1 fi } # # Checks that all required variables specified in the configuration # file are properly working. # check_config_vars() { local 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 local XBPS_VARS="XBPS_MASTERDIR XBPS_DESTDIR XBPS_BUILDDIR \ XBPS_SRCDISTDIR" for f in ${XBPS_VARS}; do eval val="\$$f" [ -z "$val" ] && msg_error "'$f' not set in configuration file" if [ ! -d "$val" ]; then mkdir "$val" [ $? -ne 0 ] && msg_error "couldn't create '$f' directory" fi done export PATH="@@XBPS_INSTALL_PREFIX@@/sbin:$PATH" } # # main() # while getopts "Cc:u" opt; do case $opt in C) dontrm_builddir=yes;; c) config_file_specified=yes; XBPS_CONFIG_FILE="$OPTARG";; u) update_checksum=yes;; --) shift; break;; esac done shift $(($OPTIND - 1)) [ $# -eq 0 -o $# -gt 2 ] && usage target="$1" if [ -z "$target" ]; then echo "=> ERROR: missing target." usage fi # # Check configuration vars before anyting else, and set defaults vars. # check_config_vars set_defvars . $XBPS_SHUTILSDIR/common_funcs.sh # Main switch case "$target" in build|configure) . $XBPS_SHUTILSDIR/tmpl_funcs.sh setup_tmpl $(basename_cwd) if [ -z "$base_chroot" -a -z "$in_chroot" ]; then . $XBPS_SHUTILSDIR/chroot.sh if [ "$target" = "build" ]; then xbps_chroot_handler build $pkgname else xbps_chroot_handler configure $pkgname fi else . $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 [ "$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) [ "$target" = "install-destdir" ] && install_destdir_target=yes . $XBPS_SHUTILSDIR/pkgtarget_funcs.sh setup_tmpl $(basename_cwd) install_pkg $pkgname ;; list|listfiles) if [ "$target" = "list" ]; then $XBPS_BIN_CMD list exit $? fi . $XBPS_SHUTILSDIR/pkgtarget_funcs.sh list_pkg_files $2 ;; reinstall) . $XBPS_SHUTILSDIR/pkgtarget_funcs.sh setup_tmpl $(basename_cwd) remove_pkg install_pkg $pkgname ;; 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 esac # Agur exit $?