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