| #!/usr/bin/python | 
 |  | 
 | ''' | 
 | Copyright 2014 Google Inc. | 
 |  | 
 | Use of this source code is governed by a BSD-style license that can be | 
 | found in the LICENSE file. | 
 | ''' | 
 |  | 
 | import os | 
 | import optparse | 
 | import posixpath | 
 | import re | 
 |  | 
 |  | 
 | def is_ignored(full_path, ignore_list): | 
 |   for ignore_path in ignore_list: | 
 |     if re.search(ignore_path, full_path, re.I): | 
 |       return True | 
 |   return False | 
 |  | 
 |  | 
 | def find_header_files(include_dirs, ignore_list): | 
 |   """Return a list of all '.h' files in top_dir. | 
 |  | 
 |   Args: | 
 |       include_dirs: Paths to the directories within which to recursively search | 
 |           for files ending in '.h' | 
 |       ignore_list: Paths to both files and directories that are to be excluded | 
 |           from the search for headers | 
 |  | 
 |   Returns: | 
 |       A list of all the files inside include_dirs that end in '.h', relative to | 
 |           their respective include_dir that are not explicitly ignored. | 
 |   """ | 
 |   headers = [] | 
 |   for top_dir in include_dirs: | 
 |     for filename in os.listdir(top_dir): | 
 |       full_path = posixpath.join(top_dir, filename) | 
 |       if is_ignored(full_path, ignore_list): | 
 |         continue | 
 |       elif os.path.isdir(full_path): | 
 |         nested_headers = find_header_files([full_path], ignore_list) | 
 |         for nested_header in nested_headers: | 
 |           headers.append(os.path.join(filename, nested_header)) | 
 |       elif filename.endswith('.h'): | 
 |         headers.append(filename) | 
 |   return headers | 
 |  | 
 |  | 
 | def GenerateIncludeCPP(output_file, include_dirs, ignore_list): | 
 |   headers = find_header_files(include_dirs, ignore_list) | 
 |  | 
 |   # Emit resulting source file. | 
 |   with open(os.path.join(os.getcwd(), output_file), "w+") as output: | 
 |     for header in headers: | 
 |       output.write("#include <%s>\n" % header) | 
 |  | 
 |  | 
 | def main(): | 
 |   parser = optparse.OptionParser() | 
 |   parser.add_option("--ignore", action="store", type="string", dest="ignore", | 
 |                     help="file to write the processed sources array to.") | 
 |   parser.set_usage("""generate_include_cpp out.cpp include_dir | 
 |       out.cpp: C++ code to be generated. | 
 |       include_dirs: directories to traverse for include files""") | 
 |   (options, args) = parser.parse_args() | 
 |  | 
 |   # The MSVS gyp generator uses windows path separators so we intercept those | 
 |   # strings and normalize them to our expected posix representation | 
 |   include_dirs = [] | 
 |   for include_dir in args[1:]: | 
 |     include_dirs.append(include_dir.replace("\\", "/")) | 
 |   ignore_list = options.ignore.replace("\\", "/") | 
 |  | 
 |   # We can strip off the relative portion of the path to ensure that when we | 
 |   # compare for regex matches we don't fail based on relative path depth | 
 |   ignore_list = ignore_list.replace("../", "") | 
 |  | 
 |   GenerateIncludeCPP(args[0], include_dirs, ignore_list.split()) | 
 |  | 
 |  | 
 | if __name__ == "__main__": | 
 |   main() |