#!/usr/bin/env bash
######################################################################
# Create Source RPM packages
######################################################################

. "$(dirname "$0")/funcs.sh"
#export PATH="$bin/sh:$PATH"
export REALRPMBUILD=$(which rpmbuild)

usage () {
  err
  err "usage:  $p [options]"
  err
  err "options:"
  err "  --srpm                   - build net driver srpm"
  err "  --dkms                   - build net driver dkms"
  err "  --kmp                    - build net driver kmp/kmod"
  err "  --kmp-suse               - build net driver kmp (for SuSE)"
  err "  --kmod-rhel              - build net driver kmod (for RHEL)"
  err "  -d --dest <dest-dir>     - destination rpm directory (defaults to $TOP/RPM)"
  err "  -v --version <version>   - version (defaults to $version)"
  err
  exit 1
}

mkdir_cd () { try mkdir -p "$1"; try cd "$1"; }

_make_sfc_srpm_tgz() {
  local pkgver="$1"
  local pkgspec="$2"

  # Populate BUILD directory
  cd "$RPM/BUILD"
  mkdir_cd ${pkgver}
  try mkdir -p linux_net

  try make -C $TOP KPATH="$PWD/linux_net" export-srpm

  # Add files into BUILD
  cp $TOP/LICENSE LICENSE
  . "$TOP/imports.mk"
  sed "s/__version__/$version/" $TOP/README > README

  # Compress BUILD into SOURCES and remove uncompressed
  try cd ..
  try tar czf "$RPM/SOURCES/${pkgver}.tar.gz" ${pkgver}
  try rm -rf ${pkgver}

  # Create SPECS/.spec file with updated version
  ( echo "%define pkgversion $version" ;
    cat $TOP/scripts/rpm/${pkgspec} ) > \
        "$RPM/SPECS/${pkgspec}"

  # extra SOURCES
  # depmod prioritization
  try cp  "$TOP/scripts/rpm/rhel5-kmodtool-wrapper" "$RPM/SOURCES/rhel5-kmodtool-wrapper"
  try chmod +x "$RPM/SOURCES/rhel5-kmodtool-wrapper"
  try echo '/etc/depmod.d/sfc.conf
 /lib/modules/%verrel%dotvariant' > "$RPM/SOURCES/files.el6"
  cp "$TOP/scripts/disttag" "$RPM/SOURCES/sfc-disttag"

  # rpmbuild
  $REALRPMBUILD -bs --nodeps --define "_topdir $RPM" --define "disttag %{nil}" "$RPM/SPECS/${pkgspec}"
}
make_sfc_srpm() {
	_make_sfc_srpm_tgz "sfc-${version}" "sfc.spec"
}
make_sfc_kmp() {
	_make_sfc_srpm_tgz "sfc-${version}" "sfc-kmp.spec"
}
_make_sfc_srpm_simple_bz2() {
  local pkgver="$1"
  local pkgtype="$2"
  local kver_variable="$3"
  local pkgspec="${pkgtype}.spec"

  # Populate BUILD directory
  cd "$RPM/BUILD"
  mkdir_cd ${pkgver}
  try make ${MAKE_OPTS} -C $TOP KPATH="$PWD" export-srpm

  # Add files into BUILD
  cp $TOP/LICENSE LICENSE
  
  # Compress BUILD into SOURCES and remove uncompressed
  try cd ..
  try tar cjf "$RPM/SOURCES/${pkgver}.tar.bz2" ${pkgver}
  try rm -rf ${pkgver}

  # Copy in other files to the SRPM top-level
  if [ -d $TOP/scripts/rpm/files/$pkgtype ]; then
    for file in $TOP/scripts/rpm/files/$pkgtype/*; do
      cp "$file" "$RPM/SOURCES/"
    done
  fi

  # Create SPECS/.spec file with updated version
  ( echo "%define $kver_variable $version" ;
    cat $TOP/scripts/rpm/${pkgspec} ) > \
	"$RPM/SPECS/${pkgspec}"
 
  # rpmbuild
  $REALRPMBUILD -bs --nodeps --define "_topdir $RPM" --define "disttag %{nil}" "$RPM/SPECS/${pkgspec}"
}
make_sfc_kmp_suse() {
    _make_sfc_srpm_simple_bz2 "solarflare-sfc-${version}" "sfc-kmp-suse" "pkgversion"
}

make_sfc_kmod_rhel() {
    _make_sfc_srpm_simple_bz2 "sfc-${version}" "sfc-kmod-rhel" "kmod_driver_version"
}


make_sfc_dkms() {
    local DKMS="$RPM/dkms"
    # Add path to the dkms executable
    PATH=$PATH:/usr/sbin

    # Prepare DKMS directories
    try rm -rf "$RPM/dkms"
    try mkdir -p "$RPM/dkms"/{usr_src,var_lib}
    try cp /var/lib/dkms/dkms_dbversion $RPM/dkms/var_lib

    # Make another copy of the source for DKMS
    version="$(sed 's/^%define pkgversion //; t; d' "$RPM/SPECS/sfc.spec")"
    try $REALRPMBUILD -bp --define "_topdir $RPM" "$RPM/SPECS/sfc.spec"
    try mv "$RPM/BUILD/sfc-$version" "$DKMS/usr_src/"
    try sed "s/^PACKAGE_VERSION=.*/PACKAGE_VERSION=$version/" \
	< "$TOP/scripts/rpm/sfc-dkms.conf" \
	> "$DKMS/usr_src/sfc-$version/dkms.conf"

    # Add the source to DKMS.  It will create a sym-link to the source using
    # an absolute path which won't work in the chroot, so replace that with
    # a relative path.
    try dkms add --dkmstree "$DKMS/var_lib" \
	--sourcetree "$DKMS/usr_src" \
	-m sfc -v "$version"
    rm -f "$DKMS/var_lib/sfc/$version/source"
    try ln -s "../../../usr_src/sfc-$version" \
	"$DKMS/var_lib/sfc/$version/source"

    # Collect up all the successful DKMS builds into a tarball and then an
    # RPM.  The "--all" option unfortunately only covers kernel versions
    # that dkms thinks are installed, so we list all the kernel versions
    # explicitly.
    try dkms mktarball --dkmstree "$DKMS/var_lib" \
	--sourcetree "$DKMS/usr_src" \
	-m sfc \
	-v "$version" \
	--archive "sfc-$version.dkms.tar.gz" \
	--source-only
    try mv "$DKMS/var_lib/sfc/$version/tarball/sfc-$version.dkms.tar.gz" \
	"$RPM/SOURCES/"
    try cp "$TOP/scripts/rpm/sfc-dkms.spec" "$RPM/SPECS/"
    try sed -i 's/^\(Version:\).*/\1	'"$version"'/' "$RPM/SPECS/sfc-dkms.spec"
    try cp "$TOP/scripts/rpm/sfc-dkms-depmod.conf" "$RPM/SOURCES/sfc.conf"

    try $REALRPMBUILD -bb --define "_topdir $RPM" "$RPM/SPECS/sfc-dkms.spec"
}

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

quiet=false
net=false
net_dkms=false
net_kmp=false
net_kmp_suse=false
net_kmod_rhel=false
TOP=$(git rev-parse --show-toplevel 2> /dev/null)
test -z "$TOP" && TOP=$PWD
RPM="$TOP/rpm"
version=$(make -s -C $TOP version | sed 's/[_-]/./g')

while [ $# -gt 0 ]; do
  case "$1" in
  -d|--dest)    RPM="$2"; shift
                ;;
  -q|--quiet)	quiet=true
		;;
  -v|--version)	version="$2"; shift
		;;
  --srpm)	net=true
		;;
  --dkms)	net_dkms=true
		;;
  --kmp) net_kmp=true
	 ;;
  --kmp-suse) net_kmp_suse=true
	      ;;
  --kmod-rhel) net_kmod_rhel=true
	      ;;
  -*)		usage
		;;
  *)		break
		;;
  esac
  shift
done

[ $# = 0 ] || usage

# Prepare.
if [ -d $TOP/.git2 ];
then
	test -z "$(git status --porcelain)" || fail "The working directory is not clean";
fi

mkdir -p "$RPM"/{,BUILD,RPMS,SRPMS,SPECS,SOURCES} && \
mkdir -p "$RPM"/RPMS/{athlon,i{3,4,5,6}86,noarch} || \
      fail "Error creating $RPM directories"

# Env var EFAB_VERSION is used by other scripts called by this.
export EFAB_VERSION="$version"
echo Version: $version

done=false
$net    && { done=true; (make_sfc_srpm)   || exit; }
$net_dkms && { done=true; make_sfc_srpm && make_sfc_dkms || exit; }
$net_kmp       && { done=true; (make_sfc_kmp) || exit; }
$net_kmp_suse  && { done=true; (make_sfc_kmp_suse) || exit; }
$net_kmod_rhel  && { done=true; (make_sfc_kmod_rhel) || exit; }

$done || usage

err "\033[31m"
err "i)  Please use the runbench build-queue for customer releases (for consistency and to ensure files are owned by root). See http://intranet/staffwiki/SwReleaseProcess#SRPM"
err "ii) Please note that SRPMs/DKMSes for customers should be GPG signed as per http://intranet/staffwiki/RpmSigning#Signing_a_single_RPM_with_the_private_key_on_a_yubikey"
err "\033[0m"

exit 0
