xref: /petsc/config/BuildSystem/args.py (revision 179860b23afbef20daed3359c1645679d1efa988)
1*179860b2SJed Brownclass ArgumentProcessor(object):
2*179860b2SJed Brown  '''This class provides interaction with an RDict object, which by default is shared'''
3*179860b2SJed Brown  defaultDB = None
4*179860b2SJed Brown
5*179860b2SJed Brown  def __init__(self, clArgs = None, argDB = None):
6*179860b2SJed Brown    '''Setup the argument database'''
7*179860b2SJed Brown    self.argDB = self.createArgDB(argDB)
8*179860b2SJed Brown    if clArgs is None:
9*179860b2SJed Brown      import sys
10*179860b2SJed Brown
11*179860b2SJed Brown      self.clArgs = sys.argv[1:]
12*179860b2SJed Brown    else:
13*179860b2SJed Brown      self.clArgs = clArgs
14*179860b2SJed Brown    return
15*179860b2SJed Brown
16*179860b2SJed Brown  def __getstate__(self):
17*179860b2SJed Brown    '''We do not want to pickle the default RDict'''
18*179860b2SJed Brown    d = self.__dict__.copy()
19*179860b2SJed Brown    if '_argDB' in d:
20*179860b2SJed Brown      if d['_argDB'] is ArgumentProcessor.defaultDB:
21*179860b2SJed Brown        del d['_argDB']
22*179860b2SJed Brown      else:
23*179860b2SJed Brown        d['_argDB'] = None
24*179860b2SJed Brown    return d
25*179860b2SJed Brown
26*179860b2SJed Brown  def __setstate__(self, d):
27*179860b2SJed Brown    '''We must create the default RDict'''
28*179860b2SJed Brown    self.__dict__.update(d)
29*179860b2SJed Brown    if not '_argDB' in d:
30*179860b2SJed Brown      self.argDB = self.createArgDB(None)
31*179860b2SJed Brown    return
32*179860b2SJed Brown
33*179860b2SJed Brown  def getArgDB(self):
34*179860b2SJed Brown    return self._argDB
35*179860b2SJed Brown  def setArgDB(self, argDB):
36*179860b2SJed Brown    self._argDB = argDB
37*179860b2SJed Brown    return
38*179860b2SJed Brown  argDB = property(getArgDB, setArgDB, doc = 'The RDict argument database')
39*179860b2SJed Brown
40*179860b2SJed Brown  def createArgDB(self, initDB):
41*179860b2SJed Brown    '''Create an argument database unless initDB is provided, and insert the command line arguments'''
42*179860b2SJed Brown    if not initDB is None:
43*179860b2SJed Brown      argDB = initDB
44*179860b2SJed Brown    else:
45*179860b2SJed Brown      if ArgumentProcessor.defaultDB is None:
46*179860b2SJed Brown        import RDict
47*179860b2SJed Brown        import os
48*179860b2SJed Brown        import sys
49*179860b2SJed Brown
50*179860b2SJed Brown        # Changed this to assume RDict is independent
51*179860b2SJed Brown        ArgumentProcessor.defaultDB = RDict.RDict(load = 0, autoShutdown = 0)
52*179860b2SJed Brown      argDB = ArgumentProcessor.defaultDB
53*179860b2SJed Brown    return argDB
54*179860b2SJed Brown
55*179860b2SJed Brown  def setupArguments(self, argDB):
56*179860b2SJed Brown    '''Setup types in the argument database
57*179860b2SJed Brown       - This method shouldbe overidden by any subclass with special arguments, making sure to call the superclass method'''
58*179860b2SJed Brown    return argDB
59*179860b2SJed Brown
60*179860b2SJed Brown  def insertArguments(self, useEnvironment = 0):
61*179860b2SJed Brown    '''Put arguments in from the command line and environment
62*179860b2SJed Brown       - This will only insert command line arguments into a given RDict once'''
63*179860b2SJed Brown    if useEnvironment:
64*179860b2SJed Brown      import os
65*179860b2SJed Brown
66*179860b2SJed Brown      self.argDB.insertArgs(os.environ)
67*179860b2SJed Brown    if not hasattr(self.argDB, '_setCommandLine'):
68*179860b2SJed Brown      self.argDB.insertArgs(self.clArgs)
69*179860b2SJed Brown      self.argDB._setCommandLine = 1
70*179860b2SJed Brown    return
71*179860b2SJed Brown
72*179860b2SJed Brown  def setup(self):
73*179860b2SJed Brown    '''This method should be overidden for any setup after initialization
74*179860b2SJed Brown       - Here we determine argument types and insert arguments into the dictionary'''
75*179860b2SJed Brown    self.setupArguments(self.argDB)
76*179860b2SJed Brown    self.insertArguments()
77*179860b2SJed Brown    return
78*179860b2SJed Brown
79*179860b2SJed Brown  def cleanup(self):
80*179860b2SJed Brown    '''This method should be overidden for any cleanup before finalization'''
81*179860b2SJed Brown    return
82