Home | History | Annotate | Download | only in solaris
      1 #!/usr/bin/ksh
      2 #
      3 # Builds a Solaris IPS package called "valgrind" from the source
      4 # directory. The Valgrind and VEX revisions are taken from that
      5 # source directory and written to solaris/valgrind.p5m IPS manifest.
      6 #
      7 # Requires the following packages to be installed on Solaris 11:
      8 # - data/xml-common		(install first before any docbook ones!)
      9 # - data/docbook/docbook-style-xsl
     10 # - data/docbook/docbook-dtds
     11 # - developer/build/autoconf
     12 # - developer/build/automake-111
     13 # - developer/debug/gdb
     14 # - developer/gnu-binutils
     15 # - developer/versioning/mercurial
     16 # - system/header
     17 # - and the latest developer/gcc package.
     18 #
     19 # Requires a pre-established IPS repository.
     20 # For example to create a file-based repository, do:
     21 # - pkgrepo create $repo_uri
     22 # - pkgrepo set -s $repo_uri publisher/prefix=valgrind
     23 #
     24 
     25 TMPDIR=/var/tmp/valgrind-build
     26 SRCDIR=$TMPDIR/sources
     27 INSTALLDIR=$TMPDIR/install
     28 IPS_MANIFEST=solaris/valgrind.p5m
     29 
     30 usage() {
     31     echo "Usage:"
     32     echo "build_solaris_package -p source_dir -s repo_uri [-r lint_repo_uri]"
     33     echo "\t-p source_dir contains working copy of the Valgrind sources"
     34     echo "\t-s repo_uri publishes to the repository located at the given URI"
     35     echo "\t            or file system path"
     36     echo "\t-r lint_repo_uri location of lint reference repository"
     37 }
     38 
     39 fail() {
     40     msg=$1
     41 
     42     echo "\n$msg"
     43     echo "Additional information could be found in directory $TMPDIR."
     44     exit 1
     45 }
     46 
     47 remove_dirs() {
     48     rm -rf $TMPDIR
     49 }
     50 
     51 create_dirs() {
     52     mkdir -p $TMPDIR
     53     (( $? != 0 )) && fail "Failed to create directory $TMPDIR."
     54 
     55     mkdir -p $INSTALLDIR
     56     (( $? != 0 )) && fail "Failed to create directory $INSTALLDIR."
     57 }
     58 
     59 export_sources() {
     60     printf "Exporting sources... "
     61     svn export --quiet --ignore-externals $source_directory $SRCDIR \
     62         2> $TMPDIR/svn-export-valgrind.log.stderr
     63     (( $? != 0 )) && fail "Failed to export working copy from $source_directory."
     64     svn export --quiet --ignore-externals $source_directory/VEX $SRCDIR/VEX \
     65         2> $TMPDIR/svn-export-vex.log.stderr
     66     (( $? != 0 )) && fail "Failed to export working copy from $source_directory/VEX."
     67     printf "done.\n"
     68 }
     69 
     70 modify_ips_manifest() {
     71     valgrind_rev=$( svn info $source_directory | grep Revision | sed -e 's/Revision: //' )
     72     vex_rev=$( svn info $source_directory/VEX | grep Revision | sed -e 's/Revision: //' )
     73 
     74     [[ -z $valgrind_rev ]] && fail "Failed to find Valgrind revision."
     75     [[ -z $vex_rev ]] && fail "Failed to find VEX revision."
     76 
     77     echo "Valgrind revision: $valgrind_rev, VEX revision $vex_rev."
     78 
     79     sed -i -e "s/VVVVV-XXXX/${valgrind_rev}-${vex_rev}/" $SRCDIR/$IPS_MANIFEST
     80 }
     81 
     82 run_autogen() {
     83     printf "Creating autotools support files... "
     84     ./autogen.sh > $TMPDIR/autogen.log.stdout 2> $TMPDIR/autogen.log.stderr
     85     (( $? != 0 )) && fail "Failed to generate autotools support files."
     86     printf "done.\n"
     87 }
     88 
     89 run_configure() {
     90     printf "Running configure... "
     91     ./configure CC='gcc -m64' CXX='g++ -m64' --prefix=/usr > $TMPDIR/configure.log
     92     (( $? != 0 )) && fail "Failed to run configure."
     93     printf "done.\n"
     94 }
     95 
     96 run_make_docs() {
     97    printf "Making docs... "
     98    make --directory=docs html-docs > $TMPDIR/make-docs.log.stdout 2> $TMPDIR/make-docs.log.stderr
     99    (( $? != 0 )) && fail "Failed to make html-docs."
    100    printf "done.\n"
    101 }
    102 
    103 run_make_man_pages() {
    104    printf "Making man pages... "
    105    make --directory=docs man-pages > $TMPDIR/make-man-pages.log.stdout 2> $TMPDIR/make-man-pages.log.stderr
    106    (( $? != 0 )) && fail "Failed to make man-pages."
    107    printf "done.\n"
    108 }
    109 
    110 run_make() {
    111     printf "Running make... "
    112     make --quiet > $TMPDIR/make.log
    113     (( $? != 0 )) && fail "Failed to run make."
    114     printf "done.\n"
    115 }
    116 
    117 run_make_install() {
    118     printf "Running 'make install'... "
    119     make --quiet install DESTDIR=$INSTALLDIR > $TMPDIR/make-install.log
    120     (( $? != 0 )) && fail "Failed to run 'make install'."
    121 
    122     cp AUTHORS COPYING* NEWS NEWS.old README* $INSTALLDIR/usr/share/doc/valgrind
    123     (( $? != 0 )) && fail "Failed to copy additional files to $INSTALLDIR."
    124 
    125     printf "done.\n"
    126 }
    127 
    128 run_pkglint() {
    129     printf "Running pkglint... "
    130     pkglint -c $TMPDIR/lint-cache -r $lint_repo_uri $SRCDIR/$IPS_MANIFEST > $TMPDIR/pkglint.log
    131     (( $? != 0 )) && fail "pkglint failed."
    132     printf "done.\n"
    133 }
    134 
    135 publish_package() {
    136     printf "Publishing package... "
    137     pkgsend publish -s $repo_uri -d $INSTALLDIR $SRCDIR/solaris/valgrind.p5m > $TMPDIR/pkgsend.log
    138     (( $? != 0 )) && fail "Failed to publish the package."
    139     printf "done.\n"
    140 }
    141 
    142 while getopts "p:r:s:" args; do
    143     case $args in
    144     p)
    145         source_directory=$OPTARG
    146         ;;
    147     r)
    148         lint_repo_uri=$OPTARG
    149         ;;
    150     s)
    151         repo_uri=$OPTARG
    152         ;;
    153     *)
    154         usage
    155         exit 1
    156         ;;
    157     esac
    158 done
    159 
    160 if [[ -z $source_directory ]]; then
    161     echo "No source directory specified.\n"
    162     usage
    163     exit 1
    164 fi
    165 
    166 if [[ -z $repo_uri ]]; then
    167     echo "No repo_uri specified.\n"
    168     usage
    169     exit 1
    170 fi
    171 
    172 # Determine the lint repo_uri to use from the current 'solaris' one
    173 # if not specified explicitly.
    174 if [[ -z $lint_repo_uri ]]; then
    175     publisher=$( pkg publisher | grep solaris | tr -s ' ' )
    176     if [[ $publisher == *sticky* ]]; then
    177         lint_repo_uri=$( echo "$publisher" | cut -d ' ' -f 6 )
    178     else
    179         lint_repo_uri=$( echo "$publisher" | cut -d ' ' -f 5 )
    180     fi
    181     [[ -z $lint_repo_uri ]] && fail "Failed to determine solaris IPS publisher."
    182     echo "lint_repo_uri determined as $lint_repo_uri"
    183 fi
    184 
    185 
    186 remove_dirs
    187 create_dirs
    188 cd $TMPDIR
    189 
    190 export_sources
    191 modify_ips_manifest
    192 cd $SRCDIR
    193 run_autogen
    194 run_configure
    195 run_make_docs
    196 run_make_man_pages
    197 run_make
    198 run_make_install
    199 
    200 cd $TMPDIR
    201 run_pkglint
    202 publish_package
    203 
    204 remove_dirs
    205 return 0
    206