| import os | 
 | import os.path | 
 | from fnmatch import fnmatch | 
 | import targz | 
 |  | 
 | ##def DoxyfileParse(file_contents): | 
 | ##   """ | 
 | ##   Parse a Doxygen source file and return a dictionary of all the values. | 
 | ##   Values will be strings and lists of strings. | 
 | ##   """ | 
 | ##   data = {} | 
 | ## | 
 | ##   import shlex | 
 | ##   lex = shlex.shlex(instream = file_contents, posix = True) | 
 | ##   lex.wordchars += "*+./-:" | 
 | ##   lex.whitespace = lex.whitespace.replace("\n", "") | 
 | ##   lex.escape = "" | 
 | ## | 
 | ##   lineno = lex.lineno | 
 | ##   last_backslash_lineno = lineno | 
 | ##   token = lex.get_token() | 
 | ##   key = token   # the first token should be a key | 
 | ##   last_token = "" | 
 | ##   key_token = False | 
 | ##   next_key = False | 
 | ##   new_data = True | 
 | ## | 
 | ##   def append_data(data, key, new_data, token): | 
 | ##      if new_data or len(data[key]) == 0: | 
 | ##         data[key].append(token) | 
 | ##      else: | 
 | ##         data[key][-1] += token | 
 | ## | 
 | ##   while token: | 
 | ##      if token in ['\n']: | 
 | ##         if last_token not in ['\\']: | 
 | ##            key_token = True | 
 | ##      elif token in ['\\']: | 
 | ##         pass | 
 | ##      elif key_token: | 
 | ##         key = token | 
 | ##         key_token = False | 
 | ##      else: | 
 | ##         if token == "+=": | 
 | ##            if not data.has_key(key): | 
 | ##               data[key] = list() | 
 | ##         elif token == "=": | 
 | ##            data[key] = list() | 
 | ##         else: | 
 | ##            append_data( data, key, new_data, token ) | 
 | ##            new_data = True | 
 | ## | 
 | ##      last_token = token | 
 | ##      token = lex.get_token() | 
 | ##       | 
 | ##      if last_token == '\\' and token != '\n': | 
 | ##         new_data = False | 
 | ##         append_data( data, key, new_data, '\\' ) | 
 | ## | 
 | ##   # compress lists of len 1 into single strings | 
 | ##   for (k, v) in data.items(): | 
 | ##      if len(v) == 0: | 
 | ##         data.pop(k) | 
 | ## | 
 | ##      # items in the following list will be kept as lists and not converted to strings | 
 | ##      if k in ["INPUT", "FILE_PATTERNS", "EXCLUDE_PATTERNS"]: | 
 | ##         continue | 
 | ## | 
 | ##      if len(v) == 1: | 
 | ##         data[k] = v[0] | 
 | ## | 
 | ##   return data | 
 | ## | 
 | ##def DoxySourceScan(node, env, path): | 
 | ##   """ | 
 | ##   Doxygen Doxyfile source scanner.  This should scan the Doxygen file and add | 
 | ##   any files used to generate docs to the list of source files. | 
 | ##   """ | 
 | ##   default_file_patterns = [ | 
 | ##      '*.c', '*.cc', '*.cxx', '*.cpp', '*.c++', '*.java', '*.ii', '*.ixx', | 
 | ##      '*.ipp', '*.i++', '*.inl', '*.h', '*.hh ', '*.hxx', '*.hpp', '*.h++', | 
 | ##      '*.idl', '*.odl', '*.cs', '*.php', '*.php3', '*.inc', '*.m', '*.mm', | 
 | ##      '*.py', | 
 | ##   ] | 
 | ## | 
 | ##   default_exclude_patterns = [ | 
 | ##      '*~', | 
 | ##   ] | 
 | ## | 
 | ##   sources = [] | 
 | ## | 
 | ##   data = DoxyfileParse(node.get_contents()) | 
 | ## | 
 | ##   if data.get("RECURSIVE", "NO") == "YES": | 
 | ##      recursive = True | 
 | ##   else: | 
 | ##      recursive = False | 
 | ## | 
 | ##   file_patterns = data.get("FILE_PATTERNS", default_file_patterns) | 
 | ##   exclude_patterns = data.get("EXCLUDE_PATTERNS", default_exclude_patterns) | 
 | ## | 
 | ##   for node in data.get("INPUT", []): | 
 | ##      if os.path.isfile(node): | 
 | ##         sources.add(node) | 
 | ##      elif os.path.isdir(node): | 
 | ##         if recursive: | 
 | ##            for root, dirs, files in os.walk(node): | 
 | ##               for f in files: | 
 | ##                  filename = os.path.join(root, f) | 
 | ## | 
 | ##                  pattern_check = reduce(lambda x, y: x or bool(fnmatch(filename, y)), file_patterns, False) | 
 | ##                  exclude_check = reduce(lambda x, y: x and fnmatch(filename, y), exclude_patterns, True) | 
 | ## | 
 | ##                  if pattern_check and not exclude_check: | 
 | ##                     sources.append(filename) | 
 | ##         else: | 
 | ##            for pattern in file_patterns: | 
 | ##               sources.extend(glob.glob("/".join([node, pattern]))) | 
 | ##   sources = map( lambda path: env.File(path), sources ) | 
 | ##   return sources | 
 | ## | 
 | ## | 
 | ##def DoxySourceScanCheck(node, env): | 
 | ##   """Check if we should scan this file""" | 
 | ##   return os.path.isfile(node.path) | 
 |  | 
 | def srcDistEmitter(source, target, env): | 
 | ##   """Doxygen Doxyfile emitter""" | 
 | ##   # possible output formats and their default values and output locations | 
 | ##   output_formats = { | 
 | ##      "HTML": ("YES", "html"), | 
 | ##      "LATEX": ("YES", "latex"), | 
 | ##      "RTF": ("NO", "rtf"), | 
 | ##      "MAN": ("YES", "man"), | 
 | ##      "XML": ("NO", "xml"), | 
 | ##   } | 
 | ## | 
 | ##   data = DoxyfileParse(source[0].get_contents()) | 
 | ## | 
 | ##   targets = [] | 
 | ##   out_dir = data.get("OUTPUT_DIRECTORY", ".") | 
 | ## | 
 | ##   # add our output locations | 
 | ##   for (k, v) in output_formats.items(): | 
 | ##      if data.get("GENERATE_" + k, v[0]) == "YES": | 
 | ##         targets.append(env.Dir( os.path.join(out_dir, data.get(k + "_OUTPUT", v[1]))) ) | 
 | ## | 
 | ##   # don't clobber targets | 
 | ##   for node in targets: | 
 | ##      env.Precious(node) | 
 | ## | 
 | ##   # set up cleaning stuff | 
 | ##   for node in targets: | 
 | ##      env.Clean(node, node) | 
 | ## | 
 | ##   return (targets, source) | 
 |    return (target,source) | 
 |  | 
 | def generate(env): | 
 |    """ | 
 |    Add builders and construction variables for the | 
 |    SrcDist tool. | 
 |    """ | 
 | ##   doxyfile_scanner = env.Scanner( | 
 | ##      DoxySourceScan, | 
 | ##      "DoxySourceScan", | 
 | ##      scan_check = DoxySourceScanCheck, | 
 | ##   ) | 
 |  | 
 |    if targz.exists(env): | 
 |       srcdist_builder = targz.makeBuilder( srcDistEmitter ) | 
 |  | 
 |       env['BUILDERS']['SrcDist'] = srcdist_builder | 
 |  | 
 | def exists(env): | 
 |    """ | 
 |    Make sure srcdist exists. | 
 |    """ | 
 |    return targz.exists(env) |