jsoncpp/scons-tools/doxygen.py
Baptiste Lepilleur 64e07e54ed - fixed SCons build on Windows: only build static library (support static/dynamic at the same time requires significant changes)
- renamed SCons glob tool to globtool to avoid clash with python glob module. This prevented running the tests.
- check target now works with SCons 1.x
2009-11-18 21:27:06 +00:00

117 lines
3.9 KiB
Python

# 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")