#!/bin/bash
#
# SlackBuild for microcode_ctl
# http://urbanmyth.org/microcode/
#
# Author: Luis ( luis at riseup d0t net )
#

# Look for slackbuildrc
if [ -f ~/.slackbuildrc ]; then
  source ~/.slackbuildrc
elif [ -f /etc/slackbuildrc ]; then
  source /etc/slackbuildrc
fi

# Set variables
CWD="$(pwd)"
SRC_NAME="microcode_ctl"
PKG_NAME="microcode_ctl"
ARCH="i486"
SRC_VERSION=${VERSION:=1.16}
PKG_VERSION="$(echo "$SRC_VERSION" | tr '[[:blank:]-]' '_')"
BUILD=${BUILD:=1ls}
SRC_DIR=${SRC_DIR:=$CWD}/$PKG_NAME
TMP=${TMP:=/tmp}
PKG=${PKG:=$TMP/package-$PKG_NAME}
REPOS=${REPOS:=$TMP}
PREFIX=${PREFIX:=/usr}
PKG_SRC="$TMP/$SRC_NAME-$SRC_VERSION"

# Set error codes (used by createpkg)
ERROR_WGET=31;      ERROR_MAKE=32;      ERROR_INSTALL=33
ERROR_MD5=34;       ERROR_CONF=35;      ERROR_HELP=36
ERROR_TAR=37;       ERROR_MKPKG=38;     ERROR_GPG=39
ERROR_PATCH=40;     ERROR_VCS=41;       ERROR_MKDIR=42

# Clean up any leftovers of previous builds
rm -rf "$PKG_SRC" 2> /dev/null
rm -rf "$PKG" 2> /dev/null

# Create directories if necessary
mkdir -p "$SRC_DIR" || exit $ERROR_MKDIR
mkdir -p "$PKG" || exit $ERROR_MKDIR
mkdir -p "$REPOS" || exit $ERROR_MKDIR

# Dowload source if necessary
SRC="$SRC_NAME-$SRC_VERSION.tar.gz"
URL="http://urbanmyth.org/microcode/$SRC"

if [ ! -s "$SRC_DIR/$SRC" ] || ! gzip -t "$SRC_DIR/$SRC" 2> /dev/null; then
  wget "$URL" -O "$SRC_DIR/$SRC" || exit $ERROR_WGET
fi

# Untar
cd "$TMP"
tar --no-same-owner --no-same-permissions -xvf "$SRC_DIR/$SRC" || exit $ERROR_TAR
cd "$PKG_SRC"

# Compile
make all || exit $ERROR_MAKE
if [ ! -c /dev/cpu/microcode ]; then
  make device || exit $ERROR_MAKE
fi

# Install
make install DESTDIR="$PKG" || exit $ERROR_INSTALL

# Strip binaries
( cd "$PKG"
  find . | xargs file | grep "executable" | grep ELF | cut -f 1 -d : | \
    xargs strip --strip-unneeded 2> /dev/null
  find . | xargs file | grep "shared object" | grep ELF | cut -f 1 -d : | \
    xargs strip --strip-unneeded 2> /dev/null
)

# Compress and link manpages
if [ -d "$PKG/$PREFIX/man" ]; then
  ( cd "$PKG/$PREFIX/man"
    for manpagedir in $(find . -type d -name "man*") ; do
      ( cd $manpagedir
        for eachpage in $( find . -type l -maxdepth 1) ; do
          ln -s $( readlink $eachpage ).gz $eachpage.gz
          rm $eachpage
        done
        gzip -9 *.?
      )
    done
  )
fi

# Install documentation
DOCS="Changelog README intel-*.txt"
mkdir -p "$PKG/$PREFIX/doc/$PKG_NAME-$PKG_VERSION" || exit $ERROR_MKDIR
cp -a $DOCS "$PKG/$PREFIX/doc/$PKG_NAME-$PKG_VERSION"

# Move the initialization script to /etc/rc.d/, renaming it to rc.*
( cd "$PKG/etc/rc.d"
  mv -f init.d/microcode_ctl rc.microcode_ctl.new
  rmdir init.d/
)

# Patch the initialization script to be less verbose
( cd "$PKG"
  patch -Np1 < "$CWD/microcode_ctl-less_verbose.patch" || exit $ERROR_PATCH
)

# Add package description (slack-desc)
mkdir -p "$PKG/install" || exit $ERROR_MKDIR
cat << EODESC > "$PKG/install/slack-desc"
# HOW TO EDIT THIS FILE:
# The "handy ruler" below makes it easier to edit a package description.  Line
# up the first '|' above the ':' following the base package name, and the '|'
# on the right side marks the last column you can put a character in.  You must
# make exactly 11 lines for the formatting to be correct.  It's also
# customary to leave one space after the ':'.

             |-----handy-ruler-------------------------------------------------|
microcode_ctl: microcode_ctl
microcode_ctl:
microcode_ctl: Decodes and sends new microcode to the kernel driver to be
microcode_ctl: uploaded to Intel IA32 family processors (Pentium Pro, PII,
microcode_ctl: Celeron, PIII, Xeon, Pentium 4 etc, x86_64). It depends on the
microcode_ctl: Linux kernel microcode driver.
microcode_ctl:
microcode_ctl: The microcode update is volatile and needs to be uploaded on
microcode_ctl: each system boot.
microcode_ctl:
microcode_ctl: For more information, http://urbanmyth.org/microcode/
EODESC

# Add a post-installation script (doinst.sh)
cat << EOSCRIPT > "$PKG/install/doinst.sh"
config() {
  NEW="\$1"
  OLD="\$(dirname \$NEW)/\$(basename \$NEW .new)"
  # If there's no config file by that name, mv it over:
  if [ ! -r \$OLD ]; then
    mv \$NEW \$OLD
  elif [ "\$(cat \$OLD | md5sum)" = "\$(cat \$NEW | md5sum)" ]; then
    # toss the redundant copy
    rm \$NEW
  fi
  # Otherwise, we leave the .new copy for the admin to consider...
}

config etc/rc.d/rc.microcode_ctl.new
EOSCRIPT

# Build the package
cd "$PKG"
makepkg -l y -c n "$REPOS/$PKG_NAME-$PKG_VERSION-$ARCH-$BUILD.tgz" || exit $ERROR_MKPKG

# Delete source and build directories if requested
if [ "$CLEANUP" == "yes" ]; then
  rm -rf "$PKG_SRC" "$PKG"
fi