You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
169 lines
6.7 KiB
169 lines
6.7 KiB
"""Script to generate doxygen documentation. |
|
""" |
|
from __future__ import print_function |
|
from devtools import tarball |
|
import re |
|
import os |
|
import os.path |
|
import sys |
|
import shutil |
|
|
|
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 '' |
|
for filename in filenames: |
|
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): |
|
return full_path |
|
return '' |
|
|
|
def do_subst_in_file(targetfile, sourcefile, dict): |
|
"""Replace all instances of the keys of dict with their values. |
|
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. |
|
""" |
|
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) |
|
try: |
|
f = open(targetfile, 'wb') |
|
f.write(contents) |
|
f.close() |
|
except: |
|
print("Can't write target file %s"%targetfile) |
|
raise |
|
|
|
def run_doxygen(doxygen_path, config_file, working_dir, is_silent): |
|
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] |
|
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 ): |
|
if make_release: |
|
options.make_tarball = True |
|
options.with_dot = True |
|
options.with_html_help = True |
|
options.with_uml_look = True |
|
options.open = False |
|
options.silent = True |
|
|
|
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( '.' ) |
|
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 ): |
|
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 ), |
|
'%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 ) |
|
} |
|
|
|
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 ) |
|
|
|
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, '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 ) |
|
if options.make_tarball: |
|
print('Generating doc tarball to', tarball_path) |
|
tarball_sources = [ |
|
output_dir, |
|
'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 ) |
|
return tarball_path, html_output_dirname |
|
|
|
def main(): |
|
usage = """%prog |
|
Generates doxygen documentation in build/doxygen. |
|
Optionaly makes a tarball of the documentation to dist/. |
|
|
|
Must be started in the project top directory. |
|
""" |
|
from optparse import OptionParser |
|
parser = OptionParser(usage=usage) |
|
parser.allow_interspersed_args = False |
|
parser.add_option('--with-dot', dest="with_dot", action='store_true', default=False, |
|
help="""Enable usage of DOT to generate collaboration diagram""") |
|
parser.add_option('--dot', dest="dot_path", action='store', default=find_program('dot'), |
|
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('--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, |
|
help="""Generates DOT graph without UML look [Default: False]""") |
|
parser.add_option('--open', dest="open", action='store_true', default=False, |
|
help="""Open the HTML index in the web browser after generation""") |
|
parser.add_option('--tarball', dest="make_tarball", action='store_true', default=False, |
|
help="""Generates a tarball of the documentation in dist/ directory""") |
|
parser.add_option('-s', '--silent', dest="silent", action='store_true', default=False, |
|
help="""Hides doxygen output""") |
|
parser.enable_interspersed_args() |
|
options, args = parser.parse_args() |
|
build_doc( options ) |
|
|
|
if __name__ == '__main__': |
|
main()
|
|
|