1#!/usr/bin/env python3 2 3# Copyright (C) 2024 The Android Open Source Project 4# 5# Licensed under the Apache License, Version 2.0 (the "License"); 6# you may not use this file except in compliance with the License. 7# You may obtain a copy of the License at 8# 9# http://www.apache.org/licenses/LICENSE-2.0 10# 11# Unless required by applicable law or agreed to in writing, software 12# distributed under the License is distributed on an "AS IS" BASIS, 13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14# See the License for the specific language governing permissions and 15# limitations under the License. 16 17''' 18Lists all modules in the given directory or its decendant directories, as cached 19in module-info.json. If any build change is made, and it should be reflected in 20the output, you should run 'refreshmod' first. 21''' 22 23import sys 24sys.dont_write_bytecode = True 25 26import argparse 27import os 28 29import modinfo 30 31 32def main(): 33 parser = argparse.ArgumentParser(description=__doc__) 34 parser.add_argument('path') 35 parser.add_argument('--no-recurse', '-n', action='store_true', 36 help='Do not include modules defined in subdirs of path') 37 args = parser.parse_args() 38 should_recurse = not args.no_recurse 39 40 d = os.path.normpath(args.path) 41 # Fix absolute path to be relative to build top 42 if os.path.isabs(d): 43 base = os.environ.get('ANDROID_BUILD_TOP') 44 if base: 45 base = os.path.normpath(base) + os.path.sep 46 if d.startswith(base): 47 d = d[len(base):] 48 49 prefix = d + os.path.sep 50 51 module_info = modinfo.ReadModuleInfo() 52 53 results = set() 54 for m in module_info.values(): 55 for path in m.get('path', []): 56 if path == d or (should_recurse and path.startswith(prefix)): 57 name = m.get('module_name') 58 if name: 59 results.add(name) 60 61 for name in sorted(results): 62 print(name) 63 64if __name__ == "__main__": 65 main() 66