diff --git a/hb/resolver/indep_build_args_resolver.py b/hb/resolver/indep_build_args_resolver.py index 11c927ccab90e15061e240f17d1b1e60e76aff7f..3aa412ced7eeb024d45ab55206ec54400ff7fb75 100644 --- a/hb/resolver/indep_build_args_resolver.py +++ b/hb/resolver/indep_build_args_resolver.py @@ -156,9 +156,11 @@ class IndepBuildArgsResolver(ArgsResolverInterface): if target_arg.arg_value: build_executor.regist_flag('defaultDeps', ComponentUtil.get_default_deps(target_arg.arg_value, True if '-t' in sys.argv else False)) + build_executor.regist_flag('productComponents', ComponentUtil.get_product_component_path(target_arg.arg_value)) arg_value = target_arg.arg_value else: build_executor.regist_flag('defaultDeps', ComponentUtil.get_default_deps("argDefault")) + build_executor.regist_flag('productComponents', ComponentUtil.get_product_component_path("default")) args_dict = Arg.read_args_file(ModuleType.ENV) arg_value = args_dict.get("variant").get("argDefault") diff --git a/hb/services/prebuilts.py b/hb/services/prebuilts.py index 3347f720ac71ead341c4d58aebc2165e03a3013c..fccc035eb17bc9c82d13149c8a6f18915ad8ab3c 100644 --- a/hb/services/prebuilts.py +++ b/hb/services/prebuilts.py @@ -25,13 +25,13 @@ from util.log_util import LogUtil import os import json import time +from resources.global_var import CURRENT_OHOS_ROOT class PreuiltsService(BuildFileGeneratorInterface): def __init__(self): - ohos_dir = self.get_ohos_dir() - self.last_update = os.path.join(ohos_dir, "prebuilts/.local_data/last_update.json") + self.last_update = os.path.join(CURRENT_OHOS_ROOT, "prebuilts/.local_data/last_update.json") super().__init__() def run(self): @@ -99,26 +99,16 @@ class PreuiltsService(BuildFileGeneratorInterface): except Exception as e: LogUtil.hb_error(f"Failed to write last update file: {e}") - def get_ohos_dir(self): - cur_dir = os.getcwd() - while cur_dir != "/": - global_var = os.path.join( - cur_dir, 'build', 'hb', 'resources', 'global_var.py') - if os.path.exists(global_var): - return cur_dir - cur_dir = os.path.dirname(cur_dir) - raise Exception("you must run this script in ohos dir") - def get_preguilt_download_related_files_mtimes(self) -> dict: - dir_path = os.path.join(self.get_ohos_dir(), "build/prebuilts_service") + dir_path = os.path.join(CURRENT_OHOS_ROOT, "build/prebuilts_service") mtimes = {} for root, _, files in os.walk(dir_path): for file in files: file_path = os.path.join(root, file) mtimes[file_path] = os.path.getmtime(file_path) - prebuilts_config_json_path = os.path.join(self.get_ohos_dir(), "build/prebuilts_config.json") - prebuilts_config_py_path = os.path.join(self.get_ohos_dir(), "build/prebuilts_config.py") - prebuilts_config_shell_path = os.path.join(self.get_ohos_dir(), "build/prebuilts_config.sh") + prebuilts_config_json_path = os.path.join(CURRENT_OHOS_ROOT, "build/prebuilts_config.json") + prebuilts_config_py_path = os.path.join(CURRENT_OHOS_ROOT, "build/prebuilts_config.py") + prebuilts_config_shell_path = os.path.join(CURRENT_OHOS_ROOT, "build/prebuilts_config.sh") mtimes.update({prebuilts_config_json_path: os.path.getmtime(prebuilts_config_json_path)}) mtimes.update({prebuilts_config_py_path: os.path.getmtime(prebuilts_config_py_path)}) mtimes.update({prebuilts_config_shell_path: os.path.getmtime(prebuilts_config_shell_path)}) diff --git a/hb/util/component_util.py b/hb/util/component_util.py index 25d70cc5078c30a196fe5b4de4028fecef53d801..1991f4e9853b951816dea3ab927fcae554025369 100644 --- a/hb/util/component_util.py +++ b/hb/util/component_util.py @@ -18,6 +18,8 @@ import os import re import sys +import json +import urllib.request from resources.global_var import CURRENT_OHOS_ROOT from resources.global_var import COMPONENTS_PATH_DIR @@ -77,6 +79,13 @@ class ComponentUtil(): default_deps_path = os.path.join( CURRENT_OHOS_ROOT, 'out', 'preloader', 'default_deps.json') return default_deps_path + + @staticmethod + def get_product_component_path(product_name: str): + gen_product_component_list(product_name) + product_components_out_file = os.path.join(CURRENT_OHOS_ROOT, "out", "preloader", "product_components.json") + return product_components_out_file + @staticmethod @throw_exception @@ -168,3 +177,32 @@ def gen_default_deps_json(variant, root_path, has_test=False): preloader_path = os.path.join(root_path, "out", "preloader") os.makedirs(preloader_path, exist_ok=True) IoUtil.dump_json_file(default_deps_out_file, default_deps_json) + + +def gen_product_component_list(product_name: str): + config_path = os.path.join(CURRENT_OHOS_ROOT, "build", "indep_configs", "config", "product_component_config_url.json") + component_url_list = IoUtil.read_json_file(config_path).get(product_name, []) + + component_list = set() + for url in component_url_list: + try: + response = urllib.request.urlopen(url, timeout=10) + data = json.loads(response.read().decode("utf-8")) + read_component(component_list, data) + except Exception as e: + raise OHOSException(f"Failed to download or parse component config from {url}: {e}", "0000") + product_components_out_file = os.path.join(CURRENT_OHOS_ROOT, "out", "preloader", "product_components.json") + os.makedirs(os.path.dirname(product_components_out_file), exist_ok=True) + IoUtil.dump_json_file(product_components_out_file, list(component_list)) + + +def read_component(res_set, data): + if isinstance(data, dict): + for key in data: + if key == "component": + res_set.add(data[key]) + else: + read_component(res_set , data[key]) + elif isinstance(data, list): + for item in data: + read_component(res_set , item) \ No newline at end of file diff --git a/indep_configs/config/product_component_config_url.json b/indep_configs/config/product_component_config_url.json new file mode 100644 index 0000000000000000000000000000000000000000..c2ff1383cc2e73b4e428b8109b50805e1f2ffd32 --- /dev/null +++ b/indep_configs/config/product_component_config_url.json @@ -0,0 +1,7 @@ +{ + "default":[ + "https://gitee.com/openharmony/vendor_hihope/raw/master/rk3568/config.json", + "https://gitee.com/openharmony/productdefine_common/raw/master/inherit/rich.json", + "https://gitee.com/openharmony/productdefine_common/raw/master/inherit/chipset_common.json" + ] +} \ No newline at end of file