Please note:The SCons wiki is now restored from the attack in March 2013. All old passwords have been invalidated. Please reset your password if you have an account. If you note missing pages, please report them to webmaster@scons.org. Also, new account creation is currently disabled due to an ongoing spam flood (2013/08/27).

   1 # An SConscript file to untar a package, run configure and then make
   2 # using a build directory.
   3 #
   4 # Replacing this with SConscript files written to compile just the
   5 # parts of the package that we want would be quicker, but would take some time
   6 # to do.
   7 
   8 Import('env')
   9 
  10 import sys
  11 import os
  12 import SCons.Script
  13 
  14 def run(cmd):
  15     """Run a command and decipher the return code. Exit by default."""
  16     res = os.system(cmd)
  17     # Assumes that if a process doesn't call exit, it was successful
  18     if (os.WIFEXITED(res)):
  19         code = os.WEXITSTATUS(res)
  20         if code != 0:
  21             print "Error: return code: " + str(code)
  22             if SCons.Script.keep_going_on_error == 0:
  23                 sys.exit(code)
  24 
  25 import time
  26 def ConfigureMake(target, source, env):
  27     """Run configure as necessary and then run make"""
  28     pkg_name = 'net-snmp-5.1'  # the name of the current snmp package
  29     baseDir = Dir("#.").abspath
  30     # BUILD_DIR is the top build directory relative to SConstruct
  31     buildDir = baseDir + '/' + env['BUILD_DIR']
  32 
  33     startdir = os.getcwd()   # restore cwd at the end
  34     if not os.path.exists(buildDir):
  35         os.makedirs(buildDir)
  36     os.chdir(buildDir)
  37 
  38     # Untar the source tgz file
  39     if not os.path.exists(pkg_name):
  40         cmd = 'tar xfz ' + source[0].abspath
  41         print '... untarring source files'
  42         run(cmd)
  43 
  44     # Change to the top of the source tree for net-snmp
  45     here = buildDir + '/' + pkg_name
  46     os.chdir(here)
  47 
  48     # See if configure needs to be run. Doesn't check for failed configures
  49     if os.path.exists('config.status'):
  50         print '... configure is up-to-date'
  51     else:
  52         # Customize the stock package here with other files if necessary
  53         # If configure needs interactive responses, write them to a file
  54         # config_responses and pass it as input to configure with 
  55         # >config_responses
  56 
  57         # Now run configure
  58         print '... running configure: ' +
  59           time.asctime(time.localtime(time.time()))
  60         cmd = './configure'
  61         run(cmd)
  62         print '... configure done: ' +
  63           time.asctime(time.localtime(time.time()))
  64 
  65     # Always run make
  66     print '... running make: ' + time.asctime(time.localtime(time.time()))
  67     run('make')
  68     print '... make finished: ' + time.asctime(time.localtime(time.time()))
  69     os.chdir(startdir)    # restore the original cwd
  70 
  71     return 0
  72 
  73 def log_output_fn(target, source, env):
  74     """The message seen in build logs when this action is called"""
  75     return "Building '%s'\n from '%s'\n at: %s" % (target[0], source[0], 
  76       time.asctime(time.localtime(time.time())))
  77 
  78 my_prog = env.Command(
  79     target = 'snmpd', # There are other targets, but this
  80                       # is one major one for this package
  81     source = '#/foo/bar/net-snmp-5.1.tar.gz', # Location of
  82                                               # package in 
  83                                               # the source tree
  84     action = Action(ConfigureMake, strfunction = log_output_fn),
  85 )
  86 # So that "scons doit" will run all this
  87 Alias('doit', my_prog)

Comments and fixes to Matt Doar, mdoar@pobox.com

RunningConfigureAndMake (last edited 2008-03-12 02:47:13 by localhost)