#!/usr/bin/env python3
#
# Copyright (C) 2018 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.
#
from __future__ import print_function
import argparse
import csv
import itertools
import os
import re
import sys
import vndk
def _parse_args():
"""Parse command line options."""
parser = argparse.ArgumentParser()
parser.add_argument('root_bp',
help='path to Android.bp in ANDROID_BUILD_TOP')
parser.add_argument('-o', '--output', help='path to output file')
parser.add_argument('--exclude',
help='regular expression for the excluded directories')
parser.add_argument('--select',
help='regular expression for the selected directories')
parser.add_argument('--namespace', action='append', default=[''],
help='extra module namespaces')
return parser.parse_args()
def print_vndk_module_csv(output_file, module_dicts, root_dir, exclude, select):
"""Print vndk module list to output file."""
all_libs = module_dicts.all_libs
vndk_libs = module_dicts.vndk_libs
vndk_sp_libs = module_dicts.vndk_sp_libs
vendor_available_libs = module_dicts.vendor_available_libs
module_names = sorted(set(
itertools.chain(vndk_libs, vndk_sp_libs, vendor_available_libs)))
root_dir_prefix_len = len(root_dir) + 1
writer = csv.writer(output_file, lineterminator='\n')
writer.writerow(('name', 'vndk', 'vndk_sp', 'vendor_available', 'rule'))
for name in module_names:
rule = all_libs[name].rule
path = all_libs[name].get_property('_path')[root_dir_prefix_len:]
if select and not select.match(path):
continue
if exclude and exclude.match(path):
continue
if '_header' not in rule and '_static' not in rule and \
rule != 'toolchain_library':
writer.writerow((name,
name in vndk_libs,
name in vndk_sp_libs,
name in vendor_available_libs,
rule))
def main():
"""Main function."""
args = _parse_args()
# Convert select/exclude regular expressions
select = re.compile(args.select) if args.select else None
exclude = re.compile(args.exclude) if args.exclude else None
# Parse Blueprint files and get VNDK libs
module_dicts = vndk.ModuleClassifier.create_from_root_bp(
args.root_bp, args.namespace)
root_dir = os.path.dirname(args.root_bp)
if args.output:
with open(args.output, 'w') as output_file:
print_vndk_module_csv(
output_file, module_dicts, root_dir, exclude, select)
else:
print_vndk_module_csv(
sys.stdout, module_dicts, root_dir, exclude, select)
if __name__ == '__main__':
main()