Mercurial > hg > graal-jvmci-8
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) |