diff options
-rwxr-xr-x | treepkg | 125 |
1 files changed, 125 insertions, 0 deletions
@@ -0,0 +1,125 @@ +#!/bin/bash +#set -x +source /etc/libretools.conf +source $(dirname $0)/libremessages +source $XDG_CONFIG_HOME/libretools/libretools.conf >/dev/null 2>&1|| true + +# End inmediately but print a useful message +trap_exit() { + error "($(basename $0)) $@" + exit 1 +} + +# Trap signals from makepkg +set -E +trap 'trap_exit "TERM signal caught. Exiting..."' TERM HUP QUIT +trap 'trap_exit "Aborted by user! Exiting..."' INT +trap 'trap_exit "An unknown error has occurred. Exiting..."' ERR + +# return : full version spec, including epoch (if necessary), pkgver, pkgrel +# usage : get_fullver( ${epoch:-0}, $pkgver, $pkgrel ) +get_fullver() { + if [ $1 -eq 0 ]; then +# zero epoch case, don't include it in version + echo $2-$3 + else + echo $1:$2-$3 + fi + +} + +# Add line to build order cache in CSV format +# $1 status +# $2 pkgname +add_order() { + echo "${1};${DEPTH};${2:-${pkgbase}};${fullver};${PWD}" >> "${BUILDORDER}" + ${VERBOSE} && msg2 "%${DEPTH}s${2:-${pkgbase}} [${1}]" || true +} + +# Finds a PKGBUILD on toru's path cache +# Look in all caches but pick the first one +# TODO move to a toru flag (-p?) +where_is() { + grep -m1 "^${1}:" "${TORUPATH}/paths" 2>/dev/null| \ + cut -d: -f2 2>/dev/null +} + +if [ ! -f PKGBUILD ]; then + error "Missing PKGBUILD" + exit 1 +fi + +if ! source PKGBUILD ; then + error "Can't source PKGBUILD" + exit 1 +fi + +# Save resources +unset pkgdesc arch license groups backup install md5sums sha1sums \ + sha256sums source options >/dev/null 2>&1 + +unset build package >/dev/null 2>&1 + +for _pkg in ${pkgname[@]}; do + unset package_${_pkg} >/dev/null 2>&1 || true +done +## + +# Get useful values +pkgbase="${pkgbase:-${pkgname[0]}}" +fullver=$(get_fullver ${epoch:-0} ${pkgver} ${pkgrel}) + +# Get or set the build order cache (canonical) +BUILDORDER="$(readlink -f "${1:-$(mktemp /tmp/${pkgbase}.buildorder.XXXX)}")" +DEPTH=${2:-0} +NEXTDEPTH=$((${DEPTH} + 1)) +VERBOSE=true + +# ensure it exists +touch "${BUILDORDER}" + +# If this package is already built quit silently +if is_built "${pkgbase}>=${fullver}"; then + add_order "ignore" + exit 0 +fi + +# Ignore if already in build order +egrep -q ";${pkgbase};" "${BUILDORDER}" && exit 0 + +# Add pkgbase to build order +add_order "build" + +# Cleanup dep versioning +deps=($(echo "${depends[@]} ${makedepends[@]}" | \ + sed "s/[=<>]\+[^ ]\+//g" | \ + tr ' ' "\n" | \ + sort -u)) + +# NOTE: getting depends from package() is a PITA +for _dep in ${deps[@]}; do +# Ignore if already in build order + egrep -q ";${_dep};" "${BUILDORDER}" && continue + + depdir="$(where_is ${_dep})" + + if [ -z "${depdir}" -o ! -d "${depdir}" ]; then +# We specify the pkgname because we can't source the dep PKGBUILD + add_order "missing" "${_dep}" + continue + fi + + pushd "${depdir}" >/dev/null + +# Run itself over dependencies + $0 "${BUILDORDER}" ${NEXTDEPTH} + +done + +# Only print build order at the end +if [ ${DEPTH} -eq 0 ]; then + ${VERBOSE} && msg "Build tree stored in ${BUILDORDER}" || true + ${VERBOSE} || echo "${BUILDORDER}" || true +fi + +exit $? |