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