Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(91)

Side by Side Diff: tools_webrtc/generate_licenses.py

Issue 3011613002: License generation script for build_aar.py. (Closed)
Patch Set: License generation script for build_aar.py Created 3 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 #!/usr/bin/python 1 #!/usr/bin/env python
2 2
3 # Copyright 2016 The WebRTC project authors. All Rights Reserved. 3 # Copyright 2016 The WebRTC project authors. All Rights Reserved.
4 # 4 #
5 # Use of this source code is governed by a BSD-style license 5 # Use of this source code is governed by a BSD-style license
6 # that can be found in the LICENSE file in the root of the source 6 # that can be found in the LICENSE file in the root of the source
7 # tree. An additional intellectual property rights grant can be found 7 # tree. An additional intellectual property rights grant can be found
8 # in the file PATENTS. All contributing project authors may 8 # in the file PATENTS. All contributing project authors may
9 # be found in the AUTHORS file in the root of the source tree. 9 # be found in the AUTHORS file in the root of the source tree.
10 10
11 """Generates license HTML for a prebuilt version of WebRTC for iOS.""" 11 """Generates license markdown for a prebuilt version of WebRTC."""
12 12
13 import sys 13 import sys
14 14
15 import argparse 15 import argparse
16 import cgi 16 import cgi
17 import os 17 import os
18 import re 18 import re
19 import textwrap
20 import subprocess 19 import subprocess
21 20
22 21
23 LIB_TO_LICENSES_DICT = { 22 LIB_TO_LICENSES_DICT = {
23 'android_tools': ['third_party/android_tools/LICENSE'],
24 'boringssl': ['third_party/boringssl/src/LICENSE'], 24 'boringssl': ['third_party/boringssl/src/LICENSE'],
25 'expat': ['third_party/expat/files/COPYING'], 25 'expat': ['third_party/expat/files/COPYING'],
26 'ijar': ['third_party/ijar/LICENSE'],
26 'jsoncpp': ['third_party/jsoncpp/LICENSE'], 27 'jsoncpp': ['third_party/jsoncpp/LICENSE'],
28 'libc++': ['buildtools/third_party/libc++/trunk/LICENSE.TXT'],
29 'libc++abi': ['buildtools/third_party/libc++abi/trunk/LICENSE.TXT'],
30 'libevent': ['base/third_party/libevent/LICENSE'],
31 'libjpeg_turbo': ['third_party/libjpeg_turbo/LICENSE.md'],
32 'libsrtp': ['third_party/libsrtp/LICENSE'],
33 'libvpx': ['third_party/libvpx/source/libvpx/LICENSE'],
34 'libyuv': ['third_party/libyuv/LICENSE'],
35 'openmax_dl': ['third_party/openmax_dl/LICENSE'],
27 'opus': ['third_party/opus/src/COPYING'], 36 'opus': ['third_party/opus/src/COPYING'],
37 'ow2_asm': ['third_party/ow2_asm/LICENSE'],
kjellander_webrtc 2017/08/31 09:45:21 AFAIK this is only used by tests, so it shouldn't
sakal 2017/08/31 14:26:58 I modified build_aar.py to not include test target
28 'protobuf': ['third_party/protobuf/LICENSE'], 38 'protobuf': ['third_party/protobuf/LICENSE'],
29 'libsrtp': ['third_party/libsrtp/LICENSE'],
30 'usrsctp': ['third_party/usrsctp/LICENSE'], 39 'usrsctp': ['third_party/usrsctp/LICENSE'],
31 'webrtc': ['webrtc/LICENSE', 'webrtc/LICENSE_THIRD_PARTY'], 40 'webrtc': ['webrtc/LICENSE', 'webrtc/LICENSE_THIRD_PARTY'],
32 'libvpx': ['third_party/libvpx/source/libvpx/LICENSE'],
33 'libyuv': ['third_party/libyuv/LICENSE'],
34 } 41 }
35 42
36 SCRIPT_DIR = os.path.dirname(os.path.realpath(sys.argv[0])) 43 SCRIPT_DIR = os.path.dirname(os.path.realpath(sys.argv[0]))
37 CHECKOUT_ROOT = os.path.abspath(os.path.join(SCRIPT_DIR, os.pardir, os.pardir)) 44 CHECKOUT_ROOT = os.path.abspath(os.path.join(SCRIPT_DIR, os.pardir, os.pardir))
38 WEBRTC_ROOT = os.path.join(CHECKOUT_ROOT, 'webrtc') 45 WEBRTC_ROOT = os.path.join(CHECKOUT_ROOT, 'webrtc')
46 THIRD_PARTY_DEP_REGEX = r'^\s*//.*third_party/([^:/]+).*$'
39 47
40 48
41 def GetThirdPartyLibraries(buildfile_dir, target_name): 49 def GetThirdPartyLibraries(buildfile_dir, target_name):
42 def ExtractLibName(string_list):
43 # Sample input:
44 # [" //third_party/usrsctp:usrsctp", " //webrtc:webrtc_common"]
45 # Sample output:
46 # ["usrsctp"]
47 return re.sub(r'\(.*\)', '', string_list).strip().split(
48 os.path.sep)[-1].split(':')[0]
49 output = subprocess.check_output( 50 output = subprocess.check_output(
50 ["gn", "desc", buildfile_dir, target_name, '--all']) .split(os.linesep) 51 ["gn", "desc", buildfile_dir, target_name, '--all']) .split(os.linesep)
51 return [ExtractLibName(x) for x in output if re.search(r'third_party', x)] 52 matches = [re.match(THIRD_PARTY_DEP_REGEX, line) for line in output]
53 libraries = [match.group(1) for match in matches if match] # Filter out Nones
54 return libraries
52 55
53 56
54 class LicenseBuilder(object): 57 class LicenseBuilder(object):
55 58
56 def __init__(self, buildfile_dirs, target_name): 59 def __init__(self, buildfile_dirs, targets):
57 self.buildfile_dirs = buildfile_dirs 60 self.buildfile_dirs = buildfile_dirs
58 self.target_name = target_name 61 self.targets = targets
59 62
60 def GenerateLicenseText(self, output_dir): 63 def GenerateLicenseText(self, output_dir):
61 # Get a list of third_party libs from gn. For fat libraries we must consider 64 # Get a list of third_party libs from gn. For fat libraries we must consider
62 # all architectures, hence the multiple buildfile directories. 65 # all architectures, hence the multiple buildfile directories.
63 # The `sum` function flattens the 2d list. 66 # The `sum` function flattens the 2d list.
64 third_party_libs = sum([GetThirdPartyLibraries(buildfile, self.target_name) 67 third_party_libs = sum((
65 for buildfile in self.buildfile_dirs], []) 68 sum((GetThirdPartyLibraries(buildfile, target)
69 for buildfile in self.buildfile_dirs), [])
70 for target in self.targets), [])
66 assert len(third_party_libs) > 0 71 assert len(third_party_libs) > 0
67 72
68 # Generate amalgamated list of libraries. Will exit with error if a 73 # Generate amalgamated list of libraries. Will exit with error if a
69 # lib is unrecognized. 74 # lib is unrecognized.
70 license_libs = set() 75 license_libs = set()
71 for static_lib in third_party_libs: 76 for static_lib in third_party_libs:
72 license_path = LIB_TO_LICENSES_DICT.get(static_lib) 77 license_path = LIB_TO_LICENSES_DICT.get(static_lib)
73 if static_lib == 'yasm': 78 if static_lib == 'yasm':
74 # yasm is a build-time dep only, and doesn't need a license. 79 # yasm is a build-time dep only, and doesn't need a license.
75 continue 80 continue
76 if license_path is None: 81 if license_path is None:
77 print 'Missing license path for lib: %s' % static_lib 82 print 'Missing license path for lib: %s' % static_lib
78 return 1 83 return 1
79 license_libs.add(static_lib) 84 license_libs.add(static_lib)
80 85
81 # Put webrtc at the front of the list. 86 # Put webrtc at the front of the list.
82 license_libs = sorted(license_libs) 87 license_libs = sorted(license_libs)
83 license_libs.insert(0, 'webrtc') 88 license_libs.insert(0, 'webrtc')
84 89
85 # Generate HTML. 90 # Generate markdown.
86 output_license_file = open(os.path.join(output_dir, 'LICENSE.html'), 'w+') 91 output_license_file = open(os.path.join(output_dir, 'LICENSE.md'), 'w+')
87 output_license_file.write('<!DOCTYPE html>\n')
88 output_license_file.write('<html>\n<head>\n')
89 output_license_file.write('<meta charset="UTF-8">\n')
90 output_license_file.write('<title>Licenses</title>\n')
91 style_tag = textwrap.dedent('''\
92 <style>
93 body { margin: 0; font-family: sans-serif; }
94 pre { background-color: #eeeeee; padding: 1em; white-space: pre-wrap; }
95 p { margin: 1em; white-space: nowrap; }
96 </style>
97 ''')
98 output_license_file.write(style_tag)
99 output_license_file.write('</head>\n')
100
101 for license_lib in license_libs: 92 for license_lib in license_libs:
102 output_license_file.write('<p>%s<br/></p>\n' % license_lib) 93 output_license_file.write('# %s\n' % license_lib)
103 output_license_file.write('<pre>\n') 94 output_license_file.write('```\n')
104 for path in LIB_TO_LICENSES_DICT[license_lib]: 95 for path in LIB_TO_LICENSES_DICT[license_lib]:
105 license_path = os.path.join(CHECKOUT_ROOT, path) 96 license_path = os.path.join(CHECKOUT_ROOT, path)
106 with open(license_path, 'r') as license_file: 97 with open(license_path, 'r') as license_file:
107 license_text = cgi.escape(license_file.read(), quote=True) 98 license_text = cgi.escape(license_file.read(), quote=True)
108 output_license_file.write(license_text) 99 output_license_file.write(license_text)
109 output_license_file.write('\n') 100 output_license_file.write('\n')
110 output_license_file.write('</pre>\n') 101 output_license_file.write('```\n\n')
111 102
112 output_license_file.write('</body>\n')
113 output_license_file.write('</html>')
114 output_license_file.close() 103 output_license_file.close()
115 return 0 104 return 0
116 105
117 106
118 def main(): 107 def main():
119 parser = argparse.ArgumentParser(description='Generate WebRTC LICENSE.html') 108 parser = argparse.ArgumentParser(description='Generate WebRTC LICENSE.md')
120 parser.add_argument('target_name', 109 parser.add_argument('--target', required=True, action='append', default=[],
121 help='Name of the GN target to generate a license for') 110 help='Name of the GN target to generate a license for')
122 parser.add_argument('output_dir', 111 parser.add_argument('output_dir',
123 help='Directory to output LICENSE.html to.') 112 help='Directory to output LICENSE.md to.')
124 parser.add_argument('buildfile_dirs', nargs="+", 113 parser.add_argument('buildfile_dirs', nargs="+",
125 help='Directories containing gn generated ninja files') 114 help='Directories containing gn generated ninja files')
126 args = parser.parse_args() 115 args = parser.parse_args()
127 builder = LicenseBuilder(args.buildfile_dirs, args.target_name) 116 builder = LicenseBuilder(args.buildfile_dirs, args.target)
128 sys.exit(builder.GenerateLicenseText(args.output_dir)) 117 sys.exit(builder.GenerateLicenseText(args.output_dir))
129 118
130 119
131 if __name__ == '__main__': 120 if __name__ == '__main__':
132 main() 121 main()
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698