1#!/usr/bin/env python 2# Copyright 2014 The Chromium Authors. All rights reserved. 3# Use of this source code is governed by a BSD-style license that can be 4# found in the LICENSE file. 5 6 7"""Generate Doxygen documentation.""" 8 9 10import datetime 11import os 12import shutil 13import subprocess 14import sys 15 16 17DOXYFILE_BASENAME = 'Doxyfile' # must match name of Doxyfile in skia root 18DOXYGEN_BINARY = 'doxygen' 19WORKDIR = os.path.join(os.pardir, 'doxygen_workdir') 20DOXYGEN_CONFIG_DIR = os.path.join(WORKDIR, 'doxygen-config') 21DOXYGEN_WORKING_DIR = os.path.join(WORKDIR, 'doxygen') 22DOXYGEN_GS_PATH = '/'.join(['gs://skia-doc', 'doxygen']) 23 24IFRAME_FOOTER_TEMPLATE = """ 25<html><body><address style="text-align: right;"><small> 26Generated at %s for skia 27by <a href="http://www.doxygen.org/index.html">doxygen</a> 28%s </small></address></body></html> 29""" 30 31 32def recreate_dir(path): 33 """Delete and recreate the directory.""" 34 try: 35 shutil.rmtree(path) 36 except OSError: 37 if os.path.exists(path): 38 raise Exception('Could not remove %s' % path) 39 os.makedirs(path) 40 41 42def generate_and_upload_doxygen(): 43 """Generate Doxygen.""" 44 # Create empty dir and add static_footer.txt 45 recreate_dir(DOXYGEN_WORKING_DIR) 46 static_footer_path = os.path.join(DOXYGEN_WORKING_DIR, 'static_footer.txt') 47 shutil.copyfile(os.path.join('tools', 'doxygen_footer.txt'), 48 static_footer_path) 49 50 # Make copy of doxygen config file, overriding any necessary configs, 51 # and run doxygen. 52 recreate_dir(DOXYGEN_CONFIG_DIR) 53 modified_doxyfile = os.path.join(DOXYGEN_CONFIG_DIR, DOXYFILE_BASENAME) 54 with open(DOXYFILE_BASENAME, 'r') as reader: 55 with open(modified_doxyfile, 'w') as writer: 56 shutil.copyfileobj(reader, writer) 57 writer.write('OUTPUT_DIRECTORY = %s\n' % DOXYGEN_WORKING_DIR) 58 writer.write('HTML_FOOTER = %s\n' % static_footer_path) 59 subprocess.check_call([DOXYGEN_BINARY, modified_doxyfile]) 60 61 # Create iframe_footer.html 62 with open(os.path.join(DOXYGEN_WORKING_DIR, 'iframe_footer.html'), 'w') as f: 63 f.write(IFRAME_FOOTER_TEMPLATE % ( 64 datetime.datetime.now().isoformat(' '), 65 subprocess.check_output([DOXYGEN_BINARY, '--version']).rstrip())) 66 67 # Upload. 68 cmd = ['gsutil', 'cp', '-a', 'public-read', '-R', 69 DOXYGEN_WORKING_DIR, DOXYGEN_GS_PATH] 70 subprocess.check_call(cmd) 71 72 73if '__main__' == __name__: 74 generate_and_upload_doxygen() 75 76