diff options
Diffstat (limited to 'lib/jsoncpp/scons-tools/doxygen.py')
-rw-r--r-- | lib/jsoncpp/scons-tools/doxygen.py | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/lib/jsoncpp/scons-tools/doxygen.py b/lib/jsoncpp/scons-tools/doxygen.py new file mode 100644 index 0000000000..5ace420a4c --- /dev/null +++ b/lib/jsoncpp/scons-tools/doxygen.py @@ -0,0 +1,116 @@ +# Big issue: +# emitter depends on doxyfile which is generated from doxyfile.in. +# build fails after cleaning and relaunching the build. + +# Todo: +# Add helper function to environment like for glob +# Easier passage of header/footer +# Automatic deduction of index.html path based on custom parameters passed to doxyfile + +import os +import os.path +from fnmatch import fnmatch +import SCons + +def Doxyfile_emitter(target, source, env): + """ + Modify the target and source lists to use the defaults if nothing + else has been specified. + + Dependencies on external HTML documentation references are also + appended to the source list. + """ + doxyfile_template = env.File(env['DOXYFILE_FILE']) + source.insert(0, doxyfile_template) + + return target, source + +def Doxyfile_Builder(target, source, env): + """Input: + DOXYFILE_FILE + Path of the template file for the output doxyfile + + DOXYFILE_DICT + A dictionnary of parameter to append to the generated doxyfile + """ + subdir = os.path.split(source[0].abspath)[0] + doc_top_dir = os.path.split(target[0].abspath)[0] + doxyfile_path = source[0].abspath + doxy_file = file( target[0].abspath, 'wt' ) + try: + # First, output the template file + try: + f = file(doxyfile_path, 'rt') + doxy_file.write( f.read() ) + f.close() + doxy_file.write( '\n' ) + doxy_file.write( '# Generated content:\n' ) + except: + raise SCons.Errors.UserError, "Can't read doxygen template file '%s'" % doxyfile_path + # Then, the input files + doxy_file.write( 'INPUT = \\\n' ) + for source in source: + if source.abspath != doxyfile_path: # skip doxyfile path, which is the first source + doxy_file.write( '"%s" \\\n' % source.abspath ) + doxy_file.write( '\n' ) + # Dot... + values_dict = { 'HAVE_DOT': env.get('DOT') and 'YES' or 'NO', + 'DOT_PATH': env.get('DOT') and os.path.split(env['DOT'])[0] or '', + 'OUTPUT_DIRECTORY': doc_top_dir, + 'WARN_LOGFILE': target[0].abspath + '-warning.log'} + values_dict.update( env['DOXYFILE_DICT'] ) + # Finally, output user dictionary values which override any of the previously set parameters. + for key, value in values_dict.iteritems(): + doxy_file.write ('%s = "%s"\n' % (key, str(value))) + finally: + doxy_file.close() + +def generate(env): + """ + Add builders and construction variables for the + Doxygen tool. + """ + ## Doxyfile builder + def doxyfile_message (target, source, env): + return "creating Doxygen config file '%s'" % target[0] + + doxyfile_variables = [ + 'DOXYFILE_DICT', + 'DOXYFILE_FILE' + ] + + #doxyfile_action = SCons.Action.Action( Doxyfile_Builder, doxyfile_message, + # doxyfile_variables ) + doxyfile_action = SCons.Action.Action( Doxyfile_Builder, doxyfile_message) + + doxyfile_builder = SCons.Builder.Builder( action = doxyfile_action, + emitter = Doxyfile_emitter ) + + env['BUILDERS']['Doxyfile'] = doxyfile_builder + env['DOXYFILE_DICT'] = {} + env['DOXYFILE_FILE'] = 'doxyfile.in' + + ## Doxygen builder + def Doxygen_emitter(target, source, env): + output_dir = str( source[0].dir ) + if str(target[0]) == str(source[0]): + target = env.File( os.path.join( output_dir, 'html', 'index.html' ) ) + return target, source + + doxygen_action = SCons.Action.Action( [ '$DOXYGEN_COM'] ) + doxygen_builder = SCons.Builder.Builder( action = doxygen_action, + emitter = Doxygen_emitter ) + env['BUILDERS']['Doxygen'] = doxygen_builder + env['DOXYGEN_COM'] = '$DOXYGEN $DOXYGEN_FLAGS $SOURCE' + env['DOXYGEN_FLAGS'] = '' + env['DOXYGEN'] = 'doxygen' + + dot_path = env.WhereIs("dot") + if dot_path: + env['DOT'] = dot_path + +def exists(env): + """ + Make sure doxygen exists. + """ + return env.Detect("doxygen") |