Index: native_client_sdk/src/build_tools/generate_notice.py |
diff --git a/native_client_sdk/src/build_tools/generate_notice.py b/native_client_sdk/src/build_tools/generate_notice.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..ffc376bcc8093495eede49c5225b9f5cd98c2d68 |
--- /dev/null |
+++ b/native_client_sdk/src/build_tools/generate_notice.py |
@@ -0,0 +1,90 @@ |
+#!/usr/bin/env python |
+# Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+"""Build the NOTICE file distributed with the NaCl SDK from a set of given |
+license files.""" |
+ |
+import optparse |
+import os |
+import sys |
+ |
+ |
+def Trace(msg): |
+ if Trace.verbose: |
+ print msg |
+ |
+Trace.verbose = False |
+ |
+ |
+def FindFiles(files): |
+ found = [f for f in files if os.path.exists(f)] |
+ |
+ if Trace.verbose: |
+ for f in sorted(set(files) - set(found)): |
+ Trace('Skipping %s. File doesn\'t exist.\n' % (f,)) |
+ |
+ return found |
+ |
+ |
+def CreateLicenseDict(files): |
+ # Many of the license files are duplicates. Create a map of license text to |
+ # filename. |
+ license_dict = {} |
+ for filename in files: |
+ license_text = open(filename).read() |
+ license_dict.setdefault(license_text, []).append(filename) |
+ |
+ # Flip the dictionary (map tuple of filenames -> license text). |
+ return dict((tuple(value), key) for key, value in license_dict.iteritems()) |
+ |
+ |
+def WriteLicense(output_file, root, license_text, license_filenames): |
+ Trace('Writing license for files:\n' + '\n'.join(license_filenames)) |
+ output_file.write('=' * 70 + '\n') |
+ for filename in sorted(license_filenames): |
+ filename = os.path.relpath(filename, root) |
+ license_dir = os.path.dirname(filename) |
+ if not license_dir: |
+ license_dir = 'native_client_sdk' |
+ |
+ output_file.write('%s is licensed as follows\n' % (license_dir,)) |
+ output_file.write(' (Cf. %s):\n' % (filename,)) |
+ output_file.write('=' * 70 + '\n') |
+ output_file.write(license_text) |
+ output_file.write('\n\n\n') |
+ |
+ |
+def Generate(output_filename, root, files): |
+ found_files = FindFiles(files) |
+ license_dict = CreateLicenseDict(found_files) |
+ with open(output_filename, 'w') as output_file: |
+ for license_filenames in sorted(license_dict.iterkeys()): |
+ license_text = license_dict[license_filenames] |
+ WriteLicense(output_file, root, license_text, license_filenames) |
+ |
+ |
+def main(args): |
+ parser = optparse.OptionParser() |
+ parser.add_option('-v', '--verbose', help='Verbose output.', |
+ action='store_true') |
+ parser.add_option('-o', '--output', help='Output file') |
+ parser.add_option('--root', help='Root for all paths') |
+ |
+ options, args = parser.parse_args(args) |
+ Trace.verbose = options.verbose |
+ |
+ if not options.output: |
+ parser.error('No output file given. See -o.') |
+ if not options.root: |
+ parser.error('No root directory given. See --root.') |
+ |
+ Generate(options.output, options.root, args) |
+ Trace('Done.') |
+ |
+ return 0 |
+ |
+ |
+if __name__ == '__main__': |
+ sys.exit(main(sys.argv[1:])) |