diff options
author | 2022-03-17 18:39:36 -0700 | |
---|---|---|
committer | 2022-04-07 11:01:19 -0700 | |
commit | c21dc3c8c165bfd15f3c10eb9ce89666aaedd56f (patch) | |
tree | b737b5d3a94e48d29b705336124a588f2c6be2ff /tools/mk2bp_partition.py | |
parent | d3a9957616e03581f36581991f8fcb98d5a4c662 (diff) |
Make file list by partitions for all lunch targets
1. Filtered out the Android.mk file if the Make modules on them are
not in the PRODUCT_PACKAGES or the correspoding deps;
2. Merged the Android.mk file list by partitions for all lunch targets.
Bug: 225256154
Test: lunch aosp_coral-eng; m
out/target/product/coral/mk2bp_remaining.html
Test: python3 build/make/tools/mk2bp_partition.py
Change-Id: I40919e81ab3c6bd516379f0acd72932e8db50088
Diffstat (limited to 'tools/mk2bp_partition.py')
-rw-r--r-- | tools/mk2bp_partition.py | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/tools/mk2bp_partition.py b/tools/mk2bp_partition.py new file mode 100644 index 0000000000..30c1135969 --- /dev/null +++ b/tools/mk2bp_partition.py @@ -0,0 +1,100 @@ +#!/usr/bin/env python3 + +""" +The complete list of the remaining Make files in each partition for all lunch targets + +How to run? +python3 $(path-to-file)/mk2bp_partition.py +""" + +from pathlib import Path + +import csv +import datetime +import os +import shutil +import subprocess +import sys +import time + +def get_top(): + path = '.' + while not os.path.isfile(os.path.join(path, 'build/soong/soong_ui.bash')): + if os.path.abspath(path) == '/': + sys.exit('Could not find android source tree root.') + path = os.path.join(path, '..') + return os.path.abspath(path) + +# get the values of a build variable +def get_build_var(variable, product, build_variant): + """Returns the result of the shell command get_build_var.""" + env = { + **os.environ, + 'TARGET_PRODUCT': product if product else '', + 'TARGET_BUILD_VARIANT': build_variant if build_variant else '', + } + return subprocess.run([ + 'build/soong/soong_ui.bash', + '--dumpvar-mode', + variable + ], check=True, capture_output=True, env=env, text=True).stdout.strip() + +def get_make_file_partitions(): + lunch_targets = set(get_build_var("all_named_products", "", "").split()) + total_lunch_targets = len(lunch_targets) + makefile_by_partition = dict() + partitions = set() + current_count = 0 + start_time = time.time() + # cannot run command `m lunch_target` + broken_targets = {"mainline_sdk", "ndk"} + for lunch_target in sorted(lunch_targets): + current_count += 1 + current_time = time.time() + print (current_count, "/", total_lunch_targets, lunch_target, datetime.timedelta(seconds=current_time - start_time)) + if lunch_target in broken_targets: + continue + installed_product_out = get_build_var("PRODUCT_OUT", lunch_target, "userdebug") + filename = os.path.join(installed_product_out, "mk2bp_remaining.csv") + copy_filename = os.path.join(installed_product_out, lunch_target + "_mk2bp_remaining.csv") + # only generate if not exists + if not os.path.exists(copy_filename): + bash_cmd = "bash build/soong/soong_ui.bash --make-mode TARGET_PRODUCT=" + lunch_target + bash_cmd += " TARGET_BUILD_VARIANT=userdebug " + filename + subprocess.run(bash_cmd, shell=True, text=True, check=True, stdout=subprocess.DEVNULL) + # generate a copied .csv file, to avoid possible overwritings + with open(copy_filename, "w") as file: + shutil.copyfile(filename, copy_filename) + + # open mk2bp_remaining.csv file + with open(copy_filename, "r") as csvfile: + reader = csv.reader(csvfile, delimiter=",", quotechar='"') + # bypass the header row + next(reader, None) + for row in reader: + # read partition information + partition = row[2] + makefile_by_partition.setdefault(partition, set()).add(row[0]) + partitions.add(partition) + + # write merged make file list for each partition into a csv file + installed_path = Path(installed_product_out).parents[0].as_posix() + csv_path = installed_path + "/mk2bp_partition.csv" + with open(csv_path, "wt") as csvfile: + writer = csv.writer(csvfile, delimiter=",") + count_makefile = 0 + for partition in sorted(partitions): + number_file = len(makefile_by_partition[partition]) + count_makefile += number_file + writer.writerow([partition, number_file]) + for makefile in sorted(makefile_by_partition[partition]): + writer.writerow([makefile]) + row = ["The total count of make files is ", count_makefile] + writer.writerow(row) + +def main(): + os.chdir(get_top()) + get_make_file_partitions() + +if __name__ == "__main__": + main() |