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