4 # mf-deps.py -- dependencies for metafont
6 # source file of the GNU LilyPond music typesetter
8 # (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
12 """look into metafont source for dependencies.
15 fixme: error reporting
16 fixem: python sucks slightly: why doesn't it have closures?
21 from regsub import * ;
27 input_re = compile('^[ \t]*input *\([^;]+\);')
28 postfixes = ['log', 'dvi', '2602gf', 'tfm']
31 return "mf-deps.py %s" % version
42 """Dependencies for one toplevel sourcefile
46 def __init__(self,nm):
47 split = os.path.splitext(nm)
48 self.basename=split[0];
52 def checkdep(self, name):
53 split = os.path.splitext(name)
54 name = split[0] + '.mf';
56 if name not in self.depfiles:
57 self.get_filedeps(name)
59 def get_filedeps(self,filename):
60 # print sys.stderr.write( 'checking ' + filename + '\n');
64 # print sys.stderr.write( 'can\'t open ' + filename + '\n')
67 self.depfiles.append(filename)
68 lines = file.readlines()
71 if input_re.search (line) <> -1:
72 self.checkdep( input_re.group(1))
74 def target_string(self):
75 # ugh. Closures, anyone?
76 targets = map (lambda x,y = self.basename: 'out/' + y + '.' + x, postfixes)
77 depstring = reduce(lambda x,y: x + ' ' + y, self.depfiles)
78 dependencies = map (lambda x, y=depstring: x + ': ' + y, targets)
80 return reduce(line_concat, dependencies)
82 print "# Automatically generated by %s\n" % identify ()
84 for file in sys.argv[1:]: # skip programname
86 print t.target_string()