# HG changeset patch # User Doug Simon # Date 1333011132 -7200 # Node ID 99ad84da5f998a00b321cc6892133b5ebd5ebbe1 # Parent 597eade2394ea9c4310b675c9af61aa7a38d4ba4 added javadoc command (from Maxine version of mx) diff -r 597eade2394e -r 99ad84da5f99 mxtool/mx.py --- a/mxtool/mx.py Wed Mar 28 22:17:38 2012 +0200 +++ b/mxtool/mx.py Thu Mar 29 10:52:12 2012 +0200 @@ -760,6 +760,7 @@ self.java = exe_suffix(join(self.jdk, 'bin', 'java')) self.javac = exe_suffix(join(self.jdk, 'bin', 'javac')) self.javap = exe_suffix(join(self.jdk, 'bin', 'javap')) + self.javadoc = exe_suffix(join(self.jdk, 'bin', 'javadoc')) if not exists(self.java): abort('Java launcher derived from JAVA_HOME does not exist: ' + self.java) @@ -1745,6 +1746,86 @@ eclipseinit(args, suite) netbeansinit(args, suite) +def javadoc(args): + """generate javadoc for some/all Java projects""" + + parser = ArgumentParser(prog='mx javadoc') + parser.add_argument('--unified', action='store_true', help='put javadoc in a single directory instead of one per project') + parser.add_argument('--force', action='store_true', help='(re)generate javadoc even if package-list file exists') + parser.add_argument('--projects', action='store', help='comma separated projects to process (omit to process all projects)') + parser.add_argument('--argfile', action='store', help='name of file containing extra javadoc options') + parser.add_argument('-m', '--memory', action='store', help='-Xmx value to pass to underlying JVM') + + args = parser.parse_args(args) + + # build list of projects to be processed + candidates = sorted_deps() + if args.projects is not None: + candidates = [project(name) for name in args.projects.split(',')] + + def assess_candidate(p, projects): + if p in projects: + return False + if args.force or args.unified or not exists(join(p.dir, 'javadoc', 'package-list')): + projects.append(p) + return True + return False + + projects = [] + for p in candidates: + if not p.native: + deps = p.all_deps([], includeLibs=False, includeSelf=False) + for d in deps: + assess_candidate(d, projects) + if not assess_candidate(p, projects): + log('[package-list file exists - skipping {0}]'.format(p.name)) + + + def find_packages(sourceDirs, pkgs=set()): + for sourceDir in sourceDirs: + for root, _, files in os.walk(sourceDir): + if len([name for name in files if name.endswith('.java')]) != 0: + pkgs.add(root[len(sourceDir) + 1:].replace('/','.')) + return pkgs + + extraArgs = [] + if args.argfile is not None: + extraArgs += ['@' + args.argfile] + if args.memory is not None: + extraArgs.append('-J-Xmx' + args.memory) + + if not args.unified: + for p in projects: + pkgs = find_packages(p.source_dirs(), set()) + deps = p.all_deps([], includeLibs=False, includeSelf=False) + links = ['-link', 'http://docs.oracle.com/javase/6/docs/api/'] + out = join(p.dir, 'javadoc') + for d in deps: + depOut = join(d.dir, 'javadoc') + links.append('-link') + links.append(os.path.relpath(depOut, out)) + cp = classpath(p.name, includeSelf=True) + sp = os.pathsep.join(p.source_dirs()) + log('Generating javadoc for {0} in {1}'.format(p.name, out)) + run([java().javadoc, '-J-Xmx2g', '-classpath', cp, '-quiet', '-d', out, '-sourcepath', sp] + links + extraArgs + list(pkgs)) + log('Generated javadoc for {0} in {1}'.format(p.name, out)) + else: + pkgs = set() + sp = [] + names = [] + for p in projects: + find_packages(p.source_dirs(), pkgs) + sp += p.source_dirs() + names.append(p.name) + + links = ['-link', 'http://docs.oracle.com/javase/6/docs/api/'] + out = join(_mainSuite.dir, 'javadoc') + cp = classpath() + sp = os.pathsep.join(sp) + log('Generating javadoc for {0} in {1}'.format(', '.join(names), out)) + run([java().javadoc, '-classpath', cp, '-quiet', '-d', out, '-sourcepath', sp] + links + extraArgs + list(pkgs)) + log('Generated javadoc for {0} in {1}'.format(', '.join(names), out)) + def javap(args): """launch javap with a -classpath option denoting all available classes @@ -1791,6 +1872,7 @@ 'ideinit': [ideinit, ''], 'projectgraph': [projectgraph, ''], 'javap': [javap, ''], + 'javadoc': [javadoc, '[options]'], 'netbeansinit': [netbeansinit, ''], 'projects': [show_projects, ''], }