gnash-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gnash-commit] /srv/bzr/gnash/trunk r11975: add initial version of autom


From: Rob Savoye
Subject: [Gnash-commit] /srv/bzr/gnash/trunk r11975: add initial version of automated package building script.
Date: Thu, 25 Feb 2010 20:39:22 -0700
User-agent: Bazaar (2.0.3)

------------------------------------------------------------
revno: 11975
committer: Rob Savoye <address@hidden>
branch nick: trunk
timestamp: Thu 2010-02-25 20:39:22 -0700
message:
  add initial version of automated package building script.
added:
  packaging/buildhost.exp
=== added file 'packaging/buildhost.exp'
--- a/packaging/buildhost.exp   1970-01-01 00:00:00 +0000
+++ b/packaging/buildhost.exp   2010-02-26 03:39:22 +0000
@@ -0,0 +1,745 @@
+#!/usr/bin/expect
+# 
+#   Copyright (C) 2010 Free Software Foundation, Inc.
+# 
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+# 
+
+if {![info exists argv0]} {
+    send_error "Must use a version of Expect greater than 5.0\n"
+    exit 1
+}
+
+#
+# Global variables used by all files.
+#
+set logname     ""             ;# the users login name
+set configopts  ""             ;# options to pass to configure
+set branch      "trunk"                ;# the bzr branch to build
+set revno       ""             ;# the bzr revno to build
+set make        "make"         ;# make program, sometimes gmake
+set makeopts    "-w"           ;# options to pass to make
+set uploadcmd   "dupload"      ;# program to upload packages
+set objdir      "/build/trunk" ;# the base build tree
+set srcdir      "/build/src/trunk"     ;# the base source tree
+set inp                ""
+set outp       ""
+set timeout    ""
+set verbose    0
+set sum_file   ""
+set tool       ""
+set state       "bzr"
+#
+# These describe the host and target environments.
+#
+set build_triplet  ""          ;# type of architecture to run tests on
+set build_os      ""           ;# type of os the tests are running on
+set build_vendor   ""          ;# vendor name of the OS or workstation the 
test are running on
+set build_cpu      ""          ;# type of the cpu tests are running on
+set host_triplet   ""          ;# type of architecture to run tests on, 
sometimes remotely
+set host_os       ""           ;# type of os the tests are running on
+set host_vendor    ""          ;# vendor name of the OS or workstation the 
test are running on
+set host_cpu       ""          ;# type of the cpu tests are running on
+set target_triplet ""          ;# type of architecture to run tests on, final 
remote
+set target_os     ""           ;# type of os the tests are running on
+set target_vendor  ""          ;# vendor name of the OS or workstation the 
test are running on
+set target_cpu     ""          ;# type of the cpu tests are running on
+set target_alias   ""          ;# standard abbreviation of target
+set compiler_flags ""          ;# the flags used by the compiler
+set only          "no"         ;# only run one state at a time
+
+#
+# trap some signals so we know whats happening. These definitions are only
+# temporary until we read in the library stuff
+#
+trap { send_user "\nterminated\n";             exit 1 } SIGTERM
+trap { send_user "\ninterrupted by user\n";    exit 1 } SIGINT
+trap { send_user "\nsigquit\n";                exit 1 } SIGQUIT
+
+#
+# some convenience abbreviations
+#
+if {![info exists hex]} {
+    set hex "0x\[0-9A-Fa-f\]+"
+}
+if {![info exists decimal]} {
+    set decimal "\[0-9\]+"
+}
+
+#
+# set the base dir (current working directory)
+#
+set base_dir [pwd]
+
+#
+# verbose [-n] [-log] [--] message [level]
+#
+# Print MESSAGE if the verbose level is >= LEVEL.
+# The default value of LEVEL is 1.
+# "-n" says to not print a trailing newline.
+# "-log" says to add the text to the log file even if it won't be printed.
+# Note that the apparent behaviour of `send_user' dictates that if the message
+# is printed it is also added to the log file.
+# Use "--" if MESSAGE begins with "-".
+#
+# This is defined here rather than in framework.exp so we can use it
+# while still loading in the support files.
+#
+proc verbose { args } {
+    global verbose
+    set newline 1
+    set logfile 0
+
+    set i 0
+    if { [string index [lindex $args 0] 0] == "-" } {
+       for { set i 0 } { $i < [llength $args] } { incr i } {
+           if { [lindex $args $i] == "--" } {
+               incr i
+               break
+           } elseif { [lindex $args $i] == "-n" } {
+               set newline 0
+           } elseif { [lindex $args $i] == "-log" } {
+               set logfile 1
+            } elseif { [lindex $args $i] == "-x" } {
+                set xml 1
+           } elseif { [string index [lindex $args $i] 0] == "-" } {
+               clone_output "ERROR: verbose: illegal argument: [lindex $args 
$i]"
+               return
+           } else {
+               break
+           }
+       }
+       if { [llength $args] == $i } {
+           clone_output "ERROR: verbose: nothing to print"
+           return
+       }
+    }
+
+    set level 1
+    if { [llength $args] > $i + 1 } {
+       set level [lindex $args [expr { $i + 1 }]]
+    }
+    set message [lindex $args $i]
+
+    if { $verbose >= $level } {
+       # There is no need for the "--" argument here, but play it safe.
+       # We assume send_user also sends the text to the log file (which
+       # appears to be the case though the docs aren't clear on this).
+       if { $newline } {
+           send_user -- "$message\n"
+       } else {
+           send_user -- "$message"
+       }
+    } elseif { $logfile } {
+       if { $newline } {
+           send_log "$message\n"
+       } else {
+           send_log "$message"
+       }
+    }
+}
+#
+# load_file [-1] [--] file1 [ file2 ... ]
+#
+# Utility to source a file.  All are sourced in order unless the flag "-1"
+# is given in which case we stop after finding the first one.
+# The result is 1 if a file was found, 0 if not.
+# If a tcl error occurs while sourcing a file, we print an error message
+# and exit.
+#
+# ??? Perhaps add an optional argument of some descriptive text to add to
+# verbose and error messages (eg: -t "library file" ?).
+#
+proc load_file { args } {
+    set i 0
+    set only_one 0
+    if { [lindex $args $i] == "-1" } {
+       set only_one 1
+       incr i
+    }
+    if { [lindex $args $i] == "--" } {
+       incr i
+    }
+
+    set found 0
+    foreach file [lrange $args $i end] {
+       verbose "Looking for $file" 2
+        # In Tcl7.5a2, "file exists" can fail if the filename looks
+       # like ~/FILE and the environment variable HOME does not
+       # exist.
+        if {! [catch {file exists $file} result] && $result} {
+           set found 1
+           verbose "Found $file"
+           if { [catch "uplevel #0 source $file"] == 1 } {
+               send_error "ERROR: tcl error sourcing $file.\n"
+               global errorInfo
+               if {[info exists errorInfo]} {
+                   send_error "$errorInfo\n"
+               }
+               exit 1
+           }
+           if { $only_one } {
+               break
+           }
+       }
+    }
+    return $found
+}
+
+#
+# search_and_load_file -- search DIRLIST looking for FILELIST.
+# TYPE is used when displaying error and progress messages.
+#
+proc search_and_load_file { type filelist dirlist } {
+    set found 0
+
+    foreach dir $dirlist {
+       foreach initfile $filelist {
+           verbose "Looking for $type ${dir}/${initfile}" 2
+           if {[file exists [file join ${dir} ${initfile}]]} {
+               set found 1
+               set error ""
+               if { ${type} != "library file" } {
+                   send_user "Using ${dir}/${initfile} as ${type}.\n"
+               } else {
+                   verbose "Loading ${dir}/${initfile}"
+               }
+               if {[catch "uplevel #0 source ${dir}/${initfile}" error] == 1} {
+                   global errorInfo
+                   send_error "ERROR: tcl error sourcing ${type} 
${dir}/${initfile}.\n${error}\n"
+                   if {[info exists errorInfo]} {
+                       send_error "$errorInfo\n"
+                   }
+                   exit 1
+               }
+               break
+           }
+       }
+       if { $found } {
+           break
+       }
+    }
+    return $found
+}
+
+#
+# Give a usage statement.
+#
+proc usage { } {
+    global tool
+
+    send_user "USAGE: buildhost \[options...\]\n"
+    send_user "\t (--st) (-state)\t\tset the state manually\n"
+    send_user "\t (--on) (-only)\t\tonly run the one state\n"
+    send_user "\tstates are: bzr autogen configure make dpkg upload test clean"
+}
+
+#
+# Parse the arguments the first time looking for these.  We will ultimately
+# parse them twice.  Things are complicated because:
+# - we want to parse --verbose early on
+# - we don't want config files to override command line arguments
+#   (eg: $base_dir/$configfile vs --host/--target)
+# - we need some command line arguments before we can process some config files
+#   (eg: --objdir before $objdir/$configfile, --host/--target before $DEJAGNU)
+# The use of `arg_host_triplet' and `arg_target_triplet' lets us avoid parsing
+# the arguments three times.
+#
+
+set arg_host_triplet ""
+set arg_target_triplet ""
+set arg_build_triplet ""
+set argc [ llength $argv ]
+for { set i 0 } { $i < $argc } { incr i } {
+    set option [lindex $argv $i]
+
+    # make all options have two hyphens
+    switch -glob -- $option {
+        "--*" {
+        }
+        "-*" {
+           set option "-$option"
+        }
+    }
+
+    # split out the argument for options that take them
+    switch -glob -- $option {
+       "--*=*" {
+           regexp {^[^=]*=(.*)$} $option nil optarg
+       }
+       "--on*" -
+       "--ob*" -
+       "--sr*" -
+       "--st*" {
+           incr i
+           set optarg [lindex $argv $i]
+       }
+    }
+
+    switch -glob -- $option {
+       "--ob*" {                       # (--objdir) where the test case object 
code lives
+           set objdir $optarg
+           continue
+       }
+
+       "--sr*" {                       # (--srcdir) where the source code lives
+           set srcdir $optarg
+           continue
+       }       
+
+       "--st*" {                       # (--state) the initial state
+           set state $optarg
+           continue
+       }       
+
+       "--on*" {                       # (--only) only run one state, then exit
+           set only yes
+           continue
+       }       
+
+       "--v" -
+       "--verb*" {                     # (--verbose) verbose output
+           incr verbose
+           continue
+       }
+
+       "[A-Z0-9_-.]*=*" { # process makefile style args like CC=gcc, etc...
+           if {[regexp "^(\[A-Z0-9_-\]+)=(.*)$" $option junk var val]} {
+               set $var $val
+               verbose "$var is now $val"
+               append makevars "set $var $val;" ;# FIXME: Used anywhere?
+               unset junk var val
+           } else {
+               send_error "Illegal variable specification:\n"
+               send_error "$option\n"
+           }
+           continue
+       }
+
+    }
+}
+
+verbose "Verbose level is $verbose"
+
+#
+# get the users login name
+#
+if {[string match "" $logname]} {
+    if {[info exists env(USER)]} {
+       set logname $env(USER)
+    } else {
+       if {[info exists env(LOGNAME)]} {
+           set logname $env(LOGNAME)
+       } else {
+           # try getting it with whoami
+           catch "set logname [exec whoami]" tmp
+           if {[string match "*couldn't find*to execute*" $tmp]} {
+               # try getting it with who am i
+               unset tmp
+               catch "set logname [exec who am i]" tmp
+               if {[string match "*Command not found*" $tmp]} {        
+                   send_user "ERROR: couldn't get the users login name\n"
+                   set logname "Unknown"
+               } else {
+                   set logname [lindex [split $logname " !"] 1]
+               }
+           }
+       }
+    }
+}
+
+#
+# lookfor_file -- try to find a file by searching up multiple directory levels
+#
+proc lookfor_file { dir name } {
+    foreach x ".. ../.. ../../.. ../../../.." {
+       verbose "$dir/$name" 2
+       if {[file exists [file join $dir $name]]} {
+           return [file join $dir $name]
+       }
+       set dir [remote_file build dirname $dir]
+    }
+    return ""
+}
+
+#
+# load_lib -- load a library by sourcing it
+#
+# If there a multiple files with the same name, stop after the first one found.
+# The order is first look in the install dir, then in a parallel dir in the
+# source tree, (up one or two levels), then in the current dir.
+#
+proc load_lib { file } {
+    global verbose libdir srcdir base_dir execpath tool
+    global loaded_libs
+
+    if {[info exists loaded_libs($file)]} {
+       return
+    }
+
+    set loaded_libs($file) ""
+
+    if { [search_and_load_file "library file" $file [list ../lib $libdir 
$libdir/lib [file dirname [file dirname $srcdir]]/dejagnu/lib $srcdir/lib 
$execpath/lib . [file dirname [file dirname [file dirname 
$srcdir]]]/dejagnu/lib]] == 0 } {
+       send_error "ERROR: Couldn't find library file $file.\n"
+       exit 1
+    }
+}
+
+# local_hostname - get the local hostname
+proc get_local_hostname { } {
+    if {[catch "info hostname" hb]} {
+       set hb ""
+    } else {
+       regsub "\\..*$" $hb "" hb
+    }
+    verbose "hostname=$hb" 3
+    return $hb
+}
+
+verbose "Login name on [get_local_hostname] is $logname"
+
+#
+# parse out the config parts of the triplet name
+#
+
+# build values
+if { $build_cpu == "" } {
+    regsub -- "-.*-.*" ${build_triplet} "" build_cpu
+}
+if { $build_vendor == "" } {
+    regsub -- "^\[a-z0-9\]*-" ${build_triplet} "" build_vendor
+    regsub -- "-.*" ${build_vendor} "" build_vendor
+}
+if { $build_os == "" } {
+    regsub -- ".*-.*-" ${build_triplet} "" build_os
+}
+
+# host values
+if { $host_cpu == "" } {
+    regsub -- "-.*-.*" ${host_triplet} "" host_cpu
+}
+if { $host_vendor == "" } {
+    regsub -- "^\[a-z0-9\]*-" ${host_triplet} "" host_vendor
+    regsub -- "-.*" ${host_vendor} "" host_vendor
+}
+if { $host_os == "" } {
+    regsub -- ".*-.*-" ${host_triplet} "" host_os
+}
+
+# target values
+if { $target_cpu == "" } {
+    regsub -- "-.*-.*" ${target_triplet} "" target_cpu
+}
+if { $target_vendor == "" } {
+    regsub -- "^\[a-z0-9\]*-" ${target_triplet} "" target_vendor
+    regsub -- "-.*" ${target_vendor} "" target_vendor
+}
+if { $target_os == "" } {
+    regsub -- ".*-.*-" ${target_triplet} "" target_os
+}
+
+#
+# Load some of the DejaGnu libraries, so we can use the configure
+# and build procedures ourselves. Most of the time, these files
+# live in /usr or /usr/local.
+#
+if {[file exists "/usr/share/dejagnu"]} {
+    set libdir   "/usr/share/dejagnu"
+} else {
+    set libdir   "/usr/local/share/dejagnu"
+}
+set execpath [file dirname $argv0]
+if {[info exists env(DEJAGNULIBS)]} {
+    set libdir $env(DEJAGNULIBS)
+}
+load_lib framework.exp
+load_lib utils.exp
+load_lib target.exp
+load_lib remote.exp
+
+# set an output file name for commands
+# set outp "/tmp/foo"
+
+# update the source tree. This assume you already have it checked out.
+proc changedir { dir } {
+    cd $dir
+    verbose "Changed to directory: [pwd]"
+}
+
+# update the source tree. This assumes you already have it checked out
+# in the desired directory.
+proc bzr_update {} {
+    global inp outp timeout objdir srcdir
+    changedir $srcdir
+    set ret [local_exec "bzr pull" $inp $outp $timeout]
+    set status [lindex $ret 0]
+    set output [lindex $ret 1]
+    # if we couldn't update the sources, then we can't proceed
+    if {$status != 0} {
+       perror "bzr pull failed! " $output
+       exit 1
+    }
+    return $output
+}
+
+# extract the revision number
+proc bzr_revno {} {
+    global inp outp timeout objdir
+    changedir $objdir
+    set ret [local_exec "grep REVNO bzrversion.h" $inp $outp $timeout]
+    set status [lindex $ret 0]
+    set output [lindex $ret 1]
+
+    #
+    set revno ""
+    regsub ".* = " $output "" revno
+    set revno [string trim $revno]
+    set revno [string trim $revno "\;\n\""]
+
+    # if we couldn't update the sources, then we can't proceed
+    if {$status != 0} {
+       perror "bzr revno failed! " $output
+    }
+    return $revno
+}
+
+# extract the branch nickname
+proc bzr_branch {} {
+    global inp outp timeout verbose srcdir objdir
+    changedir $objdir
+    set ret [local_exec "grep NICK bzrversion.h" $inp $outp $timeout]
+    incr verbose
+    set status [lindex $ret 0]
+    set output [lindex $ret 1]
+
+    #
+    set nick ""
+    regsub ".* = " $output "" nick
+    set nick [string trim $nick]
+    set nick [string trim $nick "\;\n\""]
+
+    # if we couldn't update the sources, then we can't proceed
+    if {$status != 0} {
+       perror "bzr branch failed! " $output
+    }
+    return $nick
+}
+
+# run the Gnash autogen,sh script to regenerate config files.
+proc autogen {} {
+    global inp outp timeout srcdir
+    # recreate the build files
+    changedir $srcdir
+    set ret [local_exec "./autogen.sh" $inp $outp $timeout]
+    set status [lindex $ret 0]
+    set output [lindex $ret 1]
+    # if autogen.sh fails, then we can't proceed
+    if {$status != 0} {
+       perror "./autogen.sh failed! " $output
+       exit 1
+    }
+    return $output
+}
+
+# configure a checked out tree
+proc configure { opts } {
+    global inp outp timeout srcdir objdir
+    changedir $objdir
+    set ret [local_exec "$srcdir/configure $opts" $inp $outp $timeout]
+    set status [lindex $ret 0]
+    set output [lindex $ret 1]
+    # if configuring fails, then we can't proceed
+    if {$status != 0} {
+       perror "$srcdir/configure failed with these options: $configopts! 
$output"
+       exit 1
+    }
+    return $output
+}
+
+# build a Debian package
+proc dpkg { opts } {
+    global inp outp timeout objdir package revno branch
+
+    foreach i [glob -nocomplain $objdir/gnash-*bzr*] {
+       if {[file isdirectory $i]} {
+           set build $i
+           changedir $i
+           break
+       }
+    }
+
+    set ret [local_exec "dpkg-buildpackage $opts" $inp $outp $timeout]
+    set status [lindex $ret 0]
+    set output [lindex $ret 1]
+    # if configuring fails, then we can't proceed
+    if {$status != 0} {
+       perror "dpkg-buildpackage failed with these options: $opts! $output"
+       exit 1
+    }
+    return $output
+}
+
+# run make to compile everything
+proc make { opts } {
+    global inp outp timeout make objdir
+    changedir $objdir
+    set ret [local_exec "$make $opts" $inp $outp 1000]
+    set status [lindex $ret 0]
+    set output [lindex $ret 1]
+    # if configuring fails, then we can't proceed
+    if {$status != 0} {
+       perror "$make failed with these options: $opts! $output"
+       exit 1
+    }
+    return $output
+}
+
+# upload files to the repository
+proc upload { files } {
+    global inp outp timeout objdir uploadcmd
+    changedir $objdir
+    if {$uploadcmd == "dupload"} {
+       set ret [local_exec "$uploadcmd $files" $inp $outp $timeout]
+    }
+    if {$uploadcmd == "scp"} {
+       set ret [local_exec "$uploadcmd $files" $inp $outp $timeout]
+    }
+    set status [lindex $ret 0]
+    set output [lindex $ret 1]
+    # if configuring fails, then we can't proceed
+    if {$status != 0} {
+       perror "$uploadcmd failed to upload $changes!: $output"
+       exit 1
+    }
+    return $output
+}
+
+# remove old package builds
+proc clean {} {
+    set ret [local_exec "rm -fr gnash-*" $inp $outp $timeout]
+    set status [lindex $ret 0]
+    set output [lindex $ret 1]
+    # if configuring fails, then we can't proceed
+    if {$status != 0} {
+       perror "$uploadcmd failed to upload $changes!: $output"
+       exit 1
+    }
+    return $output
+}
+
+# see if this is a apt or rpm based system
+# All Debian based systems have this file, which no rpm based ones do
+if {[file exists /etc/network/interfaces]} {
+    set package "deb"
+} else {
+    set package "rpm"
+}
+
+verbose "Building a $package package"
+#
+# The real guts start here
+#
+
+# set a default timeoput value for comamnd exececution. Some commands,
+# like bzr checkouts can 
+set timeout 600
+
+#
+# Switch to the source directory now
+#
+set startdir [pwd]
+
+# extract info so we know what we're building
+set revno [bzr_revno]
+set branch [bzr_branch]
+changedir $srcdir
+
+# the state table is the sequence of tasks required to build Gnash.
+while {$state != "done"} {
+    verbose "======= Current state is: $state ======="
+    switch -glob -- $state {
+       "b*" {                  # "bzr"
+           changedir $srcdir
+           verbose "Changed to source tree: $srcdir"
+           set output [bzr_update];                    # update the source tree
+           # update the branch and revision after the update
+           set revno [bzr_revno]
+           set branch [bzr_branch]
+#          if {[string match "configure.ac" $output]} {
+               set state "autogen.sh"
+#          } else {
+#              set state "configure"
+#          }
+       }
+       
+       "a*" {                  # "autogen.sh"
+           changedir $srcdir
+           autogen;                    # create the config and build files
+           set state "configure"
+       }
+       
+       "co*" {                 # "configure"
+           # Switch to the build directory now
+           changedir $objdir
+           verbose "Changed to build tree: $objdir"
+           configure "$configopts"
+           set state "make"
+       }       
+       
+       "m*" {                  # "make"
+           changedir $objdir
+           make $package
+           set state "upload"
+       }
+       
+       "dp*" {                 # "dpkg-buildpackage"
+           # This should only be run by package code maintainers, as this
+           # manually runs dpkg-buildpackage, and assumes everything is
+           # all setup correctly, or it'll fail. This is basically just
+           # an optimization step when debugging package building.
+           changedir $objdir
+           dpkg "-nc"
+           set state "upload"
+           set only yes
+       }
+       
+       "u*" {                  # "upload"
+           changedir $objdir
+           #upload
+           set state "done"
+       }
+       
+       "t*" {                  # "test"
+           changedir $objdir
+           # test the repository to make sure it worked
+           
+           set state "upload"
+       }
+
+       "cl*" {                 # "clean"
+           # Switch to the build directory now
+           changedir $objdir
+           verbose "Changed to build tree: $objdir"
+           clean
+           set state "done"
+       }       
+    };                         # end of switch
+    # exit the while loop if we only want to run one step of the state table
+    if { $only == "yes" } {
+       break;
+    }
+};                             # end of while
+
+# back to where we started
+cd $startdir


reply via email to

[Prev in Thread] Current Thread [Next in Thread]