Index: native_client_sdk/src/doc/doxygen/generate_docs.py |
diff --git a/native_client_sdk/src/doc/doxygen/generate_docs.py b/native_client_sdk/src/doc/doxygen/generate_docs.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..1bf1aa67b91886665d64b09b16dd35bfdd851ba9 |
--- /dev/null |
+++ b/native_client_sdk/src/doc/doxygen/generate_docs.py |
@@ -0,0 +1,223 @@ |
+#!/usr/bin/python |
+ |
+# Copyright (c) 2014 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+import collections |
+import json |
+import optparse |
+import os |
+import shutil |
+import subprocess |
+import sys |
+import urllib2 |
+ |
+ |
+SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) |
+DOC_DIR = os.path.dirname(SCRIPT_DIR) |
+ |
+ |
+ChannelInfo = collections.namedtuple('ChannelInfo', ['branch', 'version']) |
+ |
+ |
+def Trace(msg): |
+ if Trace.verbose: |
+ sys.stderr.write(str(msg) + '\n') |
+ |
+Trace.verbose = False |
+ |
+ |
+def GetChannelInfo(): |
+ url = 'http://omahaproxy.appspot.com/json' |
+ u = urllib2.urlopen(url) |
+ try: |
+ data = json.loads(u.read()) |
+ finally: |
+ u.close() |
+ |
+ channel_info = {} |
+ for os_row in data: |
+ osname = os_row['os'] |
+ if osname not in ('win', 'mac', 'linux'): |
+ continue |
+ for version_row in os_row['versions']: |
+ channel = version_row['channel'] |
+ # We don't display canary docs. |
+ if channel == 'canary': |
+ continue |
+ |
+ version = version_row['version'].split('.')[0] # Major version |
+ branch = version_row['true_branch'] |
+ if branch is None: |
+ branch = 'trunk' |
+ |
+ if channel in channel_info: |
+ existing_info = channel_info[channel] |
+ if branch != existing_info.branch: |
+ sys.stderr.write('Warning: found different branch numbers for ' |
+ 'channel %s: %s vs %s. Using %s.\n' % ( |
+ channel, branch, existing_info.branch, existing_info.branch)) |
+ else: |
+ channel_info[channel] = ChannelInfo(branch, version) |
+ |
+ return channel_info |
+ |
+ |
+def RemoveFile(filename): |
+ if os.path.exists(filename): |
+ os.remove(filename) |
+ |
+ |
+def RemoveDir(dirname): |
+ if os.path.exists(dirname): |
+ shutil.rmtree(dirname) |
+ |
+ |
+def GetSVNRepositoryRoot(branch): |
+ if branch == 'trunk': |
+ return 'http://src.chromium.org/chrome/trunk/src' |
+ return 'http://src.chromium.org/chrome/branches/%s/src' % branch |
+ |
+ |
+def CheckoutPepperDocs(branch, doc_dirname): |
+ Trace('Removing directory %s' % doc_dirname) |
+ RemoveDir(doc_dirname) |
+ |
+ svn_root_url = GetSVNRepositoryRoot(branch) |
+ |
+ for subdir in ('api', 'generators', 'cpp', 'utility'): |
+ url = svn_root_url + '/ppapi/%s' % subdir |
+ cmd = ['svn', 'co', url, os.path.join(doc_dirname, subdir)] |
+ Trace('Checking out docs into %s:\n %s' % (doc_dirname, ' '.join(cmd))) |
+ subprocess.check_call(cmd) |
+ |
+ # The IDL generator needs PLY (a python lexing library); check it out into |
+ # generators. |
+ url = svn_root_url + '/third_party/ply' |
+ ply_dirname = os.path.join(doc_dirname, 'generators', 'ply') |
+ cmd = ['svn', 'co', url, ply_dirname] |
+ Trace('Checking out PLY into %s:\n %s' % (ply_dirname, ' '.join(cmd))) |
+ subprocess.check_call(cmd) |
+ |
+ |
+def GenerateCHeaders(pepper_version, doc_dirname): |
+ script = os.path.join(os.pardir, 'generators', 'generator.py') |
+ cwd = os.path.join(doc_dirname, 'api') |
+ out_dirname = os.path.join(os.pardir, 'c') |
+ cmd = [sys.executable, script, '--cgen', '--release', 'M' + pepper_version, |
+ '--wnone', '--dstroot', out_dirname] |
+ Trace('Generating C Headers for version %s\n %s' % ( |
+ pepper_version, ' '.join(cmd))) |
+ subprocess.check_call(cmd, cwd=cwd) |
+ |
+ |
+def GenerateDoxyfile(template_filename, out_dirname, doc_dirname, doxyfile): |
+ Trace('Writing Doxyfile "%s" (from template %s)' % ( |
+ doxyfile, template_filename)) |
+ |
+ with open(template_filename) as f: |
+ data = f.read() |
+ |
+ with open(doxyfile, 'w') as f: |
+ f.write(data % {'out_dirname': out_dirname, 'doc_dirname': doc_dirname}) |
+ |
+ |
+def RunDoxygen(out_dirname, doxyfile): |
+ Trace('Removing old output directory %s' % out_dirname) |
+ RemoveDir(out_dirname) |
+ |
+ Trace('Making new output directory %s' % out_dirname) |
+ os.makedirs(out_dirname) |
+ |
+ cmd = ['doxygen', doxyfile] |
+ Trace('Running Doxygen:\n %s' % ' '.join(cmd)) |
+ subprocess.check_call(cmd) |
+ |
+ |
+def RunDoxyCleanup(out_dirname): |
+ cmd = [sys.executable, 'doxy_cleanup.py', out_dirname] |
+ if Trace.verbose: |
+ cmd.append('-v') |
+ Trace('Running doxy_cleanup:\n %s' % ' '.join(cmd)) |
+ subprocess.check_call(cmd) |
+ |
+ |
+def RunRstIndex(kind, channel, pepper_version, out_dirname, out_rst_filename): |
+ assert kind in ('root', 'c', 'cpp') |
+ cmd = [sys.executable, 'rst_index.py', |
+ '--' + kind, |
+ '--channel', channel, |
+ '--version', pepper_version, |
+ out_dirname, |
+ '-o', out_rst_filename] |
+ Trace('Running rst_index:\n %s' % ' '.join(cmd)) |
+ subprocess.check_call(cmd) |
+ |
+ |
+def GenerateDocs(channel, pepper_version, branch): |
+ Trace('Generating docs for %s (branch %s)' % (channel, branch)) |
+ pepper_dirname = 'pepper_%s' % channel |
+ # i.e. ../_build/chromesite/pepper_beta |
+ chromesite_dir = os.path.join(DOC_DIR, '_build', 'chromesite', pepper_dirname) |
+ |
+ CheckoutPepperDocs(branch, pepper_dirname) |
+ GenerateCHeaders(pepper_version, pepper_dirname) |
+ |
+ doxyfile_c = '' |
+ doxyfile_cpp = '' |
+ |
+ try: |
+ # Generate Root index |
+ rst_index_root = os.path.join(DOC_DIR, pepper_dirname, 'index.rst') |
+ RunRstIndex('root', channel, pepper_version, chromesite_dir, rst_index_root) |
+ |
+ # Generate C docs |
+ out_dirname_c = os.path.join(chromesite_dir, 'c') |
+ doxyfile_c = 'Doxyfile.c.%s' % channel |
+ rst_index_c = os.path.join(DOC_DIR, pepper_dirname, 'c', 'index.rst') |
+ GenerateDoxyfile('Doxyfile.c.template', out_dirname_c, pepper_dirname, |
+ doxyfile_c) |
+ RunDoxygen(out_dirname_c, doxyfile_c) |
+ RunDoxyCleanup(out_dirname_c) |
+ RunRstIndex('c', channel, pepper_version, out_dirname_c, rst_index_c) |
+ |
+ # Generate C++ docs |
+ out_dirname_cpp = os.path.join(chromesite_dir, 'cpp') |
+ doxyfile_cpp = 'Doxyfile.cpp.%s' % channel |
+ rst_index_cpp = os.path.join(DOC_DIR, pepper_dirname, 'cpp', 'index.rst') |
+ GenerateDoxyfile('Doxyfile.cpp.template', out_dirname_cpp, pepper_dirname, |
+ doxyfile_cpp) |
+ RunDoxygen(out_dirname_cpp, doxyfile_cpp) |
+ RunDoxyCleanup(out_dirname_cpp) |
+ RunRstIndex('cpp', channel, pepper_version, out_dirname_cpp, rst_index_cpp) |
+ finally: |
+ # Cleanup |
+ RemoveDir(pepper_dirname) |
+ RemoveFile(doxyfile_c) |
+ RemoveFile(doxyfile_cpp) |
+ |
+ |
+def main(argv): |
+ parser = optparse.OptionParser(usage='Usage: %prog [options]') |
+ parser.add_option('-v', '--verbose', |
+ help='Verbose output', action='store_true') |
+ options, _ = parser.parse_args(argv) |
+ |
+ if options.verbose: |
+ Trace.verbose = True |
+ |
+ channel_info = GetChannelInfo() |
+ for channel, info in channel_info.iteritems(): |
+ GenerateDocs(channel, info.version, info.branch) |
+ |
+ return 0 |
+ |
+ |
+if __name__ == '__main__': |
+ try: |
+ rtn = main(sys.argv[1:]) |
+ except KeyboardInterrupt: |
+ sys.stderr.write('%s: interrupted\n' % os.path.basename(__file__)) |
+ rtn = 1 |
+ sys.exit(rtn) |