#!/usr/bin/env python
|
#
|
# Copyright (C) 2016 The Android Open Source Project
|
#
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
# you may not use this file except in compliance with the License.
|
# You may obtain a copy of the License at
|
#
|
# http://www.apache.org/licenses/LICENSE-2.0
|
#
|
# Unless required by applicable law or agreed to in writing, software
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
# See the License for the specific language governing permissions and
|
# limitations under the License.
|
|
"""Utility to verify modules link against acceptable module types"""
|
|
from __future__ import print_function
|
import argparse
|
import os
|
import sys
|
|
WARNING_MSG = ('\033[1m%(makefile)s: \033[35mwarning:\033[0m\033[1m '
|
'%(module)s (%(type)s) should not link to %(dep_name)s (%(dep_type)s)'
|
'\033[0m')
|
ERROR_MSG = ('\033[1m%(makefile)s: \033[31merror:\033[0m\033[1m '
|
'%(module)s (%(type)s) should not link to %(dep_name)s (%(dep_type)s)'
|
'\033[0m')
|
|
def parse_args():
|
"""Parse commandline arguments."""
|
parser = argparse.ArgumentParser(description='Check link types')
|
parser.add_argument('--makefile', help='Makefile defining module')
|
parser.add_argument('--module', help='The module being checked')
|
parser.add_argument('--type', help='The link type of module')
|
parser.add_argument('--allowed', help='Allow deps to use these types',
|
action='append', default=[], metavar='TYPE')
|
parser.add_argument('--warn', help='Warn if deps use these types',
|
action='append', default=[], metavar='TYPE')
|
parser.add_argument('deps', help='The dependencies to check',
|
metavar='DEP', nargs='*')
|
return parser.parse_args()
|
|
def print_msg(msg, args, dep_name, dep_type):
|
"""Print a warning or error message"""
|
print(msg % {
|
"makefile": args.makefile,
|
"module": args.module,
|
"type": args.type,
|
"dep_name": dep_name,
|
"dep_type": dep_type}, file=sys.stderr)
|
|
def main():
|
"""Program entry point."""
|
args = parse_args()
|
|
failed = False
|
for dep in args.deps:
|
dep_name = os.path.basename(os.path.dirname(dep))
|
if dep_name.endswith('_intermediates'):
|
dep_name = dep_name[:len(dep_name)-len('_intermediates')]
|
|
with open(dep, 'r') as dep_file:
|
dep_types = dep_file.read().strip().split(' ')
|
|
for dep_type in dep_types:
|
if dep_type in args.allowed:
|
continue
|
if dep_type in args.warn:
|
print_msg(WARNING_MSG, args, dep_name, dep_type)
|
else:
|
print_msg(ERROR_MSG, args, dep_name, dep_type)
|
failed = True
|
|
if failed:
|
sys.exit(1)
|
|
if __name__ == '__main__':
|
main()
|