# HG changeset patch # User Bernhard Urban # Date 1400677874 -7200 # Node ID 2460aed6c899bc5f4409d85c4fa11329141b6264 # Parent 718034423138e906e5df3266639f12473275bf55 mx: add support for setting a main class in distributions diff -r 718034423138 -r 2460aed6c899 mx/mx_graal.py --- a/mx/mx_graal.py Wed May 21 15:17:21 2014 +0200 +++ b/mx/mx_graal.py Wed May 21 15:11:14 2014 +0200 @@ -1542,7 +1542,7 @@ if not mx.library(name, fatalIfMissing=False): mx.log('Skipping ' + groupId + '.' + artifactId + '.jar as ' + name + ' cannot be resolved') return - d = mx.Distribution(graalSuite, name=artifactId, path=path, sourcesPath=path, deps=deps, excludedDependencies=[], distDependencies=[]) + d = mx.Distribution(graalSuite, name=artifactId, path=path, sourcesPath=path, deps=deps, mainClass=None, excludedDependencies=[], distDependencies=[]) d.make_archive() cmd = ['mvn', 'install:install-file', '-DgroupId=' + groupId, '-DartifactId=' + artifactId, '-Dversion=1.0-SNAPSHOT', '-Dpackaging=jar', '-Dfile=' + d.path] diff -r 718034423138 -r 2460aed6c899 mxtool/mx.py --- a/mxtool/mx.py Wed May 21 15:17:21 2014 +0200 +++ b/mxtool/mx.py Wed May 21 15:11:14 2014 +0200 @@ -63,7 +63,7 @@ A distribution is a jar or zip file containing the output from one or more Java projects. """ class Distribution: - def __init__(self, suite, name, path, sourcesPath, deps, excludedDependencies, distDependencies): + def __init__(self, suite, name, path, sourcesPath, deps, mainClass, excludedDependencies, distDependencies): self.suite = suite self.name = name self.path = path.replace('/', os.sep) @@ -71,6 +71,7 @@ self.sourcesPath = _make_absolute(sourcesPath.replace('/', os.sep), suite.dir) if sourcesPath else None self.deps = deps self.update_listeners = set() + self.mainClass = mainClass self.excludedDependencies = excludedDependencies self.distDependencies = distDependencies @@ -98,9 +99,17 @@ if not hasattr(zf, '_provenance'): zf._provenance = {} existingSource = zf._provenance.get(arcname, None) + isOverwrite = False if existingSource and existingSource != source and not arcname.endswith('/'): log('warning: ' + self.path + ': overwriting ' + arcname + '\n new: ' + source + '\n old: ' + existingSource) + isOverwrite = True zf._provenance[arcname] = source + return isOverwrite + + if self.mainClass: + manifest = "Manifest-Version: 1.0\nMain-Class: %s\n\n" % (self.mainClass) + if not overwriteCheck(arc.zf, "META-INF/MANIFEST.MF", "project files"): + arc.zf.writestr("META-INF/MANIFEST.MF", manifest) for dep in self.sorted_deps(includeLibs=True): if dep.isLibrary(): @@ -117,13 +126,13 @@ assert '/' not in service services.setdefault(service, []).extend(lp.read(arcname).splitlines()) else: - overwriteCheck(arc.zf, arcname, lpath + '!' + arcname) - arc.zf.writestr(arcname, lp.read(arcname)) + if not overwriteCheck(arc.zf, arcname, lpath + '!' + arcname): + arc.zf.writestr(arcname, lp.read(arcname)) if srcArc.zf and libSourcePath: with zipfile.ZipFile(libSourcePath, 'r') as lp: for arcname in lp.namelist(): - overwriteCheck(srcArc.zf, arcname, lpath + '!' + arcname) - srcArc.zf.writestr(arcname, lp.read(arcname)) + if not overwriteCheck(srcArc.zf, arcname, lpath + '!' + arcname): + srcArc.zf.writestr(arcname, lp.read(arcname)) elif dep.isProject(): p = dep @@ -157,8 +166,8 @@ else: for f in files: arcname = join(relpath, f).replace(os.sep, '/') - overwriteCheck(arc.zf, arcname, join(root, f)) - arc.zf.write(join(root, f), arcname) + if not overwriteCheck(arc.zf, arcname, join(root, f)): + arc.zf.write(join(root, f), arcname) if srcArc.zf: sourceDirs = p.source_dirs() if p.source_gen_dir(): @@ -169,8 +178,8 @@ for f in files: if f.endswith('.java'): arcname = join(relpath, f).replace(os.sep, '/') - overwriteCheck(srcArc.zf, arcname, join(root, f)) - srcArc.zf.write(join(root, f), arcname) + if not overwriteCheck(srcArc.zf, arcname, join(root, f)): + srcArc.zf.write(join(root, f), arcname) for service, providers in services.iteritems(): arcname = 'META-INF/services/' + service @@ -822,9 +831,10 @@ path = attrs.pop('path') sourcesPath = attrs.pop('sourcesPath', None) deps = pop_list(attrs, 'dependencies') + mainClass = attrs.pop('mainClass', None) exclDeps = pop_list(attrs, 'exclude') distDeps = pop_list(attrs, 'distDependencies') - d = Distribution(self, name, path, sourcesPath, deps, exclDeps, distDeps) + d = Distribution(self, name, path, sourcesPath, deps, mainClass, exclDeps, distDeps) d.__dict__.update(attrs) self.dists.append(d)