comparison mxtool/mx.py @ 15819:2460aed6c899

mx: add support for setting a main class in distributions
author Bernhard Urban <bernhard.urban@jku.at>
date Wed, 21 May 2014 15:11:14 +0200
parents 718034423138
children de8296c27680
comparison
equal deleted inserted replaced
15818:718034423138 15819:2460aed6c899
61 61
62 """ 62 """
63 A distribution is a jar or zip file containing the output from one or more Java projects. 63 A distribution is a jar or zip file containing the output from one or more Java projects.
64 """ 64 """
65 class Distribution: 65 class Distribution:
66 def __init__(self, suite, name, path, sourcesPath, deps, excludedDependencies, distDependencies): 66 def __init__(self, suite, name, path, sourcesPath, deps, mainClass, excludedDependencies, distDependencies):
67 self.suite = suite 67 self.suite = suite
68 self.name = name 68 self.name = name
69 self.path = path.replace('/', os.sep) 69 self.path = path.replace('/', os.sep)
70 self.path = _make_absolute(self.path, suite.dir) 70 self.path = _make_absolute(self.path, suite.dir)
71 self.sourcesPath = _make_absolute(sourcesPath.replace('/', os.sep), suite.dir) if sourcesPath else None 71 self.sourcesPath = _make_absolute(sourcesPath.replace('/', os.sep), suite.dir) if sourcesPath else None
72 self.deps = deps 72 self.deps = deps
73 self.update_listeners = set() 73 self.update_listeners = set()
74 self.mainClass = mainClass
74 self.excludedDependencies = excludedDependencies 75 self.excludedDependencies = excludedDependencies
75 self.distDependencies = distDependencies 76 self.distDependencies = distDependencies
76 77
77 def sorted_deps(self, includeLibs=False): 78 def sorted_deps(self, includeLibs=False):
78 try: 79 try:
96 services = {} 97 services = {}
97 def overwriteCheck(zf, arcname, source): 98 def overwriteCheck(zf, arcname, source):
98 if not hasattr(zf, '_provenance'): 99 if not hasattr(zf, '_provenance'):
99 zf._provenance = {} 100 zf._provenance = {}
100 existingSource = zf._provenance.get(arcname, None) 101 existingSource = zf._provenance.get(arcname, None)
102 isOverwrite = False
101 if existingSource and existingSource != source and not arcname.endswith('/'): 103 if existingSource and existingSource != source and not arcname.endswith('/'):
102 log('warning: ' + self.path + ': overwriting ' + arcname + '\n new: ' + source + '\n old: ' + existingSource) 104 log('warning: ' + self.path + ': overwriting ' + arcname + '\n new: ' + source + '\n old: ' + existingSource)
105 isOverwrite = True
103 zf._provenance[arcname] = source 106 zf._provenance[arcname] = source
107 return isOverwrite
108
109 if self.mainClass:
110 manifest = "Manifest-Version: 1.0\nMain-Class: %s\n\n" % (self.mainClass)
111 if not overwriteCheck(arc.zf, "META-INF/MANIFEST.MF", "project files"):
112 arc.zf.writestr("META-INF/MANIFEST.MF", manifest)
104 113
105 for dep in self.sorted_deps(includeLibs=True): 114 for dep in self.sorted_deps(includeLibs=True):
106 if dep.isLibrary(): 115 if dep.isLibrary():
107 l = dep 116 l = dep
108 # merge library jar into distribution jar 117 # merge library jar into distribution jar
115 if arcname.startswith('META-INF/services/') and not arcname == 'META-INF/services/': 124 if arcname.startswith('META-INF/services/') and not arcname == 'META-INF/services/':
116 service = arcname[len('META-INF/services/'):] 125 service = arcname[len('META-INF/services/'):]
117 assert '/' not in service 126 assert '/' not in service
118 services.setdefault(service, []).extend(lp.read(arcname).splitlines()) 127 services.setdefault(service, []).extend(lp.read(arcname).splitlines())
119 else: 128 else:
120 overwriteCheck(arc.zf, arcname, lpath + '!' + arcname) 129 if not overwriteCheck(arc.zf, arcname, lpath + '!' + arcname):
121 arc.zf.writestr(arcname, lp.read(arcname)) 130 arc.zf.writestr(arcname, lp.read(arcname))
122 if srcArc.zf and libSourcePath: 131 if srcArc.zf and libSourcePath:
123 with zipfile.ZipFile(libSourcePath, 'r') as lp: 132 with zipfile.ZipFile(libSourcePath, 'r') as lp:
124 for arcname in lp.namelist(): 133 for arcname in lp.namelist():
125 overwriteCheck(srcArc.zf, arcname, lpath + '!' + arcname) 134 if not overwriteCheck(srcArc.zf, arcname, lpath + '!' + arcname):
126 srcArc.zf.writestr(arcname, lp.read(arcname)) 135 srcArc.zf.writestr(arcname, lp.read(arcname))
127 elif dep.isProject(): 136 elif dep.isProject():
128 p = dep 137 p = dep
129 138
130 isCoveredByDependecy = False 139 isCoveredByDependecy = False
131 for d in self.distDependencies: 140 for d in self.distDependencies:
155 for service in fp: 164 for service in fp:
156 services.setdefault(service.strip(), []).append(provider) 165 services.setdefault(service.strip(), []).append(provider)
157 else: 166 else:
158 for f in files: 167 for f in files:
159 arcname = join(relpath, f).replace(os.sep, '/') 168 arcname = join(relpath, f).replace(os.sep, '/')
160 overwriteCheck(arc.zf, arcname, join(root, f)) 169 if not overwriteCheck(arc.zf, arcname, join(root, f)):
161 arc.zf.write(join(root, f), arcname) 170 arc.zf.write(join(root, f), arcname)
162 if srcArc.zf: 171 if srcArc.zf:
163 sourceDirs = p.source_dirs() 172 sourceDirs = p.source_dirs()
164 if p.source_gen_dir(): 173 if p.source_gen_dir():
165 sourceDirs.append(p.source_gen_dir()) 174 sourceDirs.append(p.source_gen_dir())
166 for srcDir in sourceDirs: 175 for srcDir in sourceDirs:
167 for root, _, files in os.walk(srcDir): 176 for root, _, files in os.walk(srcDir):
168 relpath = root[len(srcDir) + 1:] 177 relpath = root[len(srcDir) + 1:]
169 for f in files: 178 for f in files:
170 if f.endswith('.java'): 179 if f.endswith('.java'):
171 arcname = join(relpath, f).replace(os.sep, '/') 180 arcname = join(relpath, f).replace(os.sep, '/')
172 overwriteCheck(srcArc.zf, arcname, join(root, f)) 181 if not overwriteCheck(srcArc.zf, arcname, join(root, f)):
173 srcArc.zf.write(join(root, f), arcname) 182 srcArc.zf.write(join(root, f), arcname)
174 183
175 for service, providers in services.iteritems(): 184 for service, providers in services.iteritems():
176 arcname = 'META-INF/services/' + service 185 arcname = 'META-INF/services/' + service
177 arc.zf.writestr(arcname, '\n'.join(providers)) 186 arc.zf.writestr(arcname, '\n'.join(providers))
178 187
820 829
821 for name, attrs in distsMap.iteritems(): 830 for name, attrs in distsMap.iteritems():
822 path = attrs.pop('path') 831 path = attrs.pop('path')
823 sourcesPath = attrs.pop('sourcesPath', None) 832 sourcesPath = attrs.pop('sourcesPath', None)
824 deps = pop_list(attrs, 'dependencies') 833 deps = pop_list(attrs, 'dependencies')
834 mainClass = attrs.pop('mainClass', None)
825 exclDeps = pop_list(attrs, 'exclude') 835 exclDeps = pop_list(attrs, 'exclude')
826 distDeps = pop_list(attrs, 'distDependencies') 836 distDeps = pop_list(attrs, 'distDependencies')
827 d = Distribution(self, name, path, sourcesPath, deps, exclDeps, distDeps) 837 d = Distribution(self, name, path, sourcesPath, deps, mainClass, exclDeps, distDeps)
828 d.__dict__.update(attrs) 838 d.__dict__.update(attrs)
829 self.dists.append(d) 839 self.dists.append(d)
830 840
831 if self.name is None: 841 if self.name is None:
832 abort('Missing "suite=<name>" in ' + projectsFile) 842 abort('Missing "suite=<name>" in ' + projectsFile)