-
Notifications
You must be signed in to change notification settings - Fork 3
/
parse_devicemk.py
160 lines (115 loc) · 4.64 KB
/
parse_devicemk.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
import argparse
import os
import sys
import time
# Locals imports
from mk_file_parser.mk_file_parser import *
from output_builders import puml_builder
from output_builders import text_builder
from utils import elog
from utils import utils
class MkFile:
def __init__(self, name, exists=False, includes=None):
self.name = name
self.exists = exists
self.includes = includes
def is_file_in_work(file, to_parse, parsed):
if file in to_parse:
return True
else:
for f in parsed:
if f.name == file:
return True
return False
def parse():
files = []
files_to_parse = []
android_dir = utils.get_env_var("ANDROID_BUILD_TOP")
if android_dir == "":
print("Error: The script must be run from Android setup environment!")
print(" Do environment setup, lunch device and then run the script!")
return None
wd = os.getcwd()
os.chdir(android_dir)
device_mk = get_device_mk()
if device_mk != "":
board_config_mk = get_board_config_mk()
files_to_parse.append(device_mk)
files_to_parse.append(board_config_mk)
while len(files_to_parse):
f = files_to_parse.pop(0)
if os.path.exists(f):
print(f)
mk_file = MkFileParser(f)
err_msg = mk_file.parse()
if err_msg is None:
includes = mk_file.get_includes()
files.append(MkFile(f, True, includes))
for i in includes:
if is_file_in_work(i.name, files_to_parse, files) == False:
files_to_parse.append(i.name)
else:
files.append(MkFile(f))
os.chdir(wd)
return files
def get_device_mk():
target_product = utils.get_build_var("TARGET_PRODUCT")
return os.popen("find device -name {target_product}.mk".format(**locals())).read().rstrip()
def get_board_config_mk():
board_config = "BoardConfig.mk"
product_device = utils.get_build_var("PRODUCT_DEVICE")
product_device_folders = os.popen(
"find device -name {product_device}".format(**locals())).read().rstrip()
if product_device_folders == "":
product_device_folders = os.popen(
"find vendor -name {product_device}".format(**locals())).read().rstrip()
for d in product_device_folders.splitlines():
board_config = d + "/" + board_config
if os.path.exists(board_config):
return board_config
return board_config
def time_spent_report(start_time):
delta_sec = time.time() - start_time
m = int(delta_sec // 60)
s = int(delta_sec % 60)
return "{m}m {s}s".format(**locals())
def main():
arg_parser = argparse.ArgumentParser(
description="Parse AOSP mk files dependencies for lunch target.")
arg_parser.add_argument("--puml", nargs='?', const="",
help="optional parameter to specify a file to save the output in PUML format, if omitted, the output will be saved in the working directory")
arg_parser.add_argument("--text", nargs='?', const="",
help="optional parameter to save the output in text format and specify its file, if file not specified, the output will be saved in the working directory")
args = arg_parser.parse_args(sys.argv[1:])
print("Parsing make files dependencies...")
start_time = time.time()
files = parse()
time_spent = time_spent_report(start_time)
if files is None:
return
elif len(files):
print("============================================")
print("Parsed files: {}, Warnings: {}, Time spent: {}".format(
len(files), elog.w.count, time_spent))
print("Generated output:")
if args.puml is not None and args.puml != "":
puml_output_file = args.puml
else:
path, name = os.path.split(files[0].name)
puml_output_file = os.path.abspath(
"./" + name.replace(".mk", ".puml"))
puml_builder.build(puml_output_file, files)
print("PUML: {puml_output_file}".format(**locals()))
if args.text is not None:
if args.text != "":
text_output_file = os.path.abspath(args.text)
else:
path, name = os.path.split(files[0].name)
text_output_file = os.path.abspath(
"./" + name.replace(".mk", ".txt"))
text_builder.build(text_output_file, files)
print("Text: {text_output_file}".format(**locals()))
else:
elog.e("Parsing failed!")
if __name__ == "__main__":
main()