#!/bin/bash
######################################################################
# dkms-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 /home/bob/v5 v1_1_5010 net RHEL5 base i686:2.4.20-8"
  err
  exit 1
}


######################################################################
# 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 cd "$dir"

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

anybad=false

version="$(sed 's/^%define pkgversion //; t; d' "$dir/rpm/SPECS/sfc.spec")"

while [ $# -gt 0 ]; do
  kernel=${1##*:}
  arch=${1%%:*}
  logf="dkms-$TAG-$disttag-$arch-$kernel.log"
  shift

  [ "$kernel" != user ] || continue

  [ -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)"
  }

  log "Building with DKMS: arch=$arch kernel=$kernel"

  if "$bin/dkms" build --dkmstree "$dir/dkms/var_lib" \
    --sourcetree "$dir/dkms/usr_src" \
    -m sfc -v "$version" -k "$kernel" -a "$arch"; then
    logf="$logd/$logf"
    try mv "$dir/dkms/var_lib/sfc/$version/$kernel/$arch/log/make.log" \
      "$logf"
  else
    logf="$logd/failures/$logf"
    try mkdir -p "$logd/failures"
    try mv "$dir/dkms/var_lib/sfc/$version/build/make.log" "$logf"
    anybad=true
  fi

  $verbose && cat "$logf"
done

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

vlog "Exiting."
exit 0
