]> git.donarmstrong.com Git - lilypond.git/blob - bin/mf-deps.in
6d022fff456d06ae96db00d0ca37b6992744f6af
[lilypond.git] / bin / mf-deps.in
1 #!@PYTHON@
2
3
4 # mf-deps.py -- dependencies for metafont 
5
6 # source file of the GNU LilyPond music typesetter
7
8 # (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
9
10
11
12 """look into metafont source for dependencies.
13
14  fixme: python path
15  fixme: error reporting
16  fixem: python sucks slightly: why doesn't it have closures?
17
18 """
19
20 from regex import * ;
21 from regsub import * ;
22 import sys;
23 import os;
24
25
26 version = "0.2"
27 input_re = compile('^[ \t]*input *\([^;]+\);')
28 postfixes = ['log', 'dvi', '2602gf', 'tfm']
29
30 def identify ():
31     return "mf-deps.py %s" % version
32
33
34
35 def print_one(x):
36     print x
37
38 def line_concat(x,y):
39     return x + '\n' +  y
40
41 class Targetdeps:
42     """Dependencies for one toplevel sourcefile
43
44     """
45     
46     def __init__(self,nm):
47         split = os.path.splitext(nm)    
48         self.basename=split[0];
49         self.depfiles = []
50         self.checkdep(nm)
51         
52     def checkdep(self, name):
53         split = os.path.splitext(name)
54         name = split[0] + '.mf';
55
56         if name not in self.depfiles:
57             self.get_filedeps(name)
58
59     def get_filedeps(self,filename):
60 #       print sys.stderr.write( 'checking ' + filename + '\n');
61         try:
62             file = open(filename)
63         except IOError:
64 #           print sys.stderr.write( 'can\'t open ' + filename + '\n')
65             return
66
67         self.depfiles.append(filename)
68         lines = file.readlines()
69         file.close()
70         for line in lines:
71             if input_re.search (line) <> -1:
72                 self.checkdep( input_re.group(1))
73
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)
79
80         return reduce(line_concat, dependencies)
81
82 print "# Automatically generated by %s\n" % identify ()
83
84 for file in sys.argv[1:]: # skip programname
85     t = Targetdeps(file)
86     print t.target_string()
87
88