Home | History | Annotate | Download | only in scons-tools
      1 import os
      2 import os.path
      3 from fnmatch import fnmatch
      4 import targz
      5 
      6 ##def DoxyfileParse(file_contents):
      7 ##   """
      8 ##   Parse a Doxygen source file and return a dictionary of all the values.
      9 ##   Values will be strings and lists of strings.
     10 ##   """
     11 ##   data = {}
     12 ##
     13 ##   import shlex
     14 ##   lex = shlex.shlex(instream = file_contents, posix = True)
     15 ##   lex.wordchars += "*+./-:"
     16 ##   lex.whitespace = lex.whitespace.replace("\n", "")
     17 ##   lex.escape = ""
     18 ##
     19 ##   lineno = lex.lineno
     20 ##   last_backslash_lineno = lineno
     21 ##   token = lex.get_token()
     22 ##   key = token   # the first token should be a key
     23 ##   last_token = ""
     24 ##   key_token = False
     25 ##   next_key = False
     26 ##   new_data = True
     27 ##
     28 ##   def append_data(data, key, new_data, token):
     29 ##      if new_data or len(data[key]) == 0:
     30 ##         data[key].append(token)
     31 ##      else:
     32 ##         data[key][-1] += token
     33 ##
     34 ##   while token:
     35 ##      if token in ['\n']:
     36 ##         if last_token not in ['\\']:
     37 ##            key_token = True
     38 ##      elif token in ['\\']:
     39 ##         pass
     40 ##      elif key_token:
     41 ##         key = token
     42 ##         key_token = False
     43 ##      else:
     44 ##         if token == "+=":
     45 ##            if not data.has_key(key):
     46 ##               data[key] = list()
     47 ##         elif token == "=":
     48 ##            data[key] = list()
     49 ##         else:
     50 ##            append_data( data, key, new_data, token )
     51 ##            new_data = True
     52 ##
     53 ##      last_token = token
     54 ##      token = lex.get_token()
     55 ##      
     56 ##      if last_token == '\\' and token != '\n':
     57 ##         new_data = False
     58 ##         append_data( data, key, new_data, '\\' )
     59 ##
     60 ##   # compress lists of len 1 into single strings
     61 ##   for (k, v) in data.items():
     62 ##      if len(v) == 0:
     63 ##         data.pop(k)
     64 ##
     65 ##      # items in the following list will be kept as lists and not converted to strings
     66 ##      if k in ["INPUT", "FILE_PATTERNS", "EXCLUDE_PATTERNS"]:
     67 ##         continue
     68 ##
     69 ##      if len(v) == 1:
     70 ##         data[k] = v[0]
     71 ##
     72 ##   return data
     73 ##
     74 ##def DoxySourceScan(node, env, path):
     75 ##   """
     76 ##   Doxygen Doxyfile source scanner.  This should scan the Doxygen file and add
     77 ##   any files used to generate docs to the list of source files.
     78 ##   """
     79 ##   default_file_patterns = [
     80 ##      '*.c', '*.cc', '*.cxx', '*.cpp', '*.c++', '*.java', '*.ii', '*.ixx',
     81 ##      '*.ipp', '*.i++', '*.inl', '*.h', '*.hh ', '*.hxx', '*.hpp', '*.h++',
     82 ##      '*.idl', '*.odl', '*.cs', '*.php', '*.php3', '*.inc', '*.m', '*.mm',
     83 ##      '*.py',
     84 ##   ]
     85 ##
     86 ##   default_exclude_patterns = [
     87 ##      '*~',
     88 ##   ]
     89 ##
     90 ##   sources = []
     91 ##
     92 ##   data = DoxyfileParse(node.get_contents())
     93 ##
     94 ##   if data.get("RECURSIVE", "NO") == "YES":
     95 ##      recursive = True
     96 ##   else:
     97 ##      recursive = False
     98 ##
     99 ##   file_patterns = data.get("FILE_PATTERNS", default_file_patterns)
    100 ##   exclude_patterns = data.get("EXCLUDE_PATTERNS", default_exclude_patterns)
    101 ##
    102 ##   for node in data.get("INPUT", []):
    103 ##      if os.path.isfile(node):
    104 ##         sources.add(node)
    105 ##      elif os.path.isdir(node):
    106 ##         if recursive:
    107 ##            for root, dirs, files in os.walk(node):
    108 ##               for f in files:
    109 ##                  filename = os.path.join(root, f)
    110 ##
    111 ##                  pattern_check = reduce(lambda x, y: x or bool(fnmatch(filename, y)), file_patterns, False)
    112 ##                  exclude_check = reduce(lambda x, y: x and fnmatch(filename, y), exclude_patterns, True)
    113 ##
    114 ##                  if pattern_check and not exclude_check:
    115 ##                     sources.append(filename)
    116 ##         else:
    117 ##            for pattern in file_patterns:
    118 ##               sources.extend(glob.glob("/".join([node, pattern])))
    119 ##   sources = map( lambda path: env.File(path), sources )
    120 ##   return sources
    121 ##
    122 ##
    123 ##def DoxySourceScanCheck(node, env):
    124 ##   """Check if we should scan this file"""
    125 ##   return os.path.isfile(node.path)
    126 
    127 def srcDistEmitter(source, target, env):
    128 ##   """Doxygen Doxyfile emitter"""
    129 ##   # possible output formats and their default values and output locations
    130 ##   output_formats = {
    131 ##      "HTML": ("YES", "html"),
    132 ##      "LATEX": ("YES", "latex"),
    133 ##      "RTF": ("NO", "rtf"),
    134 ##      "MAN": ("YES", "man"),
    135 ##      "XML": ("NO", "xml"),
    136 ##   }
    137 ##
    138 ##   data = DoxyfileParse(source[0].get_contents())
    139 ##
    140 ##   targets = []
    141 ##   out_dir = data.get("OUTPUT_DIRECTORY", ".")
    142 ##
    143 ##   # add our output locations
    144 ##   for (k, v) in output_formats.items():
    145 ##      if data.get("GENERATE_" + k, v[0]) == "YES":
    146 ##         targets.append(env.Dir( os.path.join(out_dir, data.get(k + "_OUTPUT", v[1]))) )
    147 ##
    148 ##   # don't clobber targets
    149 ##   for node in targets:
    150 ##      env.Precious(node)
    151 ##
    152 ##   # set up cleaning stuff
    153 ##   for node in targets:
    154 ##      env.Clean(node, node)
    155 ##
    156 ##   return (targets, source)
    157    return (target,source)
    158 
    159 def generate(env):
    160    """
    161    Add builders and construction variables for the
    162    SrcDist tool.
    163    """
    164 ##   doxyfile_scanner = env.Scanner(
    165 ##      DoxySourceScan,
    166 ##      "DoxySourceScan",
    167 ##      scan_check = DoxySourceScanCheck,
    168 ##   )
    169 
    170    if targz.exists(env):
    171       srcdist_builder = targz.makeBuilder( srcDistEmitter )
    172 
    173       env['BUILDERS']['SrcDist'] = srcdist_builder
    174 
    175 def exists(env):
    176    """
    177    Make sure srcdist exists.
    178    """
    179    return targz.exists(env)
    180