diff options
author | sakal <sakal@webrtc.org> | 2017-09-05 00:16:15 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2017-09-05 07:16:15 +0000 |
commit | 67e414ce709446a3d6538bd9a4d027b698afa031 (patch) | |
tree | 45d8652b6479893cb1c4e20cc1bf9b187063d100 /tools_webrtc/libs | |
parent | 31377a2a103f040c3c4f0b1947d69657233c21a2 (diff) | |
download | webrtc-67e414ce709446a3d6538bd9a4d027b698afa031.tar.gz |
License generation script for build_aar.py.
The script is forked from: tools_webrtc/ios/generate_licenses.py
BUG=webrtc:8182
Review-Url: https://codereview.webrtc.org/3011613002
Cr-Commit-Position: refs/heads/master@{#19679}
Diffstat (limited to 'tools_webrtc/libs')
-rw-r--r-- | tools_webrtc/libs/__init__.py | 0 | ||||
-rwxr-xr-x | tools_webrtc/libs/generate_licenses.py | 153 | ||||
-rwxr-xr-x | tools_webrtc/libs/generate_licenses_test.py | 62 |
3 files changed, 215 insertions, 0 deletions
diff --git a/tools_webrtc/libs/__init__.py b/tools_webrtc/libs/__init__.py new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/tools_webrtc/libs/__init__.py diff --git a/tools_webrtc/libs/generate_licenses.py b/tools_webrtc/libs/generate_licenses.py new file mode 100755 index 0000000000..b9ca02fea0 --- /dev/null +++ b/tools_webrtc/libs/generate_licenses.py @@ -0,0 +1,153 @@ +#!/usr/bin/env python + +# Copyright 2016 The WebRTC project authors. All Rights Reserved. +# +# Use of this source code is governed by a BSD-style license +# that can be found in the LICENSE file in the root of the source +# tree. An additional intellectual property rights grant can be found +# in the file PATENTS. All contributing project authors may +# be found in the AUTHORS file in the root of the source tree. + +"""Generates license markdown for a prebuilt version of WebRTC.""" + +import sys + +import argparse +import cgi +import json +import logging +import os +import re +import subprocess + + +LIB_TO_LICENSES_DICT = { + 'android_tools': ['third_party/android_tools/LICENSE'], + 'boringssl': ['third_party/boringssl/src/LICENSE'], + 'expat': ['third_party/expat/files/COPYING'], + 'ijar': ['third_party/ijar/LICENSE'], + 'jsoncpp': ['third_party/jsoncpp/LICENSE'], + 'libc++': ['buildtools/third_party/libc++/trunk/LICENSE.TXT'], + 'libc++abi': ['buildtools/third_party/libc++abi/trunk/LICENSE.TXT'], + 'libevent': ['base/third_party/libevent/LICENSE'], + 'libjpeg_turbo': ['third_party/libjpeg_turbo/LICENSE.md'], + 'libsrtp': ['third_party/libsrtp/LICENSE'], + 'libvpx': ['third_party/libvpx/source/libvpx/LICENSE'], + 'libyuv': ['third_party/libyuv/LICENSE'], + 'openmax_dl': ['third_party/openmax_dl/LICENSE'], + 'opus': ['third_party/opus/src/COPYING'], + 'protobuf': ['third_party/protobuf/LICENSE'], + 'usrsctp': ['third_party/usrsctp/LICENSE'], + 'webrtc': ['webrtc/LICENSE', 'webrtc/LICENSE_THIRD_PARTY'], + + # Compile time dependencies, no license needed: + 'yasm': [], +} + +SCRIPT_DIR = os.path.dirname(os.path.realpath(sys.argv[0])) +CHECKOUT_ROOT = os.path.abspath(os.path.join(SCRIPT_DIR, os.pardir, os.pardir)) +WEBRTC_ROOT = os.path.join(CHECKOUT_ROOT, 'webrtc') +THIRD_PARTY_LIB_REGEX = r'^.*/third_party/([\w+]+).*$' + +class LicenseBuilder(object): + + def __init__(self, buildfile_dirs, targets): + self.buildfile_dirs = buildfile_dirs + self.targets = targets + + @staticmethod + def _ParseLibrary(dep): + """ + Returns a regex match containing library name after third_party + + Input one of: + //a/b/third_party/libname:c + //a/b/third_party/libname:c(//d/e/f:g) + //a/b/third_party/libname/c:d(//e/f/g:h) + + Outputs match with libname in group 1 or None if this is not a third_party + dependency. + """ + return re.match(THIRD_PARTY_LIB_REGEX, dep) + + @staticmethod + def _RunGN(buildfile_dir, target): + cmd = ['gn', 'desc', '--all', '--format=json', + os.path.abspath(buildfile_dir), target] + logging.debug("Running: %r", cmd) + output_json = subprocess.check_output(cmd, cwd=CHECKOUT_ROOT) + logging.debug("Output: %s", output_json) + return output_json + + @staticmethod + def _GetThirdPartyLibraries(buildfile_dir, target): + output = json.loads(LicenseBuilder._RunGN(buildfile_dir, target)) + libraries = set() + for target in output.values(): + third_party_matches = ( + LicenseBuilder._ParseLibrary(dep) for dep in target['deps']) + libraries |= set(match.group(1) for match in third_party_matches if match) + return libraries + + def GenerateLicenseText(self, output_dir): + # Get a list of third_party libs from gn. For fat libraries we must consider + # all architectures, hence the multiple buildfile directories. + third_party_libs = set() + for buildfile in self.buildfile_dirs: + for target in self.targets: + third_party_libs |= LicenseBuilder._GetThirdPartyLibraries( + buildfile, target) + assert len(third_party_libs) > 0 + + missing_licenses = third_party_libs - set(LIB_TO_LICENSES_DICT.keys()) + if missing_licenses: + error_msg = 'Missing licenses: %s' % ', '.join(missing_licenses) + logging.error(error_msg) + raise Exception(error_msg) + + # Put webrtc at the front of the list. + license_libs = sorted(third_party_libs) + license_libs.insert(0, 'webrtc') + + logging.info("List of licenses: %s", ', '.join(license_libs)) + + # Generate markdown. + output_license_file = open(os.path.join(output_dir, 'LICENSE.md'), 'w+') + for license_lib in license_libs: + if len(LIB_TO_LICENSES_DICT[license_lib]) == 0: + logging.info("Skipping compile time dependency: %s", license_lib) + continue # Compile time dependency + + output_license_file.write('# %s\n' % license_lib) + output_license_file.write('```\n') + for path in LIB_TO_LICENSES_DICT[license_lib]: + license_path = os.path.join(CHECKOUT_ROOT, path) + with open(license_path, 'r') as license_file: + license_text = cgi.escape(license_file.read(), quote=True) + output_license_file.write(license_text) + output_license_file.write('\n') + output_license_file.write('```\n\n') + + output_license_file.close() + + +def main(): + parser = argparse.ArgumentParser(description='Generate WebRTC LICENSE.md') + parser.add_argument('--verbose', action='store_true', default=False, + help='Debug logging.') + parser.add_argument('--target', required=True, action='append', default=[], + help='Name of the GN target to generate a license for') + parser.add_argument('output_dir', + help='Directory to output LICENSE.md to.') + parser.add_argument('buildfile_dirs', nargs="+", + help='Directories containing gn generated ninja files') + args = parser.parse_args() + + logging.basicConfig(level=logging.DEBUG if args.verbose else logging.INFO) + + builder = LicenseBuilder(args.buildfile_dirs, args.target) + builder.GenerateLicenseText(args.output_dir) + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/tools_webrtc/libs/generate_licenses_test.py b/tools_webrtc/libs/generate_licenses_test.py new file mode 100755 index 0000000000..9ac541adf9 --- /dev/null +++ b/tools_webrtc/libs/generate_licenses_test.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python +# pylint: disable=relative-import,protected-access,unused-argument + +# Copyright 2017 The WebRTC project authors. All Rights Reserved. +# +# Use of this source code is governed by a BSD-style license +# that can be found in the LICENSE file in the root of the source +# tree. An additional intellectual property rights grant can be found +# in the file PATENTS. All contributing project authors may +# be found in the AUTHORS file in the root of the source tree. + +import os +import sys + +SRC = os.path.abspath(os.path.join( + os.path.dirname((__file__)), os.pardir, os.pardir)) +sys.path.append(os.path.join(SRC, 'third_party', 'pymock')) + +import mock +import unittest + +from generate_licenses import LicenseBuilder + + +class TestLicenseBuilder(unittest.TestCase): + @staticmethod + def _FakeRunGN(buildfile_dir, target): + return """ + { + "target1": { + "deps": [ + "//a/b/third_party/libname1:c", + "//a/b/third_party/libname2:c(//d/e/f:g)", + "//a/b/third_party/libname3/c:d(//e/f/g:h)", + "//a/b/not_third_party/c" + ] + } + } + """ + + def testParseLibrary(self): + self.assertEquals(LicenseBuilder._ParseLibrary( + '//a/b/third_party/libname1:c').group(1), + 'libname1') + self.assertEquals(LicenseBuilder._ParseLibrary( + '//a/b/third_party/libname2:c(d)').group(1), + 'libname2') + self.assertEquals(LicenseBuilder._ParseLibrary( + '//a/b/third_party/libname3/c:d(e)').group(1), + 'libname3') + self.assertEquals(LicenseBuilder._ParseLibrary('//a/b/not_third_party/c'), + None) + + @mock.patch('generate_licenses.LicenseBuilder._RunGN', _FakeRunGN) + def testGetThirdPartyLibraries(self): + self.assertEquals(LicenseBuilder._GetThirdPartyLibraries( + 'out/arm', 'target1'), + set(['libname1', 'libname2', 'libname3'])) + + +if __name__ == '__main__': + unittest.main() |