diff options
Diffstat (limited to 'doxybuild.py')
-rw-r--r-- | doxybuild.py | 146 |
1 files changed, 63 insertions, 83 deletions
diff --git a/doxybuild.py b/doxybuild.py index 862c1f4..0b61c39 100644 --- a/doxybuild.py +++ b/doxybuild.py @@ -1,37 +1,22 @@ """Script to generate doxygen documentation. """ from __future__ import print_function -from __future__ import unicode_literals from devtools import tarball -from contextlib import contextmanager -import subprocess -import traceback import re import os +import os.path import sys import shutil -@contextmanager -def cd(newdir): - """ - http://stackoverflow.com/questions/431684/how-do-i-cd-in-python - """ - prevdir = os.getcwd() - os.chdir(newdir) - try: - yield - finally: - os.chdir(prevdir) - def find_program(*filenames): """find a program in folders path_lst, and sets env[var] @param filenames: a list of possible names of the program to search for @return: the full path of the filename if found, or '' if filename could not be found """ paths = os.environ.get('PATH', '').split(os.pathsep) - suffixes = ('win32' in sys.platform) and '.exe .com .bat .cmd' or '' + suffixes = ('win32' in sys.platform ) and '.exe .com .bat .cmd' or '' for filename in filenames: - for name in [filename+ext for ext in suffixes.split(' ')]: + for name in [filename+ext for ext in suffixes.split()]: for directory in paths: full_path = os.path.join(directory, name) if os.path.isfile(full_path): @@ -43,56 +28,53 @@ def do_subst_in_file(targetfile, sourcefile, dict): For example, if dict is {'%VERSION%': '1.2345', '%BASE%': 'MyProg'}, then all instances of %VERSION% in the file will be replaced with 1.2345 etc. """ - with open(sourcefile, 'r') as f: + try: + f = open(sourcefile, 'rb') contents = f.read() + f.close() + except: + print("Can't read source file %s"%sourcefile) + raise for (k,v) in list(dict.items()): v = v.replace('\\','\\\\') contents = re.sub(k, v, contents) - with open(targetfile, 'w') as f: - f.write(contents) - -def getstatusoutput(cmd): - """cmd is a list. - """ try: - process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - output, _ = process.communicate() - status = process.returncode + f = open(targetfile, 'wb') + f.write(contents) + f.close() except: - status = -1 - output = traceback.format_exc() - return status, output - -def run_cmd(cmd, silent=False): - """Raise exception on failure. - """ - info = 'Running: %r in %r' %(' '.join(cmd), os.getcwd()) - print(info) - sys.stdout.flush() - if silent: - status, output = getstatusoutput(cmd) - else: - status, output = subprocess.call(cmd), '' - if status: - msg = 'Error while %s ...\n\terror=%d, output="""%s"""' %(info, status, output) - raise Exception(msg) - -def assert_is_exe(path): - if not path: - raise Exception('path is empty.') - if not os.path.isfile(path): - raise Exception('%r is not a file.' %path) - if not os.access(path, os.X_OK): - raise Exception('%r is not executable by this user.' %path) + print("Can't write target file %s"%targetfile) + raise def run_doxygen(doxygen_path, config_file, working_dir, is_silent): - assert_is_exe(doxygen_path) - config_file = os.path.abspath(config_file) - with cd(working_dir): + config_file = os.path.abspath( config_file ) + doxygen_path = doxygen_path + old_cwd = os.getcwd() + try: + os.chdir( working_dir ) cmd = [doxygen_path, config_file] - run_cmd(cmd, is_silent) + print('Running:', ' '.join( cmd )) + try: + import subprocess + except: + if os.system( ' '.join( cmd ) ) != 0: + print('Documentation generation failed') + return False + else: + if is_silent: + process = subprocess.Popen( cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT ) + else: + process = subprocess.Popen( cmd ) + stdout, _ = process.communicate() + if process.returncode: + print('Documentation generation failed:') + print(stdout) + return False + return True + finally: + os.chdir( old_cwd ) -def build_doc(options, make_release=False): +def build_doc( options, make_release=False ): if make_release: options.make_tarball = True options.with_dot = True @@ -101,62 +83,62 @@ def build_doc(options, make_release=False): options.open = False options.silent = True - version = open('version', 'rt').read().strip() + version = open('version','rt').read().strip() output_dir = 'dist/doxygen' # relative to doc/doxyfile location. - if not os.path.isdir(output_dir): - os.makedirs(output_dir) - top_dir = os.path.abspath('.') + if not os.path.isdir( output_dir ): + os.makedirs( output_dir ) + top_dir = os.path.abspath( '.' ) html_output_dirname = 'jsoncpp-api-html-' + version - tarball_path = os.path.join('dist', html_output_dirname + '.tar.gz') - warning_log_path = os.path.join(output_dir, '../jsoncpp-doxygen-warning.log') - html_output_path = os.path.join(output_dir, html_output_dirname) - def yesno(bool): + tarball_path = os.path.join( 'dist', html_output_dirname + '.tar.gz' ) + warning_log_path = os.path.join( output_dir, '../jsoncpp-doxygen-warning.log' ) + html_output_path = os.path.join( output_dir, html_output_dirname ) + def yesno( bool ): return bool and 'YES' or 'NO' subst_keys = { '%JSONCPP_VERSION%': version, '%DOC_TOPDIR%': '', '%TOPDIR%': top_dir, - '%HTML_OUTPUT%': os.path.join('..', output_dir, html_output_dirname), + '%HTML_OUTPUT%': os.path.join( '..', output_dir, html_output_dirname ), '%HAVE_DOT%': yesno(options.with_dot), '%DOT_PATH%': os.path.split(options.dot_path)[0], '%HTML_HELP%': yesno(options.with_html_help), '%UML_LOOK%': yesno(options.with_uml_look), - '%WARNING_LOG_PATH%': os.path.join('..', warning_log_path) + '%WARNING_LOG_PATH%': os.path.join( '..', warning_log_path ) } - if os.path.isdir(output_dir): + if os.path.isdir( output_dir ): print('Deleting directory:', output_dir) - shutil.rmtree(output_dir) - if not os.path.isdir(output_dir): - os.makedirs(output_dir) + shutil.rmtree( output_dir ) + if not os.path.isdir( output_dir ): + os.makedirs( output_dir ) - do_subst_in_file('doc/doxyfile', options.doxyfile_input_path, subst_keys) - run_doxygen(options.doxygen_path, 'doc/doxyfile', 'doc', is_silent=options.silent) + do_subst_in_file( 'doc/doxyfile', 'doc/doxyfile.in', subst_keys ) + ok = run_doxygen( options.doxygen_path, 'doc/doxyfile', 'doc', is_silent=options.silent ) if not options.silent: - print(open(warning_log_path, 'r').read()) + print(open(warning_log_path, 'rb').read()) index_path = os.path.abspath(os.path.join('doc', subst_keys['%HTML_OUTPUT%'], 'index.html')) print('Generated documentation can be found in:') print(index_path) if options.open: import webbrowser - webbrowser.open('file://' + index_path) + webbrowser.open( 'file://' + index_path ) if options.make_tarball: print('Generating doc tarball to', tarball_path) tarball_sources = [ output_dir, - 'README.md', + 'README.txt', 'LICENSE', 'NEWS.txt', 'version' ] - tarball_basedir = os.path.join(output_dir, html_output_dirname) - tarball.make_tarball(tarball_path, tarball_sources, tarball_basedir, html_output_dirname) + tarball_basedir = os.path.join( output_dir, html_output_dirname ) + tarball.make_tarball( tarball_path, tarball_sources, tarball_basedir, html_output_dirname ) return tarball_path, html_output_dirname def main(): usage = """%prog Generates doxygen documentation in build/doxygen. - Optionally makes a tarball of the documentation to dist/. + Optionaly makes a tarball of the documentation to dist/. Must be started in the project top directory. """ @@ -169,8 +151,6 @@ def main(): help="""Path to GraphViz dot tool. Must be full qualified path. [Default: %default]""") parser.add_option('--doxygen', dest="doxygen_path", action='store', default=find_program('doxygen'), help="""Path to Doxygen tool. [Default: %default]""") - parser.add_option('--in', dest="doxyfile_input_path", action='store', default='doc/doxyfile.in', - help="""Path to doxygen inputs. [Default: %default]""") parser.add_option('--with-html-help', dest="with_html_help", action='store_true', default=False, help="""Enable generation of Microsoft HTML HELP""") parser.add_option('--no-uml-look', dest="with_uml_look", action='store_false', default=True, @@ -183,7 +163,7 @@ def main(): help="""Hides doxygen output""") parser.enable_interspersed_args() options, args = parser.parse_args() - build_doc(options) + build_doc( options ) if __name__ == '__main__': main() |