#!/usr/bin/ksh
#
# Builds a Solaris IPS package called "valgrind" from the source
# directory. The Valgrind and VEX revisions are taken from that
# source directory and written to solaris/valgrind.p5m IPS manifest.
#
# Requires the following packages to be installed on Solaris 11:
# - data/xml-common		(install first before any docbook ones!)
# - data/docbook/docbook-style-xsl
# - data/docbook/docbook-dtds
# - developer/build/autoconf
# - developer/build/automake-111
# - developer/debug/gdb
# - developer/gnu-binutils
# - developer/versioning/mercurial
# - system/header
# - and the latest developer/gcc package.
#
# Requires a pre-established IPS repository.
# For example to create a file-based repository, do:
# - pkgrepo create $repo_uri
# - pkgrepo set -s $repo_uri publisher/prefix=valgrind
#

TMPDIR=/var/tmp/valgrind-build
SRCDIR=$TMPDIR/sources
INSTALLDIR=$TMPDIR/install
IPS_MANIFEST=solaris/valgrind.p5m

usage() {
    echo "Usage:"
    echo "build_solaris_package -p source_dir -s repo_uri [-r lint_repo_uri]"
    echo "\t-p source_dir contains working copy of the Valgrind sources"
    echo "\t-s repo_uri publishes to the repository located at the given URI"
    echo "\t            or file system path"
    echo "\t-r lint_repo_uri location of lint reference repository"
}

fail() {
    msg=$1

    echo "\n$msg"
    echo "Additional information could be found in directory $TMPDIR."
    exit 1
}

remove_dirs() {
    rm -rf $TMPDIR
}

create_dirs() {
    mkdir -p $TMPDIR
    (( $? != 0 )) && fail "Failed to create directory $TMPDIR."

    mkdir -p $INSTALLDIR
    (( $? != 0 )) && fail "Failed to create directory $INSTALLDIR."
}

export_sources() {
    printf "Exporting sources... "
    svn export --quiet --ignore-externals $source_directory $SRCDIR \
        2> $TMPDIR/svn-export-valgrind.log.stderr
    (( $? != 0 )) && fail "Failed to export working copy from $source_directory."
    svn export --quiet --ignore-externals $source_directory/VEX $SRCDIR/VEX \
        2> $TMPDIR/svn-export-vex.log.stderr
    (( $? != 0 )) && fail "Failed to export working copy from $source_directory/VEX."
    printf "done.\n"
}

modify_ips_manifest() {
    valgrind_rev=$( svn info $source_directory | grep Revision | sed -e 's/Revision: //' )
    vex_rev=$( svn info $source_directory/VEX | grep Revision | sed -e 's/Revision: //' )

    [[ -z $valgrind_rev ]] && fail "Failed to find Valgrind revision."
    [[ -z $vex_rev ]] && fail "Failed to find VEX revision."

    echo "Valgrind revision: $valgrind_rev, VEX revision $vex_rev."

    sed -i -e "s/VVVVV-XXXX/${valgrind_rev}-${vex_rev}/" $SRCDIR/$IPS_MANIFEST
}

run_autogen() {
    printf "Creating autotools support files... "
    ./autogen.sh > $TMPDIR/autogen.log.stdout 2> $TMPDIR/autogen.log.stderr
    (( $? != 0 )) && fail "Failed to generate autotools support files."
    printf "done.\n"
}

run_configure() {
    printf "Running configure... "
    ./configure CC='gcc -m64' CXX='g++ -m64' --prefix=/usr > $TMPDIR/configure.log
    (( $? != 0 )) && fail "Failed to run configure."
    printf "done.\n"
}

run_make_docs() {
   printf "Making docs... "
   make --directory=docs html-docs > $TMPDIR/make-docs.log.stdout 2> $TMPDIR/make-docs.log.stderr
   (( $? != 0 )) && fail "Failed to make html-docs."
   printf "done.\n"
}

run_make_man_pages() {
   printf "Making man pages... "
   make --directory=docs man-pages > $TMPDIR/make-man-pages.log.stdout 2> $TMPDIR/make-man-pages.log.stderr
   (( $? != 0 )) && fail "Failed to make man-pages."
   printf "done.\n"
}

run_make() {
    printf "Running make... "
    make --quiet > $TMPDIR/make.log
    (( $? != 0 )) && fail "Failed to run make."
    printf "done.\n"
}

run_make_install() {
    printf "Running 'make install'... "
    make --quiet install DESTDIR=$INSTALLDIR > $TMPDIR/make-install.log
    (( $? != 0 )) && fail "Failed to run 'make install'."

    cp AUTHORS COPYING* NEWS NEWS.old README* $INSTALLDIR/usr/share/doc/valgrind
    (( $? != 0 )) && fail "Failed to copy additional files to $INSTALLDIR."

    printf "done.\n"
}

run_pkglint() {
    printf "Running pkglint... "
    pkglint -c $TMPDIR/lint-cache -r $lint_repo_uri $SRCDIR/$IPS_MANIFEST > $TMPDIR/pkglint.log
    (( $? != 0 )) && fail "pkglint failed."
    printf "done.\n"
}

publish_package() {
    printf "Publishing package... "
    pkgsend publish -s $repo_uri -d $INSTALLDIR $SRCDIR/solaris/valgrind.p5m > $TMPDIR/pkgsend.log
    (( $? != 0 )) && fail "Failed to publish the package."
    printf "done.\n"
}

while getopts "p:r:s:" args; do
    case $args in
    p)
        source_directory=$OPTARG
        ;;
    r)
        lint_repo_uri=$OPTARG
        ;;
    s)
        repo_uri=$OPTARG
        ;;
    *)
        usage
        exit 1
        ;;
    esac
done

if [[ -z $source_directory ]]; then
    echo "No source directory specified.\n"
    usage
    exit 1
fi

if [[ -z $repo_uri ]]; then
    echo "No repo_uri specified.\n"
    usage
    exit 1
fi

# Determine the lint repo_uri to use from the current 'solaris' one
# if not specified explicitly.
if [[ -z $lint_repo_uri ]]; then
    publisher=$( pkg publisher | grep solaris | tr -s ' ' )
    if [[ $publisher == *sticky* ]]; then
        lint_repo_uri=$( echo "$publisher" | cut -d ' ' -f 6 )
    else
        lint_repo_uri=$( echo "$publisher" | cut -d ' ' -f 5 )
    fi
    [[ -z $lint_repo_uri ]] && fail "Failed to determine solaris IPS publisher."
    echo "lint_repo_uri determined as $lint_repo_uri"
fi


remove_dirs
create_dirs
cd $TMPDIR

export_sources
modify_ips_manifest
cd $SRCDIR
run_autogen
run_configure
run_make_docs
run_make_man_pages
run_make
run_make_install

cd $TMPDIR
run_pkglint
publish_package

remove_dirs
return 0
