From 01c730cf3bfc320dc102860bb123c1aa151a1ba5 Mon Sep 17 00:00:00 2001 From: flying Date: Mon, 18 Dec 2023 08:06:30 +0000 Subject: [PATCH 01/10] update tools/components_deps/README.md. Signed-off-by: flying --- tools/components_deps/README.md | 79 +++++++++++++++------------------ 1 file changed, 37 insertions(+), 42 deletions(-) diff --git a/tools/components_deps/README.md b/tools/components_deps/README.md index c5d0cdff..dafdb4e8 100644 --- a/tools/components_deps/README.md +++ b/tools/components_deps/README.md @@ -2,74 +2,69 @@ ## 功能介绍 -基于config.json、编译产物out/{product_name}/build_configs/parts_info/parts_deps.json,分析各必选部件和可选部件间的依赖关系。 +基于vendor下的config.json、xml文件中的开源部件集、BUILD.gn文件,分析是否存在对闭源部件的依赖以及是否存在对非必选部件的无条件依赖。 结果以json格式进行存储。 ## 支持产品 -主要是rk3568系列,已测试产品包括rk3568、rk3568_mini_system、pc_mini_system、tablet_mini_system、phone_mini_system +config.json文件主要是关于rk3568系列,已测试产品包括rk3568、rk3568_mini_system、pc_mini_system、tablet_mini_system、phone_mini_system的config.json文件 ## 实现思路 -利用产品部件定义文件config.json和编译构建自动生成的out/{product_name}/build_configs/parts_info/parts_deps.json中已有的信息重新组织,查找相关BUILD.gn文件路径。 +根据产品部件定义文件config.json找到必选部件,根据xml文件找到开源部件,最后结合BUILD.gn文件中的信息判断是否存在某种依赖关系。 ## 使用说明 前置条件: -1. 获取整个components_deps目录 -1. 对系统进行编译 +1. 获取BUILD.gn文件 +1. 获取包含开源部件集的xml文件 +1. 获取包含部件集定义的config.json文件 1. python3及以后 命令介绍: 1. `-h`或`--help`命令查看帮助 ```shell - > python3 components_deps_analyzer.py -h - usage: components_deps_analyzer.py [-h] -c CONFIG_JSON -d PARTS_DEPS_JSON [-s SINGLE_COMPONENT_NAME] [-o OUTPUT_FILE] + > python components_deps_analyzer.py --help + usage: components_deps_analyzer.py [-h] -p COMPONENTS_GN_PATH_LIST -c CONFIG_PATH -o OPEN_COMPONENT_XML_PATH [-r RESULT_JSON_NAME] - -s SINGLE_COMPONENT_NAME, --single_component_name SINGLE_COMPONENT_NAME - single component name - -o OUTPUT_FILE, --output_file OUTPUT_FILE - eg: demo/components_deps + analyze components deps. + + optional arguments: + -p COMPONENTS_GN_PATH_LIST, --components_gn_path_list COMPONENTS_GN_PATH_LIST + path of pr BUILD.gn + -g GN_COMPONENT, --gn_component GN_COMPONENT + gn file corresponding component + -c CONFIG_PATH, --config_path CONFIG_PATH + path of config_file + -o OPEN_COMPONENT_XML_PATH, --open_component_xml_path OPEN_COMPONENT_XML_PATH + open component name set + -r RESULT_JSON_NAME, --result_json_name RESULT_JSON_NAME + name of output_json ``` 1. 使用示例 ```shell - python components_deps_analyzer.py -c vendor/hihope/rk3568/config.json -d out/rk3568/build_configs/parts_info/parts_deps.json -o components_dep -s ability_runtime + python components_deps_analyzer.py -p BUILD.gn,pkgs/BUILD.gn -g ace_engine,cef -c config_path -o .\gn_xml\ohos.xml ``` -## 输出格式介绍(components_dep.json) +## 输出格式介绍(result.json) ``` -{ - 必选部件名: { - 无条件依赖的可选部件名1: - [BUILD.gn文件路径1, - BUILD.gn文件路径2, - ...], - 无条件依赖的可选部件名2: - [BUILD.gn文件路径1, - BUILD.gn文件路径2, - ...], - ... - } -} -``` - -## 单部件输出格式介绍(ability_runtime.json) - -``` -{ - 无条件依赖的可选部件名1: - [BUILD.gn文件路径1, - BUILD.gn文件路径2, - ...], - 无条件依赖的可选部件名2: - [BUILD.gn文件路径1, - BUILD.gn文件路径2, - ...], +[ + { + "file_path": BUILD.gn文件路径, + "error": [ + { + "line": 行号, + "rule": 触发规则, + "detail": 详细说明 + }, + ... + ] + }, ... -} -``` +] +``` \ No newline at end of file From a0a1d081908141dd8fd46a4c52e520841badc591 Mon Sep 17 00:00:00 2001 From: flying Date: Mon, 18 Dec 2023 08:07:09 +0000 Subject: [PATCH 02/10] update tools/components_deps/components_deps_analyzer.py. Signed-off-by: flying --- .../components_deps_analyzer.py | 174 ++++++++++-------- 1 file changed, 97 insertions(+), 77 deletions(-) diff --git a/tools/components_deps/components_deps_analyzer.py b/tools/components_deps/components_deps_analyzer.py index 6c78456b..ffd001ba 100644 --- a/tools/components_deps/components_deps_analyzer.py +++ b/tools/components_deps/components_deps_analyzer.py @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -# This file contains the comparison between mandatory components and the actual compiled components. +# This file provide the detection tool for unconditional dependence of required components on optional components. import argparse import json @@ -23,111 +23,131 @@ import re class Analyzer: @classmethod - def __get_components(cls, config: str): - mandatory_components = list() - optional_components = list() - with open(config, 'r', encoding='utf-8') as r: - config_json = json.load(r) - inherit = config_json['inherit'] - for json_name in inherit: - with open(json_name, 'r', encoding='utf-8') as r: - inherit_file = json.load(r) - for subsystem in inherit_file['subsystems']: - for component in subsystem['components']: - mandatory_components.append(component['component']) + def __get_open_components(cls, xml_path): + open_components = list() + with open(xml_path, 'r', encoding='utf-8') as r: + xml_info = r.readlines() + for line in xml_info: + if "path=" in line: + tmp = re.findall('path="(.*?)"', line)[0] + open_components.append(tmp.split('/')[-1]) + return open_components + + @classmethod + def __deal_config_json(cls, config_json): + components = list() for subsystem in config_json['subsystems']: for component in subsystem['components']: - if component not in mandatory_components: - optional_components.append(component['component']) - return mandatory_components, optional_components + if component not in components: + components.append(component['component']) + return components @classmethod - def __get_gn_path(cls, parts_deps: str, mandatory: list): - mandatory_gn_path = dict() - with open(parts_deps, 'r', encoding='utf-8') as r: - parts_deps_json = json.load(r) - for component in parts_deps_json: - if component in mandatory and parts_deps_json[component]: - mandatory_gn_path[component] = '/'.join( - parts_deps_json[component]['build_config_file'].split('/')[:-1]) - return mandatory_gn_path + def __get_required_components(cls, config_path: str): + required_components = list() + files = os.listdir(config_path) + for file in files: + if file.endswith(".json"): + with open(os.path.join(config_path, file), 'r', encoding='utf-8') as r: + config_json = json.load(r) + required_components += cls.__deal_config_json(config_json) + return required_components @classmethod - def __judge_deps(cls, gn_path: str, optional_components): + def __get_line(cls, txt_list, key_words: str): + for i in range(len(txt_list)): + if key_words in txt_list[i]: + return i + 1 + return 0 + + @classmethod + def __judge_deps(cls, gn_path: str, open_components_list, optional_components): + error = list() deps = list() + dependent_close = True with open(gn_path, 'r', encoding='utf-8') as r: gn = r.readlines() txt = '' for line in gn: - txt += line.strip() - for optional_component in optional_components: - dep_txt = re.findall('deps = \[(.*?)\]', txt) + re.findall('deps += \[(.*?)\]', txt) + txt += line + key_txt = ' '.join(re.findall('if \(.+?\{(.*?)\}', txt)) + for component in open_components_list: + if dependent_close == True: + if component in txt: + dependent_close = False + for i in range(len(gn)): + dep_txt = re.findall('deps = \[(.*?)\]', gn[i]) + re.findall('deps += \[(.*?)\]', gn[i]) dep_info = list() for info in dep_txt: if '/' in info: dep_info += re.findall('/(.*?):', info) else: dep_info += re.findall('"(.*?):', info) - if optional_component in dep_info: - key_txt = ' '.join(re.findall('if \(.+?\{(.*?)\}', txt)) - if optional_component not in key_txt: - deps.append({'component': optional_component, 'gn_path': gn_path}) - return deps + for component in optional_components: + if component in dep_info and component not in key_txt: + deps.append((component, i + 1)) + if dependent_close == True and re.findall('deps =', txt): + line = cls.__get_line(gn, 'deps =') + error.append( + {"line": line, "rule": "depend close component", "detail": "可能依赖闭源部件,请检查deps中的内容"}) + for one_dep in deps: + error.append({"line": one_dep[1], "rule": "depend optional component", + "detail": "依赖开源部件中的非必选部件{},请检查deps中的内容".format(one_dep[0])}) + return gn_path, error @classmethod - def __get_deps(cls, mandatory_gn: dict, optional_components_list: list): - all_deps = dict() - for component in mandatory_gn.keys(): - component_deps = list() - total_deps = dict() - for root, _, files in os.walk(mandatory_gn[component]): - if 'BUILD.gn' in files: - component_deps += cls.__judge_deps(os.path.join(root, 'BUILD.gn'), optional_components_list) - for one_dep in component_deps: - if one_dep['component'] not in total_deps.keys(): - total_deps[one_dep['component']] = [one_dep['gn_path']] - else: - total_deps[one_dep['component']].append(one_dep['gn_path']) - all_deps[component] = total_deps - return all_deps - - @classmethod - def analysis(cls, config_path: str, parts_deps_path: str, output_file: str, single_component: str): + def analysis(cls, gn_path_list, gn_component, config_path: str, open_components_path, result_json_name: str): if not os.path.exists(config_path): print("error: {} is inaccessible or not found".format(config_path)) return - if not os.path.exists(parts_deps_path): - print("error: {} is inaccessible or not found".format(parts_deps_path)) + if not os.path.exists(open_components_path): + print("error: {} is inaccessible or not found".format(open_components_path)) return - mandatory_components, optional_components = cls.__get_components(config_path) - mandatory_components_gn_path = cls.__get_gn_path(parts_deps_path, mandatory_components) - deps = cls.__get_deps(mandatory_components_gn_path, optional_components) - with os.fdopen(os.open(output_file + ".json", os.O_WRONLY | os.O_CREAT, mode=0o640), "w") as fd: - json.dump(deps, fd, indent=4) - if single_component != 'false' and single_component in deps.keys(): - with os.fdopen(os.open(single_component + ".json", os.O_WRONLY | os.O_CREAT, mode=0o640), "w") as fd: - json.dump(deps[single_component], fd, indent=4) + if len(gn_path_list) != len(gn_component): + print( + "error: The component corresponding to the gn file and the gn file path are not in one-to-one correspondence.") + return + required_components = cls.__get_required_components(config_path) + open_components = cls.__get_open_components(open_components_path) + optional_components = list() + for components in open_components: + if components not in required_components: + optional_components.append(components) + result = list() + for i in range(len(gn_path_list)): + one_result = dict() + if gn_component[i] in required_components: + one_result["file_path"], one_result["error"] = cls.__judge_deps(gn_path_list[i], open_components, + optional_components) + else: + one_result["file_path"], one_result["error"] = gn_path_list[i], [] + result.append(one_result) + with os.fdopen(os.open(result_json_name + ".json", os.O_WRONLY | os.O_CREAT, mode=0o640), "w", + encoding='utf-8') as fd: + json.dump(result, fd, indent=4, ensure_ascii=False) def get_args(): parser = argparse.ArgumentParser( description=f"analyze components deps.\n") - parser.add_argument("-c", "--config_json", required=True, type=str, - help="path of root path of openharmony/vendor/hihope/{product_name}/config.json") - parser.add_argument("-d", "--parts_deps_json", required=True, type=str, - help="path of out/{product_name}/build_configs/parts_info/parts_deps.json") - parser.add_argument("-s", "--single_component_name", type=str, default="false", - help="single component name") - parser.add_argument("-o", "--output_file", type=str, default="components_deps", - help="eg: demo/components_deps") - args = parser.parse_args() - return args + parser.add_argument("-p", "--components_gn_path_list", required=True, type=str, + help="path of pr BUILD.gn") + parser.add_argument("-g", "--gn_component", required=True, type=str, + help="gn file corresponding component") + parser.add_argument("-c", "--config_path", required=True, type=str, + help="path of config_file") + parser.add_argument("-o", "--open_component_xml_path", required=True, type=str, + help="open component name set") + parser.add_argument("-r", "--result_json_name", type=str, default="result", + help="name of output_json") + return parser.parse_args() if __name__ == '__main__': args = get_args() - config_json_path = args.config_json - parts_deps_json_path = args.parts_deps_json - output_file_name = args.output_file - single_component = args.single_component_name - Analyzer.analysis(config_json_path, parts_deps_json_path, output_file_name, single_component) \ No newline at end of file + gn_path_list = args.components_gn_path_list.split(',') + gn_component = args.gn_component.split(',') + config_path = args.config_path + open_components_xml_path = args.open_component_xml_path + result_json_name = args.result_json_name + Analyzer.analysis(gn_path_list, gn_component, config_path, open_components_xml_path, result_json_name) \ No newline at end of file From 0ff017bc3ccc07ec7a46ac9edd84a749956e5fb0 Mon Sep 17 00:00:00 2001 From: flying Date: Mon, 18 Dec 2023 08:29:22 +0000 Subject: [PATCH 03/10] update tools/components_deps/README.md. Signed-off-by: flying --- tools/components_deps/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/components_deps/README.md b/tools/components_deps/README.md index dafdb4e8..30360d20 100644 --- a/tools/components_deps/README.md +++ b/tools/components_deps/README.md @@ -12,7 +12,7 @@ config.json文件主要是关于rk3568系列,已测试产品包括rk3568、rk356 ## 实现思路 -根据产品部件定义文件config.json找到必选部件,根据xml文件找到开源部件,最后结合BUILD.gn文件中的信息判断是否存在某种依赖关系。 +根据产品的部件集定义文件config.json找到必选部件,根据ohos.xml文件找到开源部件,最后结合BUILD.gn文件中的信息判断是否存在某种依赖关系。 ## 使用说明 From 8f2412bd353bb8a3522d998f1014c2ec1c8b61b6 Mon Sep 17 00:00:00 2001 From: flying Date: Mon, 18 Dec 2023 10:28:01 +0000 Subject: [PATCH 04/10] update tools/components_deps/README.md. Signed-off-by: flying --- tools/components_deps/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/components_deps/README.md b/tools/components_deps/README.md index 30360d20..5fa20af2 100644 --- a/tools/components_deps/README.md +++ b/tools/components_deps/README.md @@ -12,7 +12,7 @@ config.json文件主要是关于rk3568系列,已测试产品包括rk3568、rk356 ## 实现思路 -根据产品的部件集定义文件config.json找到必选部件,根据ohos.xml文件找到开源部件,最后结合BUILD.gn文件中的信息判断是否存在某种依赖关系。 +根据产品的部件集定义文件找到必选部件,根据ohos.xml文件找到开源部件,最后结合BUILD.gn文件中的信息判断是否存在某种依赖关系。 ## 使用说明 From 06930c6de5e37169f9813e77dbc32aed6cf671eb Mon Sep 17 00:00:00 2001 From: flying Date: Mon, 18 Dec 2023 10:47:37 +0000 Subject: [PATCH 05/10] update tools/components_deps/README.md. Signed-off-by: flying --- tools/components_deps/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/components_deps/README.md b/tools/components_deps/README.md index 5fa20af2..6aaa5e26 100644 --- a/tools/components_deps/README.md +++ b/tools/components_deps/README.md @@ -12,7 +12,7 @@ config.json文件主要是关于rk3568系列,已测试产品包括rk3568、rk356 ## 实现思路 -根据产品的部件集定义文件找到必选部件,根据ohos.xml文件找到开源部件,最后结合BUILD.gn文件中的信息判断是否存在某种依赖关系。 +根据config.json文件找到必选部件,根据ohos.xml文件找到开源部件,最后结合BUILD.gn文件中的信息判断是否存在某种依赖关系。 ## 使用说明 From eeb1d18d75691ba0acd864ffd860dc293a6e1782 Mon Sep 17 00:00:00 2001 From: flying Date: Mon, 18 Dec 2023 10:59:27 +0000 Subject: [PATCH 06/10] update tools/components_deps/README.md. Signed-off-by: flying --- tools/components_deps/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/components_deps/README.md b/tools/components_deps/README.md index 6aaa5e26..732ca372 100644 --- a/tools/components_deps/README.md +++ b/tools/components_deps/README.md @@ -12,7 +12,7 @@ config.json文件主要是关于rk3568系列,已测试产品包括rk3568、rk356 ## 实现思路 -根据config.json文件找到必选部件,根据ohos.xml文件找到开源部件,最后结合BUILD.gn文件中的信息判断是否存在某种依赖关系。 +根据config.json文件找到必选部件,根据ohos.xml文件找到开源部件,最后结合gn文件中的信息判断是否存在某种依赖关系。 ## 使用说明 From 8e73a4a35a16f11e2b11a65e9529b4f8b3e39180 Mon Sep 17 00:00:00 2001 From: flying Date: Mon, 18 Dec 2023 11:19:27 +0000 Subject: [PATCH 07/10] update tools/components_deps/README.md. Signed-off-by: flying --- tools/components_deps/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/components_deps/README.md b/tools/components_deps/README.md index 732ca372..a56bec07 100644 --- a/tools/components_deps/README.md +++ b/tools/components_deps/README.md @@ -12,7 +12,7 @@ config.json文件主要是关于rk3568系列,已测试产品包括rk3568、rk356 ## 实现思路 -根据config.json文件找到必选部件,根据ohos.xml文件找到开源部件,最后结合gn文件中的信息判断是否存在某种依赖关系。 +根据必选部件和开源部件,最后结合gn文件中的信息判断是否存在某种依赖关系。 ## 使用说明 From 4cb4fe4ac08fbc1749d1ddd2449bb2b24751c4ee Mon Sep 17 00:00:00 2001 From: flying Date: Mon, 18 Dec 2023 11:49:51 +0000 Subject: [PATCH 08/10] update tools/components_deps/README.md. Signed-off-by: flying --- tools/components_deps/README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/tools/components_deps/README.md b/tools/components_deps/README.md index a56bec07..18c9a51c 100644 --- a/tools/components_deps/README.md +++ b/tools/components_deps/README.md @@ -10,10 +10,6 @@ config.json文件主要是关于rk3568系列,已测试产品包括rk3568、rk3568_mini_system、pc_mini_system、tablet_mini_system、phone_mini_system的config.json文件 -## 实现思路 - -根据必选部件和开源部件,最后结合gn文件中的信息判断是否存在某种依赖关系。 - ## 使用说明 前置条件: From c01cbc490bf46f1fb0405438930cc7452ba10488 Mon Sep 17 00:00:00 2001 From: xuezhou_yan Date: Tue, 19 Dec 2023 11:56:14 +0800 Subject: [PATCH 09/10] =?UTF-8?q?[Issue]I8PLSU=20[Bug]:=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E5=9C=88=E5=A4=8D=E6=9D=82=E5=BA=A6=E8=B6=85=E6=A0=87?= =?UTF-8?q?=E5=91=8A=E8=AD=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: xuezhou_yan --- tools/deps_guard/rules_checker/hdi_rule.py | 99 ++++++++++++---------- 1 file changed, 55 insertions(+), 44 deletions(-) diff --git a/tools/deps_guard/rules_checker/hdi_rule.py b/tools/deps_guard/rules_checker/hdi_rule.py index 17017093..a547064f 100755 --- a/tools/deps_guard/rules_checker/hdi_rule.py +++ b/tools/deps_guard/rules_checker/hdi_rule.py @@ -20,62 +20,73 @@ import json from .base_rule import BaseRule + class HdiRule(BaseRule): - RULE_NAME = "NO-Depends-On-HDI" + RULE_NAME = "NO-Depends-On-HDI" - def __check_depends_on_hdi(self): - lists = self.get_white_lists() + def __check_depends_on_hdi(self): + lists = self.get_white_lists() - passed = True + passed = True - hdi_without_shlib_type = [] - non_hdi_with_hdi_shlib_type = [] + hdi_without_shlib_type = [] + non_hdi_with_hdi_shlib_type = [] - # Check if any napi modules has dependedBy - for mod in self.get_mgr().get_all(): - is_hdi = False - if "hdiType" in mod and mod["hdiType"] == "hdi_service": - is_hdi = True - # Collect non HDI modules with shlib_type of value "hdi" - if not is_hdi and ("shlib_type" in mod and mod["shlib_type"] == "hdi"): - non_hdi_with_hdi_shlib_type.append(mod) + # Check if any napi modules has dependedBy + for mod in self.get_mgr().get_all(): + is_hdi = False + if "hdiType" in mod and mod["hdiType"] == "hdi_service": + is_hdi = True + # Collect non HDI modules with shlib_type of value "hdi" + if not is_hdi and ("shlib_type" in mod and mod["shlib_type"] == "hdi"): + non_hdi_with_hdi_shlib_type.append(mod) - # Collect HDI modules without shlib_type with value of "hdi" - if is_hdi and ("shlib_type" not in mod or mod["shlib_type"] != "hdi"): - if mod["name"] not in lists: - hdi_without_shlib_type.append(mod) + # Collect HDI modules without shlib_type with value of "hdi" + if is_hdi and ("shlib_type" not in mod or mod["shlib_type"] != "hdi"): + if mod["name"] not in lists: + hdi_without_shlib_type.append(mod) - if not is_hdi: - continue + if self.__ignore_mod(mod, is_hdi, lists): + continue - if len(mod["dependedBy"]) == 0: - continue + # Check if HDI modules is depended by other modules + self.error("hdi module %s depended by:" % mod["name"]) + for dep in mod["dependedBy"]: + caller = dep["caller"] + self.log(" module [%s] defined in [%s]" % (caller["name"], caller["labelPath"])) + passed = False - if mod["name"] in lists: - continue + if len(hdi_without_shlib_type) > 0: + for mod in hdi_without_shlib_type: + if mod["name"] not in lists: + passed = False + self.error('hdi module %s has no shlib_type="hdi", add it in %s' % (mod["name"], mod["labelPath"])) - # If hdi module has version_script to specify exported symbols, it can be depended by others - if "version_script" in mod: - continue + if len(non_hdi_with_hdi_shlib_type) > 0: + for mod in non_hdi_with_hdi_shlib_type: + self.warn('non hdi module %s with shlib_type="hdi", %s' % (mod["name"], mod["labelPath"])) - # Check if HDI modules is depended by other modules - self.error("hdi module %s depended by:" % mod["name"]) - for dep in mod["dependedBy"]: - caller = dep["caller"] - self.log(" module [%s] defined in [%s]" % (caller["name"], caller["labelPath"])) - passed = False + return passed - if len(hdi_without_shlib_type) > 0: - for mod in hdi_without_shlib_type: - if mod["name"] not in lists: - passed = False - self.error('hdi module %s has no shlib_type="hdi", add it in %s' % (mod["name"], mod["labelPath"])) + def check(self): + return self.__check_depends_on_hdi() + + def __ignore_mod(self, mod, is_hdi, lists): + ignore_flag = False + if not is_hdi: + ignore_flag = True + return ignore_flag - if len(non_hdi_with_hdi_shlib_type) > 0: - for mod in non_hdi_with_hdi_shlib_type: - self.warn('non hdi module %s with shlib_type="hdi", %s' % (mod["name"], mod["labelPath"])) + if len(mod["dependedBy"]) == 0: + ignore_flag = True + return ignore_flag - return passed + if mod["name"] in lists: + ignore_flag = True + return ignore_flag - def check(self): - return self.__check_depends_on_hdi() + # If hdi module has version_script to specify exported symbols, it can be depended by others + if "version_script" in mod: + ignore_flag = True + + return ignore_flag From ef2f2021c6150cadd9ac6d1dcd77cade0ea39379 Mon Sep 17 00:00:00 2001 From: xuezhou_yan Date: Wed, 20 Dec 2023 17:30:43 +0800 Subject: [PATCH 10/10] =?UTF-8?q?[Bug]:=20OAT=20=E5=91=8A=E8=AD=A6?= =?UTF-8?q?=E6=B8=85=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: xuezhou_yan --- OAT.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OAT.xml b/OAT.xml index 80623c1f..631ca8bd 100644 --- a/OAT.xml +++ b/OAT.xml @@ -65,6 +65,8 @@ Note:If the text contains special characters, please escape them according to th + +