#!/bin/bash
######################################################################
# deb-builder
######################################################################

me=$(basename "$0")
bin=$(cd "$(dirname "$0")" && /bin/pwd)

err  () { echo 1>&2 "$*";   }
log  () { err "$me: $*";     }
vlog () { $verbose && err "$me: $*"; }
fail () { log "$*"; exit 1; }
try  () { "$@" || fail "'$*' failed"; }
trace() { log "invoking: $*"; "$@"; }
vtrace() { vlog "invoking: $*"; "$@"; }


usage() {
  err
  err "usage:"
  err "  $me [options] <dir> <tag> net <distro> <sp> <arch:kernel-version>..."
  err
  err "options:"
  err "  --disttag <x>     -- specify disttag (only used for log file name)"
  err "  -v                -- verbose logging"
  err
  err "eg: $me /tmp v1_1_5010 net DEBIAN base i686:2.4.20-8"
  err
  exit 1
}


builddebs() {
  local arch="$1"
  local kernel="$2"
  local logf="$logd/deb-$TAG-$disttag-$arch-$kernel.log"

  if [ "$kernel" = user ]; then
    log "Generating userland deb: arch=$arch log=$(basename "$logf")"
    vtrace ./scripts/debian/build.sh userland &> "$logf"
  else
    log "Generating deb: arch=$arch kernel=$kernel log=$(basename "$logf")"
    export KVERS="$kernel"
    export KPATH="/lib/modules/$KVERS/build"
    vtrace ./scripts/debian/build.sh modules &> "$logf"
  fi
  rc=$?

  $verbose && cat "$logf"

  [ $rc = 0 ] || {
    log "FAILED: $rc"
    try mkdir -p "$logd/failures"
    try mv "$logf" "$logd/failures"
  }
  return $rc
}


######################################################################
# main()

verbose=false
disttag=


# Parse the command line arguments.
while [ $# -gt 0 ]; do
  case "$1" in
    --disttag)	disttag="$2"; shift;;
    -v)		verbose=true;;
    -*)		usage;;
    *)		break;;
  esac
  shift
done


[ $# -lt 5 ] && usage
dir="$1"
shift
TAG="$1"
shift
[ "x$1" = xnet ] || fail "$me: type must be 'net'"
shift
DISTRO=$1
shift
SP=$1
shift

vlog "whoami=$(whoami)"
vlog "$(uname -a)"


# Some sanity please!
try [ -d "$dir" ]
try [ -d "$dir/src" ]
try [ -d "$dir/scripts" ]
try [ -d "$dir/mk" ]

logd="$dir/rpm/logs"
try mkdir -p "$logd"

try cd "$dir"
anybad=false

while [ $# -gt 0 ]; do
  kernel=${1##*:}
  arch=${1%%:*}
  shift

  [ -n "$LD_PRELOAD" ] && {
    # This bit of hackery combines with hackery in the rpmbuild-master
    # scripts to make it look like we're running on a different system from
    # the one the kernel thinks we're running.  (Needed because we run this
    # script in a chroot environment).
    export "FAKEARCH_MACHINE=$arch"
    vlog "fakearch: $(uname -a)"
  }

  builddebs "$arch" "$kernel" || anybad=true
done

$anybad && {
  log "***** One or more builds failed! *****"
  exit 1
}

vlog "Exiting."
exit 0
