Bug 345248 - add support for Solaris OS in valgrind

Authors of this port:
    Petr Pavlu         setup@dagobah.cz
    Ivo Raisr          ivosh@ivosh.net
    Theo Schlossnagle  theo@omniti.com
            


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@15426 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/solaris/build_solaris_package b/solaris/build_solaris_package
new file mode 100755
index 0000000..52508d7
--- /dev/null
+++ b/solaris/build_solaris_package
@@ -0,0 +1,192 @@
+#!/usr/bin/ksh
+#
+# Builds a Solaris IPS package called "valgrind" from the project sources.
+# Sources are cloned and updated to the tag found in 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-solaris-build
+SRCDIR=$TMPDIR/sources
+INSTALLDIR=$TMPDIR/install
+PROJECT_URL=https://bitbucket.org/iraisr/valgrind-solaris
+IPS_MANIFEST=solaris/valgrind.p5m
+
+usage() {
+    echo "Usage:"
+    echo "build_solaris_package -s repo_uri [-r lint_repo_uri]"
+    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"
+}
+
+clone_sources() {
+    printf "Cloning valgrind-solaris sources... "
+    hg --quiet clone --insecure $PROJECT_URL $SRCDIR 2> $TMPDIR/hg-clone.log.stderr
+    (( $? != 0 )) && fail "Failed to clone repo from $PROJECT_URL"
+    printf "done.\n"
+}
+
+update_sources_to_revision() {
+    cd $SRCDIR
+    tag=$( grep "pkg.fmri" $IPS_MANIFEST | tr -s ' ' | \
+           sed -e 's/^.*developer\/debug\/valgrind@.*,//' )
+    [[ -z $tag ]] && fail "Failed to find revision tag in $IPS_MANIFEST"
+
+    printf "Updating cloned sources to revision tag $tag... "
+    hg --quiet update -r $tag
+    (( $? != 0 )) && fail "Failed to update cloned sources to tag $tag"
+    printf "done.\n"
+}
+
+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 "r:s:" args; do
+    case $args in
+    s)
+        repo_uri=$OPTARG
+        ;;
+    r)
+        lint_repo_uri=$OPTARG
+        ;;
+    *)
+        usage
+        exit 1
+        ;;
+    esac
+done
+
+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
+
+clone_sources
+update_sources_to_revision 
+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