Home | History | Annotate | Download | only in freeze
      1 # Parse Makefiles and Python Setup(.in) files.

      2 
      3 import re
      4 
      5 
      6 # Extract variable definitions from a Makefile.

      7 # Return a dictionary mapping names to values.

      8 # May raise IOError.

      9 
     10 makevardef = re.compile('^([a-zA-Z0-9_]+)[ \t]*=(.*)')
     11 
     12 def getmakevars(filename):
     13     variables = {}
     14     fp = open(filename)
     15     pendingline = ""
     16     try:
     17         while 1:
     18             line = fp.readline()
     19             if pendingline:
     20                 line = pendingline + line
     21                 pendingline = ""
     22             if not line:
     23                 break
     24             if line.endswith('\\\n'):
     25                 pendingline = line[:-2]
     26             matchobj = makevardef.match(line)
     27             if not matchobj:
     28                 continue
     29             (name, value) = matchobj.group(1, 2)
     30             # Strip trailing comment

     31             i = value.find('#')
     32             if i >= 0:
     33                 value = value[:i]
     34             value = value.strip()
     35             variables[name] = value
     36     finally:
     37         fp.close()
     38     return variables
     39 
     40 
     41 # Parse a Python Setup(.in) file.

     42 # Return two dictionaries, the first mapping modules to their

     43 # definitions, the second mapping variable names to their values.

     44 # May raise IOError.

     45 
     46 setupvardef = re.compile('^([a-zA-Z0-9_]+)=(.*)')
     47 
     48 def getsetupinfo(filename):
     49     modules = {}
     50     variables = {}
     51     fp = open(filename)
     52     pendingline = ""
     53     try:
     54         while 1:
     55             line = fp.readline()
     56             if pendingline:
     57                 line = pendingline + line
     58                 pendingline = ""
     59             if not line:
     60                 break
     61             # Strip comments

     62             i = line.find('#')
     63             if i >= 0:
     64                 line = line[:i]
     65             if line.endswith('\\\n'):
     66                 pendingline = line[:-2]
     67                 continue
     68             matchobj = setupvardef.match(line)
     69             if matchobj:
     70                 (name, value) = matchobj.group(1, 2)
     71                 variables[name] = value.strip()
     72             else:
     73                 words = line.split()
     74                 if words:
     75                     modules[words[0]] = words[1:]
     76     finally:
     77         fp.close()
     78     return modules, variables
     79 
     80 
     81 # Test the above functions.

     82 
     83 def test():
     84     import sys
     85     import os
     86     if not sys.argv[1:]:
     87         print 'usage: python parsesetup.py Makefile*|Setup* ...'
     88         sys.exit(2)
     89     for arg in sys.argv[1:]:
     90         base = os.path.basename(arg)
     91         if base[:8] == 'Makefile':
     92             print 'Make style parsing:', arg
     93             v = getmakevars(arg)
     94             prdict(v)
     95         elif base[:5] == 'Setup':
     96             print 'Setup style parsing:', arg
     97             m, v = getsetupinfo(arg)
     98             prdict(m)
     99             prdict(v)
    100         else:
    101             print arg, 'is neither a Makefile nor a Setup file'
    102             print '(name must begin with "Makefile" or "Setup")'
    103 
    104 def prdict(d):
    105     keys = d.keys()
    106     keys.sort()
    107     for key in keys:
    108         value = d[key]
    109         print "%-15s" % key, str(value)
    110 
    111 if __name__ == '__main__':
    112     test()
    113