18eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#!/usr/bin/ksh
28eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#
38b0d32acad8351a454c09b3149189fb331c64dfairaisr# Builds a Solaris IPS package called "valgrind" from the source
48b0d32acad8351a454c09b3149189fb331c64dfairaisr# directory. The Valgrind and VEX revisions are taken from that
58b0d32acad8351a454c09b3149189fb331c64dfairaisr# source directory and written to solaris/valgrind.p5m IPS manifest.
68eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#
78eb8bab992e3998c33770b0cdb16059a8b918a06sewardj# Requires the following packages to be installed on Solaris 11:
88eb8bab992e3998c33770b0cdb16059a8b918a06sewardj# - data/xml-common		(install first before any docbook ones!)
98eb8bab992e3998c33770b0cdb16059a8b918a06sewardj# - data/docbook/docbook-style-xsl
108eb8bab992e3998c33770b0cdb16059a8b918a06sewardj# - data/docbook/docbook-dtds
118eb8bab992e3998c33770b0cdb16059a8b918a06sewardj# - developer/build/autoconf
128eb8bab992e3998c33770b0cdb16059a8b918a06sewardj# - developer/build/automake-111
138eb8bab992e3998c33770b0cdb16059a8b918a06sewardj# - developer/debug/gdb
148eb8bab992e3998c33770b0cdb16059a8b918a06sewardj# - developer/gnu-binutils
158eb8bab992e3998c33770b0cdb16059a8b918a06sewardj# - developer/versioning/mercurial
168eb8bab992e3998c33770b0cdb16059a8b918a06sewardj# - system/header
178eb8bab992e3998c33770b0cdb16059a8b918a06sewardj# - and the latest developer/gcc package.
188eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#
198eb8bab992e3998c33770b0cdb16059a8b918a06sewardj# Requires a pre-established IPS repository.
208eb8bab992e3998c33770b0cdb16059a8b918a06sewardj# For example to create a file-based repository, do:
218eb8bab992e3998c33770b0cdb16059a8b918a06sewardj# - pkgrepo create $repo_uri
228eb8bab992e3998c33770b0cdb16059a8b918a06sewardj# - pkgrepo set -s $repo_uri publisher/prefix=valgrind
238eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#
248eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
258b0d32acad8351a454c09b3149189fb331c64dfairaisrTMPDIR=/var/tmp/valgrind-build
268eb8bab992e3998c33770b0cdb16059a8b918a06sewardjSRCDIR=$TMPDIR/sources
278eb8bab992e3998c33770b0cdb16059a8b918a06sewardjINSTALLDIR=$TMPDIR/install
288eb8bab992e3998c33770b0cdb16059a8b918a06sewardjIPS_MANIFEST=solaris/valgrind.p5m
298eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
308eb8bab992e3998c33770b0cdb16059a8b918a06sewardjusage() {
318eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    echo "Usage:"
328b0d32acad8351a454c09b3149189fb331c64dfairaisr    echo "build_solaris_package -p source_dir -s repo_uri [-r lint_repo_uri]"
338b0d32acad8351a454c09b3149189fb331c64dfairaisr    echo "\t-p source_dir contains working copy of the Valgrind sources"
348eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    echo "\t-s repo_uri publishes to the repository located at the given URI"
358eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    echo "\t            or file system path"
368eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    echo "\t-r lint_repo_uri location of lint reference repository"
378eb8bab992e3998c33770b0cdb16059a8b918a06sewardj}
388eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
398eb8bab992e3998c33770b0cdb16059a8b918a06sewardjfail() {
408eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    msg=$1
418eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
428eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    echo "\n$msg"
438b0d32acad8351a454c09b3149189fb331c64dfairaisr    echo "Additional information could be found in directory $TMPDIR."
448eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    exit 1
458eb8bab992e3998c33770b0cdb16059a8b918a06sewardj}
468eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
478eb8bab992e3998c33770b0cdb16059a8b918a06sewardjremove_dirs() {
488eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    rm -rf $TMPDIR
498eb8bab992e3998c33770b0cdb16059a8b918a06sewardj}
508eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
518eb8bab992e3998c33770b0cdb16059a8b918a06sewardjcreate_dirs() {
528eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    mkdir -p $TMPDIR
538b0d32acad8351a454c09b3149189fb331c64dfairaisr    (( $? != 0 )) && fail "Failed to create directory $TMPDIR."
548eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
558eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    mkdir -p $INSTALLDIR
568b0d32acad8351a454c09b3149189fb331c64dfairaisr    (( $? != 0 )) && fail "Failed to create directory $INSTALLDIR."
578eb8bab992e3998c33770b0cdb16059a8b918a06sewardj}
588eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
598b0d32acad8351a454c09b3149189fb331c64dfairaisrexport_sources() {
608b0d32acad8351a454c09b3149189fb331c64dfairaisr    printf "Exporting sources... "
618b0d32acad8351a454c09b3149189fb331c64dfairaisr    svn export --quiet --ignore-externals $source_directory $SRCDIR \
628b0d32acad8351a454c09b3149189fb331c64dfairaisr        2> $TMPDIR/svn-export-valgrind.log.stderr
638b0d32acad8351a454c09b3149189fb331c64dfairaisr    (( $? != 0 )) && fail "Failed to export working copy from $source_directory."
648b0d32acad8351a454c09b3149189fb331c64dfairaisr    svn export --quiet --ignore-externals $source_directory/VEX $SRCDIR/VEX \
658b0d32acad8351a454c09b3149189fb331c64dfairaisr        2> $TMPDIR/svn-export-vex.log.stderr
668b0d32acad8351a454c09b3149189fb331c64dfairaisr    (( $? != 0 )) && fail "Failed to export working copy from $source_directory/VEX."
678eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    printf "done.\n"
688eb8bab992e3998c33770b0cdb16059a8b918a06sewardj}
698eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
708b0d32acad8351a454c09b3149189fb331c64dfairaisrmodify_ips_manifest() {
718b0d32acad8351a454c09b3149189fb331c64dfairaisr    valgrind_rev=$( svn info $source_directory | grep Revision | sed -e 's/Revision: //' )
728b0d32acad8351a454c09b3149189fb331c64dfairaisr    vex_rev=$( svn info $source_directory/VEX | grep Revision | sed -e 's/Revision: //' )
738eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
748b0d32acad8351a454c09b3149189fb331c64dfairaisr    [[ -z $valgrind_rev ]] && fail "Failed to find Valgrind revision."
758b0d32acad8351a454c09b3149189fb331c64dfairaisr    [[ -z $vex_rev ]] && fail "Failed to find VEX revision."
768b0d32acad8351a454c09b3149189fb331c64dfairaisr
778b0d32acad8351a454c09b3149189fb331c64dfairaisr    echo "Valgrind revision: $valgrind_rev, VEX revision $vex_rev."
788b0d32acad8351a454c09b3149189fb331c64dfairaisr
798b0d32acad8351a454c09b3149189fb331c64dfairaisr    sed -i -e "s/VVVVV-XXXX/${valgrind_rev}-${vex_rev}/" $SRCDIR/$IPS_MANIFEST
808eb8bab992e3998c33770b0cdb16059a8b918a06sewardj}
818eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
828eb8bab992e3998c33770b0cdb16059a8b918a06sewardjrun_autogen() {
838eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    printf "Creating autotools support files... "
848eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    ./autogen.sh > $TMPDIR/autogen.log.stdout 2> $TMPDIR/autogen.log.stderr
858b0d32acad8351a454c09b3149189fb331c64dfairaisr    (( $? != 0 )) && fail "Failed to generate autotools support files."
868eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    printf "done.\n"
878eb8bab992e3998c33770b0cdb16059a8b918a06sewardj}
888eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
898eb8bab992e3998c33770b0cdb16059a8b918a06sewardjrun_configure() {
908eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    printf "Running configure... "
918eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    ./configure CC='gcc -m64' CXX='g++ -m64' --prefix=/usr > $TMPDIR/configure.log
928b0d32acad8351a454c09b3149189fb331c64dfairaisr    (( $? != 0 )) && fail "Failed to run configure."
938eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    printf "done.\n"
948eb8bab992e3998c33770b0cdb16059a8b918a06sewardj}
958eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
968eb8bab992e3998c33770b0cdb16059a8b918a06sewardjrun_make_docs() {
978eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   printf "Making docs... "
988eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   make --directory=docs html-docs > $TMPDIR/make-docs.log.stdout 2> $TMPDIR/make-docs.log.stderr
998b0d32acad8351a454c09b3149189fb331c64dfairaisr   (( $? != 0 )) && fail "Failed to make html-docs."
1008eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   printf "done.\n"
1018eb8bab992e3998c33770b0cdb16059a8b918a06sewardj}
1028eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
1038eb8bab992e3998c33770b0cdb16059a8b918a06sewardjrun_make_man_pages() {
1048eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   printf "Making man pages... "
1058eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   make --directory=docs man-pages > $TMPDIR/make-man-pages.log.stdout 2> $TMPDIR/make-man-pages.log.stderr
1068b0d32acad8351a454c09b3149189fb331c64dfairaisr   (( $? != 0 )) && fail "Failed to make man-pages."
1078eb8bab992e3998c33770b0cdb16059a8b918a06sewardj   printf "done.\n"
1088eb8bab992e3998c33770b0cdb16059a8b918a06sewardj}
1098eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
1108eb8bab992e3998c33770b0cdb16059a8b918a06sewardjrun_make() {
1118eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    printf "Running make... "
1128eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    make --quiet > $TMPDIR/make.log
1138b0d32acad8351a454c09b3149189fb331c64dfairaisr    (( $? != 0 )) && fail "Failed to run make."
1148eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    printf "done.\n"
1158eb8bab992e3998c33770b0cdb16059a8b918a06sewardj}
1168eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
1178eb8bab992e3998c33770b0cdb16059a8b918a06sewardjrun_make_install() {
1188eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    printf "Running 'make install'... "
1198eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    make --quiet install DESTDIR=$INSTALLDIR > $TMPDIR/make-install.log
1208b0d32acad8351a454c09b3149189fb331c64dfairaisr    (( $? != 0 )) && fail "Failed to run 'make install'."
1218eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
1228eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    cp AUTHORS COPYING* NEWS NEWS.old README* $INSTALLDIR/usr/share/doc/valgrind
1238b0d32acad8351a454c09b3149189fb331c64dfairaisr    (( $? != 0 )) && fail "Failed to copy additional files to $INSTALLDIR."
1248eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
1258eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    printf "done.\n"
1268eb8bab992e3998c33770b0cdb16059a8b918a06sewardj}
1278eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
1288eb8bab992e3998c33770b0cdb16059a8b918a06sewardjrun_pkglint() {
1298eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    printf "Running pkglint... "
1308eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    pkglint -c $TMPDIR/lint-cache -r $lint_repo_uri $SRCDIR/$IPS_MANIFEST > $TMPDIR/pkglint.log
1318b0d32acad8351a454c09b3149189fb331c64dfairaisr    (( $? != 0 )) && fail "pkglint failed."
1328eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    printf "done.\n"
1338eb8bab992e3998c33770b0cdb16059a8b918a06sewardj}
1348eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
1358eb8bab992e3998c33770b0cdb16059a8b918a06sewardjpublish_package() {
1368eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    printf "Publishing package... "
1378eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    pkgsend publish -s $repo_uri -d $INSTALLDIR $SRCDIR/solaris/valgrind.p5m > $TMPDIR/pkgsend.log
1388b0d32acad8351a454c09b3149189fb331c64dfairaisr    (( $? != 0 )) && fail "Failed to publish the package."
1398eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    printf "done.\n"
1408eb8bab992e3998c33770b0cdb16059a8b918a06sewardj}
1418eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
1428b0d32acad8351a454c09b3149189fb331c64dfairaisrwhile getopts "p:r:s:" args; do
1438eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    case $args in
1448b0d32acad8351a454c09b3149189fb331c64dfairaisr    p)
1458b0d32acad8351a454c09b3149189fb331c64dfairaisr        source_directory=$OPTARG
1468eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        ;;
1478eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    r)
1488eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        lint_repo_uri=$OPTARG
1498eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        ;;
1508b0d32acad8351a454c09b3149189fb331c64dfairaisr    s)
1518b0d32acad8351a454c09b3149189fb331c64dfairaisr        repo_uri=$OPTARG
1528b0d32acad8351a454c09b3149189fb331c64dfairaisr        ;;
1538eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    *)
1548eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        usage
1558eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        exit 1
1568eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        ;;
1578eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    esac
1588eb8bab992e3998c33770b0cdb16059a8b918a06sewardjdone
1598eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
1608b0d32acad8351a454c09b3149189fb331c64dfairaisrif [[ -z $source_directory ]]; then
1618b0d32acad8351a454c09b3149189fb331c64dfairaisr    echo "No source directory specified.\n"
1628b0d32acad8351a454c09b3149189fb331c64dfairaisr    usage
1638b0d32acad8351a454c09b3149189fb331c64dfairaisr    exit 1
1648b0d32acad8351a454c09b3149189fb331c64dfairaisrfi
1658b0d32acad8351a454c09b3149189fb331c64dfairaisr
1668eb8bab992e3998c33770b0cdb16059a8b918a06sewardjif [[ -z $repo_uri ]]; then
1678eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    echo "No repo_uri specified.\n"
1688eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    usage
1698eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    exit 1
1708eb8bab992e3998c33770b0cdb16059a8b918a06sewardjfi
1718eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
1728eb8bab992e3998c33770b0cdb16059a8b918a06sewardj# Determine the lint repo_uri to use from the current 'solaris' one
1738eb8bab992e3998c33770b0cdb16059a8b918a06sewardj# if not specified explicitly.
1748eb8bab992e3998c33770b0cdb16059a8b918a06sewardjif [[ -z $lint_repo_uri ]]; then
1758eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    publisher=$( pkg publisher | grep solaris | tr -s ' ' )
1768eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    if [[ $publisher == *sticky* ]]; then
1778eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        lint_repo_uri=$( echo "$publisher" | cut -d ' ' -f 6 )
1788eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    else
1798eb8bab992e3998c33770b0cdb16059a8b918a06sewardj        lint_repo_uri=$( echo "$publisher" | cut -d ' ' -f 5 )
1808eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    fi
1818b0d32acad8351a454c09b3149189fb331c64dfairaisr    [[ -z $lint_repo_uri ]] && fail "Failed to determine solaris IPS publisher."
1828eb8bab992e3998c33770b0cdb16059a8b918a06sewardj    echo "lint_repo_uri determined as $lint_repo_uri"
1838eb8bab992e3998c33770b0cdb16059a8b918a06sewardjfi
1848eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
1858eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
1868eb8bab992e3998c33770b0cdb16059a8b918a06sewardjremove_dirs
1878eb8bab992e3998c33770b0cdb16059a8b918a06sewardjcreate_dirs
1888eb8bab992e3998c33770b0cdb16059a8b918a06sewardjcd $TMPDIR
1898eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
1908b0d32acad8351a454c09b3149189fb331c64dfairaisrexport_sources
1918b0d32acad8351a454c09b3149189fb331c64dfairaisrmodify_ips_manifest
1928eb8bab992e3998c33770b0cdb16059a8b918a06sewardjcd $SRCDIR
1938eb8bab992e3998c33770b0cdb16059a8b918a06sewardjrun_autogen
1948eb8bab992e3998c33770b0cdb16059a8b918a06sewardjrun_configure
1958eb8bab992e3998c33770b0cdb16059a8b918a06sewardjrun_make_docs
1968eb8bab992e3998c33770b0cdb16059a8b918a06sewardjrun_make_man_pages
1978eb8bab992e3998c33770b0cdb16059a8b918a06sewardjrun_make
1988eb8bab992e3998c33770b0cdb16059a8b918a06sewardjrun_make_install
1998eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
2008eb8bab992e3998c33770b0cdb16059a8b918a06sewardjcd $TMPDIR
2018eb8bab992e3998c33770b0cdb16059a8b918a06sewardjrun_pkglint
2028eb8bab992e3998c33770b0cdb16059a8b918a06sewardjpublish_package
2038eb8bab992e3998c33770b0cdb16059a8b918a06sewardj
2048eb8bab992e3998c33770b0cdb16059a8b918a06sewardjremove_dirs
2058eb8bab992e3998c33770b0cdb16059a8b918a06sewardjreturn 0
206