xref: /petsc/config/BuildSystem/args.py (revision 71075aaf439429f639ec15eebc63fb496334985b)
15b6bfdb9SJed Brownfrom __future__ import absolute_import
2179860b2SJed Brownclass ArgumentProcessor(object):
3179860b2SJed Brown  '''This class provides interaction with an RDict object, which by default is shared'''
4179860b2SJed Brown  defaultDB = None
5179860b2SJed Brown
6179860b2SJed Brown  def __init__(self, clArgs = None, argDB = None):
7179860b2SJed Brown    '''Setup the argument database'''
8179860b2SJed Brown    self.argDB = self.createArgDB(argDB)
9179860b2SJed Brown    if clArgs is None:
10179860b2SJed Brown      import sys
11179860b2SJed Brown
12179860b2SJed Brown      self.clArgs = sys.argv[1:]
13179860b2SJed Brown    else:
14179860b2SJed Brown      self.clArgs = clArgs
15179860b2SJed Brown    return
16179860b2SJed Brown
17179860b2SJed Brown  def __getstate__(self):
18179860b2SJed Brown    '''We do not want to pickle the default RDict'''
19179860b2SJed Brown    d = self.__dict__.copy()
20179860b2SJed Brown    if '_argDB' in d:
21179860b2SJed Brown      if d['_argDB'] is ArgumentProcessor.defaultDB:
22179860b2SJed Brown        del d['_argDB']
23179860b2SJed Brown      else:
24179860b2SJed Brown        d['_argDB'] = None
25179860b2SJed Brown    return d
26179860b2SJed Brown
27179860b2SJed Brown  def __setstate__(self, d):
28179860b2SJed Brown    '''We must create the default RDict'''
29179860b2SJed Brown    self.__dict__.update(d)
30179860b2SJed Brown    if not '_argDB' in d:
31179860b2SJed Brown      self.argDB = self.createArgDB(None)
32179860b2SJed Brown    return
33179860b2SJed Brown
34179860b2SJed Brown  def getArgDB(self):
35179860b2SJed Brown    return self._argDB
36179860b2SJed Brown  def setArgDB(self, argDB):
37179860b2SJed Brown    self._argDB = argDB
38179860b2SJed Brown    return
39179860b2SJed Brown  argDB = property(getArgDB, setArgDB, doc = 'The RDict argument database')
40179860b2SJed Brown
41179860b2SJed Brown  def createArgDB(self, initDB):
42179860b2SJed Brown    '''Create an argument database unless initDB is provided, and insert the command line arguments'''
43179860b2SJed Brown    if not initDB is None:
44179860b2SJed Brown      argDB = initDB
45179860b2SJed Brown    else:
46179860b2SJed Brown      if ArgumentProcessor.defaultDB is None:
47179860b2SJed Brown        import RDict
48179860b2SJed Brown        import os
49179860b2SJed Brown        import sys
50179860b2SJed Brown
51179860b2SJed Brown        # Changed this to assume RDict is independent
52179860b2SJed Brown        ArgumentProcessor.defaultDB = RDict.RDict(load = 0, autoShutdown = 0)
53179860b2SJed Brown      argDB = ArgumentProcessor.defaultDB
54179860b2SJed Brown    return argDB
55179860b2SJed Brown
56179860b2SJed Brown  def setupArguments(self, argDB):
57179860b2SJed Brown    '''Setup types in the argument database
58*6aad120cSJose E. Roman       - This method should be overridden by any subclass with special arguments, making sure to call the superclass method'''
59179860b2SJed Brown    return argDB
60179860b2SJed Brown
61179860b2SJed Brown  def insertArguments(self, useEnvironment = 0):
62179860b2SJed Brown    '''Put arguments in from the command line and environment
63179860b2SJed Brown       - This will only insert command line arguments into a given RDict once'''
64179860b2SJed Brown    if useEnvironment:
65179860b2SJed Brown      import os
66179860b2SJed Brown
67179860b2SJed Brown      self.argDB.insertArgs(os.environ)
68179860b2SJed Brown    if not hasattr(self.argDB, '_setCommandLine'):
69179860b2SJed Brown      self.argDB.insertArgs(self.clArgs)
70179860b2SJed Brown      self.argDB._setCommandLine = 1
71179860b2SJed Brown    return
72179860b2SJed Brown
73179860b2SJed Brown  def setup(self):
74*6aad120cSJose E. Roman    '''This method should be overridden for any setup after initialization
75179860b2SJed Brown       - Here we determine argument types and insert arguments into the dictionary'''
76179860b2SJed Brown    self.setupArguments(self.argDB)
77179860b2SJed Brown    self.insertArguments()
78179860b2SJed Brown    return
79179860b2SJed Brown
80179860b2SJed Brown  def cleanup(self):
81*6aad120cSJose E. Roman    '''This method should be overridden for any cleanup before finalization'''
82179860b2SJed Brown    return
83