74 lines
2.1 KiB
Python
74 lines
2.1 KiB
Python
|
#!/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.match(full_path, ignore_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()
|
||
|
|
||
|
GenerateIncludeCPP(args[0], args[1:], options.ignore.split())
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
main()
|