1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 """
21 iMaker related functionalities.
22 * configuration introspection
23 * target introspection
24 """
25 import os
26 import pathaddition.match
27 import re
28 import fileutils
29 import imaker.api
30
31 -def ant_run(task, config, target, variables=None):
32 """ Running iMaker under Ant. """
33 if variables == None:
34 variables = {}
35 cmdline = "imaker"
36 cmdline += " -f %s" % config
37 cmdline += " %s" % target
38 for key in variables.keys():
39 cmdline += ' "%s=%s"' % (key, variables[key])
40
41 task.log("Running %s" % cmdline)
42 handle = os.popen(cmdline)
43 for line in handle.read().splitlines():
44 task.log(line)
45 return handle.close()
46
47
49 """ Does target matches an include pattern. """
50 for inc in incs:
51 if inc.match(target):
52 return True
53 return False
54
56 """ Does target matches an exclude pattern. """
57 for exc in excs:
58 if exc.match(target):
59 return True
60 return False
61
62
64 """ Implementation of the Ant task. """
65
66 if attributes.get('dir') != None:
67 os.chdir(str(attributes.get('dir')))
68 tdd = "[\n"
69 if elements.get("imakerconfigurationset") is not None:
70 if elements.get("imakerconfigurationset").size() == 0:
71 task.log(str("No configuration defined."))
72 for cid in range(elements.get("imakerconfigurationset").size()):
73 configurationset = elements.get("imakerconfigurationset").get(int(cid))
74 if configurationset.isReference() == 1:
75 task.log("Using configuration from reference '%s'." % str(configurationset.getRefid().getRefId()))
76 ref = project.getReference(str(configurationset.getRefid().getRefId()))
77 if ref == None:
78 raise Exception("Could not find reference '%s'" % str(configurationset.getRefid().getRefId()))
79 configurationset = ref
80 for configuration in configurationset.getImakerConfiguration().toArray():
81 tdd += handle_configuration(project, task, elements, attributes, configuration)
82 else:
83 task.log(str("No configuration defined."))
84 tdd += "]\n"
85
86 if attributes.get('property') != None:
87 task.log("Setting property '%s'." % str(attributes.get('property')))
88 project.setProperty(str(attributes.get('property')), str(tdd))
89 if attributes.get('file') != None:
90 task.log("Creating file '%s'." % str(attributes.get('file')))
91 out = open(str(attributes.get('file')), "w")
92 out.write(tdd)
93 out.close()
94
96 """ Convert a configuration into a TDD for future FMPP transformation. """
97 includes = []
98 excludes = []
99 tincludes = []
100 texcludes = []
101 variables = {}
102
103 for configs in configuration.getMakefileSet().toArray():
104 incs = configs.getIncludePatterns(project)
105 if incs is not None:
106 for inc in incs:
107 includes.append(str(inc))
108 excs = configs.getExcludePatterns(project)
109 if excs is not None:
110 for exc in excs:
111 excludes.append(str(exc))
112
113 for targets in configuration.getTargetSet().toArray():
114 incs = targets.getIncludePatterns(project)
115 if incs is not None:
116 for inc in incs:
117 tincludes.append(re.compile(str(inc)))
118 excs = targets.getExcludePatterns(project)
119 if excs is not None:
120 for exc in excs:
121 texcludes.append(re.compile(str(exc)))
122 if len(tincludes) == 0:
123 tincludes.append(re.compile(r".*"))
124
125
126 for variableset in configuration.getVariableSet().toArray():
127 vector = variableset.getVariables()
128 for variable in vector.toArray():
129 variables[str(variable.getName())] = str(variable.getValue())
130
131 configs = imaker.api.scan_configs(includes, excludes)
132 targets = {}
133 for config in configs:
134 task.log("Configuration: %s" % config)
135 if config not in targets:
136 targets[config] = []
137 for target in imaker.api.targets_for_config(config):
138 if is_included(tincludes, target) and not is_excluded(texcludes, target)\
139 and target not in targets[config]:
140 targets[config].append(target)
141
142 task.log(str("Regional variation: %s" % configuration.getRegionalVariation()))
143 if configuration.getRegionalVariation():
144 task.log("Sorting target by region.")
145 regiontargets = {}
146 for config in targets.keys():
147 task.log(" * %s:" % config)
148 for target in targets[config]:
149 region = imaker.api.get_variable('LANGPACK_REGION', target=target, config=config, default="western")
150 task.log(" - %s: %s" % (target, region))
151 if not regiontargets.has_key(region):
152 regiontargets[region] = {}
153 if not regiontargets[region].has_key(config):
154 regiontargets[region][config] = []
155 regiontargets[region][config].append(target)
156
157 tdd = ""
158 for region in regiontargets.keys():
159 tdd += region_switch_to_tdd(region)
160 tdd += imaker_command_to_tdd(regiontargets[region], variables)
161 return tdd
162
163
164 return imaker_command_to_tdd(targets, variables)
165
166
168 tdd = "{\n"
169 tdd += "\t\"command\": \"switch_region\",\n"
170 tdd += "\t\"region\": \"%s\",\n" % region
171 tdd += "},\n"
172 return tdd
173
174
176
177 tdd = "{\n"
178 tdd += "\t\"command\": \"imaker\",\n"
179 tdd += "\t\"config\": {\n"
180 for config in targets.keys():
181 tdd += "\t\t\"%s\": [\n" % config
182 for target in targets[config]:
183 tdd += "\t\t\t{\n"
184 tdd += "\t\t\t\"target\": \"%s\",\n" % target
185 tdd += "\t\t\t\"variables\": {\n"
186 for varname in variables.keys():
187 tdd += "\t\t\t\t\"%s\": \"%s\",\n" % (varname, variables[varname])
188 tdd += "\t\t\t\t},\n"
189 tdd += "\t\t\t},\n"
190 tdd += "\t\t],\n"
191 tdd += "\t},\n"
192 tdd += "},\n"
193 return tdd
194