Index: trunk/psconfig/psbuild
===================================================================
--- trunk/psconfig/psbuild	(revision 11637)
+++ trunk/psconfig/psbuild	(revision 12136)
@@ -1,205 +1,266 @@
-#!/bin/csh
-
-set args=""
-set clean=0
-set rebuild=0
-set update=0
-set optimize=0
-set version=""
-set start=""
-set stop=""
-while ($#argv)
- switch ($1)
-  case -version:
-   shift
-   set version=$1;
-   breaksw;
-  case -clean:
-   set clean=1;
-   breaksw;
-  case -rebuild:
-   set rebuild=1;
-   set clean=1;
-   breaksw;
-  case -update:
-   set update=1;
-   breaksw;
-  case -optimize:
-   set optimize=1;
-   breaksw;
-  case -only:
-   shift
-   set start=$1;
-   set stop=$1;
-   breaksw;
-  case -start:
-   shift
-   set start=$1;
-   breaksw;
-  case -stop:
-   shift
-   set stop=$1;
-   breaksw;
-  default:
-   set args=($args $1);
-   breaksw;
- endsw
- shift
-end
-
-if ($#args != 1) goto usage
-if ("$args" == "") goto usage
-
-set group   = $args[1]
-set tagsets = tagsets/$group
-
-if (! -e $tagsets) then
-  echo "target $group not found in tagsets"
-  exit 2
-endif
-
-# set the version based on psconfig or -version (if set)
-if ("$version" != "") then
-  source psconfig.sh $version
-else
-  if (! $?PSVERSION) then
-    source psconfig.sh default
-  else
-    source psconfig.sh $PSVERSION
-  endif
-endif
-
-set psopts = ""
-if ($optimize) set psopts = "$psopts --enable-optimize"
-
-foreach target (`cat $tagsets | grep -v \#`)
- set name = `echo $target | tr ':' ' '`
-
- set dir = $name[1]
- set tag = $name[2]
-
- set mode = "NORMAL"
- set branch = 0
-
- if ($#name >= 3) then
-   set branch = $name[3]
- endif
- if ($#name >= 4) then
-   set mode = $name[4]
- endif
-
- if ("$start" != "") then
-   if ("$start" != "$dir") then
-     echo "skipping $dir"
-     continue
-   endif
-   set start = ""
- endif
-
- if ("$mode" == "SKIP") then
-    echo "skipping $dir"
-    continue 
- endif
-
- set current = `pwd`
- cd ../$dir
+#!/usr/bin/env perl
+
+$tagsets = "tagsets";
+
+$version = "";
+$clean = 0;
+$rebuild = 0;
+$optimize = 0;
+$start = "";
+$stop = "";
+$verbose = 0;
+
+@tARGV = ();
+for (; @ARGV > 0; ) {
+    if ($ARGV[0] eq "-version") {
+	$version = $ARGV[1];
+        shift; shift; next;
+    }
+    if ($ARGV[0] eq "-verbose") {
+	$verbose = 1;
+        shift; next;
+    }
+    if ($ARGV[0] eq "-clean") {
+	$clean = 1;
+        shift; next;
+    }
+    if ($ARGV[0] eq "-rebuild") {
+	$rebuild = 1;
+        shift; next;
+    }
+    if ($ARGV[0] eq "-optimize") {
+	$optimize = 1;
+        shift; next;
+    }
+    if ($ARGV[0] eq "-only") {
+	$start = $ARGV[1];
+	$stop = $ARGV[1];
+        shift; shift; next;
+    }
+    if ($ARGV[0] eq "-start") {
+	$start = $ARGV[1];
+        shift; shift; next;
+    }
+    if ($ARGV[0] eq "-stop") {
+	$stop = $ARGV[1];
+        shift; shift; next;
+    }
+    if ($ARGV[0] eq "-list") {
+	&list_distributions ();
+    }
+    if ($ARGV[0] eq "-h")     { &usage (); }
+    if ($ARGV[0] eq "-help")  { &usage (); }
+    if ($ARGV[0] eq "--help") { &usage (); }
+    @tARGV = (@tARGV, $ARGV[0]);
+    shift;
+}
+@ARGV = @tARGV;
+
+if ( @ARGV != 1) { &usage (); }
+
+$distribution = $ARGV[0];
+&load_distfile ();
+
+&build_distribution ();
+exit 0;
+
+sub build_distribution {
+    
+    # use psconfig.sh to set needed build aliases
+
+    # set the psconfig version:
+    if ("$version" eq "") {
+	$version = $ENV{'PSVERSION'};
+    }
+    if ("$version" eq "") {
+	$version = "default";
+    }
+
+    $psconfigure = `csh psconfig.sh --psconfigure $version`;
+    $psautogen   = `csh psconfig.sh --psautogen $version`;
+    $psperlbuild = `csh psconfig.sh --psperlbuild $version`;
+
+    print "psconfigure: $psconfigure\n";
+    print "psautogen:   $psautogen\n";
+    print "psperlbuild: $psperlbuild\n";
+
+    # set build environment variables
+    ps_setenv ("PATH", 		  "--path");
+    ps_setenv ("ARCH", 		  "--arch");
+    ps_setenv ("LD_LIBRARY_PATH", "--ld_library_path");
+    ps_setenv ("PKG_CONFIG_PATH", "--pkg_config_path");
+    ps_setenv ("ACLOCAL_FLAGS",   "--aclocal_flags");
+    ps_setenv ("PERL5LIB",        "--perl5lib");
+
+    print STDERR "ENV: $ENV{'PATH'}\n";
+
+    $psopts = "";
+    if ($optimize) { $psopts = "$psopts --enable-optimize"; }
+
+    $homedir = `pwd`; chomp $homedir;
+
+    for ($i = 0; $i < @cvsname; $i++) {
+	if (($start ne "") && ($start ne $cvsname[$i])) { next; }
+	$start = "";
+
+	($do_tag, $do_build, $do_package, $do_update) = $mode[$i] =~ m|(\S)(\S)(\S)(\S)|;
+	if ($do_build eq "N") { next; }
+
+	$workdir = "../$cvsname[$i]";
+	print "workdir: $workdir\n";
+	chdir $workdir;
+	
+	# XXX need to grab current value for cleanup
+	print "\n ** psbuild: $cvsname[$i] ** \n";
+	print "\033]0; ** psbuild: $cvsname[$i] ** \007";
+
+	# how do we build this component?
+	# - autogen.sh : configure : make : make install
+	# - configure : make : make install
+	# - make : make install
+	# - perl Build.PL : ./Build : ./Build install
  
- echo ""
- echo "***** building $name ($target) *****"
- pwd
-
- if ($update) then
-  switch ($tag)
-   case HEAD:
-    cvs -q up -d -A
-    if ($status) goto failure;
-    breaksw;
-   case NONE:
-    breaksw;
-   default:
-    cvs -q up -d -r $tag
-    if ($status) goto failure;
-    breaksw;
-  endsw
- endif
-
- # how do we build this component?
- # - autogen.sh : configure : make : make install
- # - configure : make : make install
- # - make : make install
- # - perl Build.PL : ./Build : ./Build install
- 
- if (-e Build.PL) then
-    echo $PERL5LIB
-    alias psperlbuild
-    psperlbuild
-    # perl Build.PL --install_path script=$bindir --install_path lib=$libdir --install_path bindoc={$PSCONFDIR}/man/man1 --install_path libdoc={$PSCONFDIR}/man/man3
-    if ($status) goto failure;
-
-    ./Build
-    if ($status) goto failure;
-
-    ./Build install
-    if ($status) goto failure;
-
-    goto success;
- endif
-
- if ($rebuild && $clean) then
-   if (-e configure) rm -f Makefile
-   if (-e configure.ac && -e autogen.sh) rm -f configure
- endif
-
- if (! -e Makefile) set rebuild = 1
-
- #  fix this: this runs autogen, which runs configure, then re-runs configure!
- if ($rebuild && ! -e configure && -e autogen.sh) then
-    echo psautogen $psopts
-    psautogen $psopts
-    if ($status) goto failure;
- endif
-
- if ($rebuild && -e configure) then
-    echo psconfigure $psopts
-    psconfigure $psopts
-    if ($status) goto failure;
- endif
-
- if (! -e Makefile) goto failure;
-
- if ($clean) then 
-    echo make clean
-    make clean
-    if ($status) goto failure;
- endif
-
- make
- if ($status) goto failure;
-
- make install
- if ($status) goto failure;
-
- success:
- cd $current
-
- if ("$stop" != "") then
-   if ("$stop" == "$dir") then
-     echo "stopping at $dir"
-     exit 0
-   endif
- endif
-
-end
-
-exit 0
-
-usage:
-  echo "USAGE: psbuild (group) [-version version] [-clean] [-rebuild] [-update] [-optimize]"
-  exit 2
-
-failure:
-  echo "psbuild failed"
-  echo "target: $target"
-  echo "dir: $dir"
-  echo "tag: $tag"
-  exit 2
+	if (-e "Build.PL") {
+	    vsystem ("$psperlbuild");
+	    if ($?) { &failure($cvsname[$i], "failure in perl Build.PL"); }
+
+	    vsystem ("./Build");
+	    if ($?) { &failure($cvsname[$i], "failure in Build"); }
+
+	    vsystem ("./Build install");
+	    if ($?) { &failure($cvsname[$i], "failure in Build install"); }
+	    
+	    next;
+	}
+
+	if ($rebuild && $clean) {
+	    if (-e "configure") { unlink "Makefile"; }
+	    if (-e "configure.ac" && -e "autogen.sh") { unlink "configure"; }
+	}
+	$rebuild_this = $rebuild;
+
+	# set a local variable for this loop on rebuild;
+	if (! -e "Makefile") { $rebuild_this = 1; }
+
+	#  run autogen
+	$skip_configure = 0;
+	if ($rebuild_this && ! -e "configure" && -e "autogen.sh") {
+	    $skip_configure = 1;
+	    vsystem ("$psautogen $psopts");
+	    if ($?) { &failure($cvsname[$i], "failure in psautogen"); }
+	}
+
+	if ($rebuild_this && -e "configure" && !$skip_configure) {
+	    vsystem ("$psconfigure $psopts");
+	    if ($?) { &failure($cvsname[$i], "failure in psconfigure"); }
+	}
+
+	if (! -e "Makefile") { &failure($cvsname[$i], "missing makefile"); }
+
+	if ($clean) { 
+	    vsystem ("make clean");
+	    if ($?) { &failure($cvsname[$i], "failure in make clean"); }
+	}
+
+	vsystem ("make");
+	if ($?) { &failure($cvsname[$i], "failure in make"); }
+
+	vsystem ("make install");
+	if ($?) { &failure($cvsname[$i], "failure in make install"); }
+
+	print "*** done with $cvsname[$i] ***\n";
+
+      success:
+	chdir $homedir;
+	if (($stop ne "") && ($stop eq $cvsname[$i])) { last; }
+    }
+    print "\033]0; ** psbuild: finished ** \007";
+    exit 0;
+}
+
+sub vsystem {
+    print STDERR "@_\n";
+    $status = system ("@_");
+    $status;
+}
+
+sub list_distributions {
+    @list = <$tagsets/*.dst>;
+    foreach $line (@list) {
+	chomp $line;
+	($dist) = $line =~ m|$tagsets/(\S*).dst|;
+	print STDERR "$dist\n";
+    }
+    exit 2;
+}
+
+sub load_distfile {
+    # open and read the distribution file
+    # results go into @cvsname, @branchtag, @branchver, @mode
+    $file = "$tagsets/$ARGV[0].dst";
+    open (FILE, $file) || die "ERROR: can't open distribution file $file\n";
+    @list = <FILE>;
+    close (FILE);
+
+    @mode = ();
+    @cvsname = ();
+    @branchtag = ();
+    @branchver = ();
+
+    foreach $line (@list) {
+	chop $line;
+	if ($line =~ m|^\s*$|) { next; }
+	if ($line =~ m|^\s*\#|) { next; }
+
+	($mode, $cvsname, $branchtag, $branchver) = split (" ", $line);
+	
+	if ($cvsname eq "") { die "missing module name\n"; }
+
+	($do_tag, $do_build, $do_package, $do_update) = $mode =~ m|(\S)(\S)(\S)(\S)|;
+	if (($do_tag ne "Y") && ($do_tag ne "N")) { die "invalid tag option $do_tag\n"; }
+	if (($do_build ne "Y") && ($do_build ne "N")) { die "invalid tag option $do_build\n"; }
+	if (($do_package ne "Y") && ($do_package ne "N")) { die "invalid tag option $do_package\n"; }
+	if (($do_update ne "Y") && ($do_update ne "N")) { die "invalid tag option $do_update\n"; }
+	
+	if ($verbose) { print "tag: $do_tag, build: $do_build, package: $do_package, update: $do_update "; }
+	if ($verbose) { print "module: $cvsname, branchtag: $branchtag, branchver: $branchver \n"; }
+
+	push @mode, $mode;
+	push @cvsname, $cvsname;
+	push @branchtag, $branchtag;
+	push @branchver, $branchver;
+    }
+}
+
+sub failure {
+    die "problem building $_[0] : $_[1]\n";
+    print "\033]0; ** psbuild: failure  ** \007";
+}
+
+sub usage {
+    print STDERR "USAGE: psbuild [options] (distribution)\n";
+    print STDERR "     : -version (version) : specify alternate psconfig installation version\n";
+    print STDERR "     : -clean             : clean the source directories before building\n";
+    print STDERR "     : -rebuild           : run 'autogen' (C code)\n";
+    print STDERR "     : -optimize          : set flags for optimized code\n";
+    print STDERR "     : -only (module)     : only build the specified module\n";
+    print STDERR "     : -start (module)    : begin build at specified module\n";
+    print STDERR "     : -stop (module)     : stop build after specified module\n\n";
+    print STDERR "     : psbuild -list      : list the available distributions\n";
+    print STDERR "     : psbuild -h         : this help listing\n";
+    print STDERR "     : psbuild -help      : this help listing\n";
+    print STDERR "     : psbuild --help     : this help listing\n";
+    exit 2;
+}
+
+sub ps_setenv {
+
+    my $var = $_[0];
+    my $flag = $_[1];
+
+    my $answer = `csh psconfig.sh $flag $version`;
+    chomp $answer;
+
+    $ENV{$var} = $answer;
+}
+
