Package imaker :: Module ant
[hide private]
[frames] | no frames]

Source Code for Module imaker.ant

  1  #============================================================================  
  2  #Name        : ant.py  
  3  #Part of     : Helium  
  4   
  5  #Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
  6  #All rights reserved. 
  7  #This component and the accompanying materials are made available 
  8  #under the terms of the License "Eclipse Public License v1.0" 
  9  #which accompanies this distribution, and is available 
 10  #at the URL "http://www.eclipse.org/legal/epl-v10.html". 
 11  # 
 12  #Initial Contributors: 
 13  #Nokia Corporation - initial contribution. 
 14  # 
 15  #Contributors: 
 16  # 
 17  #Description: 
 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 # run imaker and log to Ant. 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
48 -def is_included(incs, target):
49 """ Does target matches an include pattern. """ 50 for inc in incs: 51 if inc.match(target): 52 return True 53 return False
54
55 -def is_excluded(excs, target):
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
63 -def ant_task_configuration(project, task, elements, attributes):
64 """ Implementation of the Ant task. """ 65 # assert attributes.get('property') != None, "'property' attribute is not defined." 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
95 -def handle_configuration(project, task, elements, attributes, configuration):
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 # Reading the variables 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 # sort by region 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 # generating the TDD 164 return imaker_command_to_tdd(targets, variables)
165 166
167 -def region_switch_to_tdd(region):
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
175 -def imaker_command_to_tdd(targets, variables):
176 # generating the TDD 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