Index: build/config/merge_for_jumbo.py |
diff --git a/build/config/merge_for_jumbo.py b/build/config/merge_for_jumbo.py |
index f6eb87dce72d09070b96b9288c0f379ccb043e0f..b3146ba11865bcf9686d588f7380603f3aa56995 100755 |
--- a/build/config/merge_for_jumbo.py |
+++ b/build/config/merge_for_jumbo.py |
@@ -12,6 +12,38 @@ for compiling. |
from __future__ import print_function |
import argparse |
+import cStringIO |
+import os |
+ |
+ |
+def write_jumbo_files(inputs, outputs, written_input_set, written_output_set): |
+ output_count = len(outputs) |
+ input_count = len(inputs) |
+ |
+ written_inputs = 0 |
+ for output_index, output_file in enumerate(outputs): |
+ written_output_set.add(output_file) |
+ if os.path.isfile(output_file): |
+ with open(output_file, "r") as current: |
+ current_jumbo_file = current.read() |
+ else: |
+ current_jumbo_file = None |
+ |
+ out = cStringIO.StringIO() |
+ out.write("/* This is a Jumbo file. Don't edit. */\n\n") |
+ out.write("/* Generated with merge_for_jumbo.py. */\n\n") |
+ input_limit = (output_index + 1) * input_count / output_count |
+ while written_inputs < input_limit: |
+ filename = inputs[written_inputs] |
+ written_inputs += 1 |
+ out.write("#include \"%s\"\n" % filename) |
+ written_input_set.add(filename) |
+ new_jumbo_file = out.getvalue() |
+ out.close() |
+ |
+ if new_jumbo_file != current_jumbo_file: |
+ with open(output_file, "w") as out: |
+ out.write(new_jumbo_file) |
def main(): |
@@ -22,41 +54,39 @@ def main(): |
parser.add_argument("--verbose", action="store_true") |
args = parser.parse_args() |
- output_count = len(args.outputs) |
- |
lines = [] |
# If written with gn |write_file| each file is on its own line. |
with open(args.file_list) as file_list_file: |
lines = [line.strip() for line in file_list_file if line.strip()] |
# If written with gn |response_file_contents| the files are space separated. |
- inputs = [] |
+ all_inputs = [] |
for line in lines: |
- inputs.extend(line.split()) |
- input_count = len(inputs) |
+ all_inputs.extend(line.split()) |
- written_inputs = 0 |
- for output_index, output_file in enumerate(args.outputs): |
- # TODO: Check if the file is right already and then do not update it. |
- with open(output_file, "w") as out: |
- out.write("/* This is a Jumbo file. Don't edit. */\n\n") |
- out.write("/* Generated with merge_for_jumbo.py. */\n\n") |
- input_limit = (output_index + 1) * input_count / output_count |
- while written_inputs < input_limit: |
- filename = inputs[written_inputs] |
- written_inputs += 1 |
- # The source list includes headers which should not be |
- # compiled, and Objective C files which will be special cased |
- # later since they will not compile correctly if included in a |
- # C++ file. We will just skip them here for now. |
- if filename.endswith((".h", ".mm")): |
- continue |
- |
- out.write("#include \"%s\"\n" % filename) |
+ written_output_set = set() # Just for double checking |
+ written_input_set = set() # Just for double checking |
+ for language_ext in (".cc", ".c", ".mm"): |
+ if language_ext == ".cc": |
+ ext_pattern = (".cc", ".cpp") |
+ else: |
+ ext_pattern = tuple([language_ext]) |
+ |
+ outputs = [x for x in args.outputs if x.endswith(ext_pattern)] |
+ inputs = [x for x in all_inputs if x.endswith(ext_pattern)] |
+ |
+ if not outputs: |
+ assert not inputs |
+ continue |
+ |
+ write_jumbo_files(inputs, outputs, written_input_set, written_output_set) |
+ header_files = set([x for x in all_inputs if x.endswith(".h")]) |
+ assert set(args.outputs) == written_output_set, "Did not fill all outputs" |
+ files_not_included = set(all_inputs) - written_input_set - header_files |
+ assert not files_not_included, "Did not include files: " + files_not_included |
if args.verbose: |
- print("Generated %s (%d files) based on %s" % (str(args.outputs), |
- written_inputs, |
- args.file_list)) |
+ print("Generated %s (%d files) based on %s" % ( |
+ str(args.outputs), len(written_input_set), args.file_list)) |
if __name__ == "__main__": |
- main() |
+ main() |