changeset 5171:99ad84da5f99

added javadoc command (from Maxine version of mx)
author Doug Simon <doug.simon@oracle.com>
date Thu, 29 Mar 2012 10:52:12 +0200
parents 597eade2394e
children 8c9f7d19fbc1
files mxtool/mx.py
diffstat 1 files changed, 82 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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, ''],
 }