1 | #! /usr/bin/env python |
---|
2 | # encoding: utf-8 |
---|
3 | # WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file |
---|
4 | |
---|
5 | import re |
---|
6 | from waflib import Utils,Logs |
---|
7 | def filter_comments(filename): |
---|
8 | txt=Utils.readf(filename) |
---|
9 | i=0 |
---|
10 | buf=[] |
---|
11 | max=len(txt) |
---|
12 | begin=0 |
---|
13 | while i<max: |
---|
14 | c=txt[i] |
---|
15 | if c=='"'or c=="'": |
---|
16 | buf.append(txt[begin:i]) |
---|
17 | delim=c |
---|
18 | i+=1 |
---|
19 | while i<max: |
---|
20 | c=txt[i] |
---|
21 | if c==delim:break |
---|
22 | elif c=='\\': |
---|
23 | i+=1 |
---|
24 | i+=1 |
---|
25 | i+=1 |
---|
26 | begin=i |
---|
27 | elif c=='/': |
---|
28 | buf.append(txt[begin:i]) |
---|
29 | i+=1 |
---|
30 | if i==max:break |
---|
31 | c=txt[i] |
---|
32 | if c=='+': |
---|
33 | i+=1 |
---|
34 | nesting=1 |
---|
35 | c=None |
---|
36 | while i<max: |
---|
37 | prev=c |
---|
38 | c=txt[i] |
---|
39 | if prev=='/'and c=='+': |
---|
40 | nesting+=1 |
---|
41 | c=None |
---|
42 | elif prev=='+'and c=='/': |
---|
43 | nesting-=1 |
---|
44 | if nesting==0:break |
---|
45 | c=None |
---|
46 | i+=1 |
---|
47 | elif c=='*': |
---|
48 | i+=1 |
---|
49 | c=None |
---|
50 | while i<max: |
---|
51 | prev=c |
---|
52 | c=txt[i] |
---|
53 | if prev=='*'and c=='/':break |
---|
54 | i+=1 |
---|
55 | elif c=='/': |
---|
56 | i+=1 |
---|
57 | while i<max and txt[i]!='\n': |
---|
58 | i+=1 |
---|
59 | else: |
---|
60 | begin=i-1 |
---|
61 | continue |
---|
62 | i+=1 |
---|
63 | begin=i |
---|
64 | buf.append(' ') |
---|
65 | else: |
---|
66 | i+=1 |
---|
67 | buf.append(txt[begin:]) |
---|
68 | return buf |
---|
69 | class d_parser(object): |
---|
70 | def __init__(self,env,incpaths): |
---|
71 | self.allnames=[] |
---|
72 | self.re_module=re.compile("module\s+([^;]+)") |
---|
73 | self.re_import=re.compile("import\s+([^;]+)") |
---|
74 | self.re_import_bindings=re.compile("([^:]+):(.*)") |
---|
75 | self.re_import_alias=re.compile("[^=]+=(.+)") |
---|
76 | self.env=env |
---|
77 | self.nodes=[] |
---|
78 | self.names=[] |
---|
79 | self.incpaths=incpaths |
---|
80 | def tryfind(self,filename): |
---|
81 | found=0 |
---|
82 | for n in self.incpaths: |
---|
83 | found=n.find_resource(filename.replace('.','/')+'.d') |
---|
84 | if found: |
---|
85 | self.nodes.append(found) |
---|
86 | self.waiting.append(found) |
---|
87 | break |
---|
88 | if not found: |
---|
89 | if not filename in self.names: |
---|
90 | self.names.append(filename) |
---|
91 | def get_strings(self,code): |
---|
92 | self.module='' |
---|
93 | lst=[] |
---|
94 | mod_name=self.re_module.search(code) |
---|
95 | if mod_name: |
---|
96 | self.module=re.sub('\s+','',mod_name.group(1)) |
---|
97 | import_iterator=self.re_import.finditer(code) |
---|
98 | if import_iterator: |
---|
99 | for import_match in import_iterator: |
---|
100 | import_match_str=re.sub('\s+','',import_match.group(1)) |
---|
101 | bindings_match=self.re_import_bindings.match(import_match_str) |
---|
102 | if bindings_match: |
---|
103 | import_match_str=bindings_match.group(1) |
---|
104 | matches=import_match_str.split(',') |
---|
105 | for match in matches: |
---|
106 | alias_match=self.re_import_alias.match(match) |
---|
107 | if alias_match: |
---|
108 | match=alias_match.group(1) |
---|
109 | lst.append(match) |
---|
110 | return lst |
---|
111 | def start(self,node): |
---|
112 | self.waiting=[node] |
---|
113 | while self.waiting: |
---|
114 | nd=self.waiting.pop(0) |
---|
115 | self.iter(nd) |
---|
116 | def iter(self,node): |
---|
117 | path=node.abspath() |
---|
118 | code="".join(filter_comments(path)) |
---|
119 | names=self.get_strings(code) |
---|
120 | for x in names: |
---|
121 | if x in self.allnames:continue |
---|
122 | self.allnames.append(x) |
---|
123 | self.tryfind(x) |
---|
124 | def scan(self): |
---|
125 | env=self.env |
---|
126 | gruik=d_parser(env,self.generator.includes_nodes) |
---|
127 | node=self.inputs[0] |
---|
128 | gruik.start(node) |
---|
129 | nodes=gruik.nodes |
---|
130 | names=gruik.names |
---|
131 | if Logs.verbose: |
---|
132 | Logs.debug('deps: deps for %s: %r; unresolved %r'%(str(node),nodes,names)) |
---|
133 | return(nodes,names) |
---|