File: check_link_type.py

package info (click to toggle)
android-platform-build 1%3A8.1.0%2Br23-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 8,620 kB
  • sloc: python: 12,074; cpp: 6,068; cs: 5,512; makefile: 2,356; sh: 1,829; java: 1,359; ansic: 987
file content (80 lines) | stat: -rwxr-xr-x 2,922 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#!/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()