| #!/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() |