| #!/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 |