1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#!/usr/bin/python 2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)# Copyright 2014 The Chromium Authors. All rights reserved. 3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be 4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)# found in the LICENSE file. 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)"""Generates the contents of an Cronet LICENSE file for the third-party code. 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)It makes use of src/tools/licenses.py and the README.chromium files on which 9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)it depends. Based on android_webview/tools/webview_licenses.py. 10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)""" 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)import optparse 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)import os 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)import sys 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)import textwrap 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)REPOSITORY_ROOT = os.path.abspath(os.path.join( 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) os.path.dirname(__file__), '..', '..', '..')) 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)sys.path.append(os.path.join(REPOSITORY_ROOT, 'tools')) 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)import licenses 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)def _ReadFile(path): 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) """Reads a file from disk. 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Args: 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) path: The path of the file to read, relative to the root of the repository. 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Returns: 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) The contents of the file as a string. 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) """ 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return open(os.path.join(REPOSITORY_ROOT, path), 'rb').read() 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)def GenerateLicense(): 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) """Generates the contents of an Cronet LICENSE file for the third-party code. 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Returns: 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) The contents of the LICENSE file. 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) """ 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) # TODO(mef): Generate list of third_party libraries using checkdeps. 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) third_party_dirs = [ 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "libevent", 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "ashmem", 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "zlib", 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "modp_b64", 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "boringssl" 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ] 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) # Start with Chromium's LICENSE file 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content = [_ReadFile('LICENSE')] 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) # Add necessary third_party. 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for directory in sorted(third_party_dirs): 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) metadata = licenses.ParseDir("third_party/" + directory, REPOSITORY_ROOT, 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) require_license_file=True) 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content.append("-" * 20) 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content.append(directory) 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content.append("-" * 20) 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) license_file = metadata['License File'] 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if license_file and license_file != licenses.NOT_SHIPPED: 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content.append(_ReadFile(license_file)) 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return '\n'.join(content) 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)def main(): 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) class FormatterWithNewLines(optparse.IndentedHelpFormatter): 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) def format_description(self, description): 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) paras = description.split('\n') 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) formatted_paras = [textwrap.fill(para, self.width) for para in paras] 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return '\n'.join(formatted_paras) + '\n' 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) parser = optparse.OptionParser(formatter=FormatterWithNewLines(), 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) usage='%prog command [options]') 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) parser.description = (__doc__ + 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) '\nCommands:\n' \ 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ' license [filename]\n' \ 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ' Generate Cronet LICENSE to filename or stdout.\n') 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (_, args) = parser.parse_args() 78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if not args: 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) parser.print_help() 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 1 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if args[0] == 'license': 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if len(args) > 1: 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) print 'Saving license to %s' % args[1] 85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) f = open(args[1], "w") 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) try: 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) f.write(GenerateLicense()) 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) finally: 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) f.close() 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) else: 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) print GenerateLicense() 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 0 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) parser.print_help() 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 1 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)if __name__ == '__main__': 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) sys.exit(main()) 100