diff --git a/tools/deps_guard/elf_file_mgr/elf_file.py b/tools/deps_guard/elf_file_mgr/elf_file.py index f36cdc8c..014e75b1 100755 --- a/tools/deps_guard/elf_file_mgr/elf_file.py +++ b/tools/deps_guard/elf_file_mgr/elf_file.py @@ -58,8 +58,9 @@ class ElfFile(dict): res = [] if dynamics: for line in dynamics: + name = line.split("/")[-1].strip() if line.startswith("lib") and line.endswith(".so"): - res.append(line) + res.append([name, line]) return res diff --git a/tools/deps_guard/elf_file_mgr/elf_file_mgr.py b/tools/deps_guard/elf_file_mgr/elf_file_mgr.py index 3f6669ab..f672550e 100755 --- a/tools/deps_guard/elf_file_mgr/elf_file_mgr.py +++ b/tools/deps_guard/elf_file_mgr/elf_file_mgr.py @@ -244,10 +244,11 @@ class ElfFileMgr(object): print(" Got %d dependencies" % self._dep_idx) def __build_deps_tree_for_one_elf(self, elf): - for lib in elf.library_depends(): + for lib, line in elf.library_depends(): dep_elf = self.get_elf_by_name(lib) if not dep_elf: self._not_found_depened_files.append({"caller": elf["name"], "callee": lib}) + elf["missing"].append(lib) print("Warning: can not find depended library [" + lib + "] for " + elf["name"]) continue diff --git a/tools/deps_guard/rules_checker/base_innerapi_rule.py b/tools/deps_guard/rules_checker/base_innerapi_rule.py index 978697ba..b4bdabe3 100644 --- a/tools/deps_guard/rules_checker/base_innerapi_rule.py +++ b/tools/deps_guard/rules_checker/base_innerapi_rule.py @@ -70,6 +70,32 @@ class BaseInnerapiRule(BaseRule): self.error("NEED MODIFY: system only module %s depends on wrong module as %s in %s, dep module path is %s" %(mod["name"], callee["name"], mod["labelPath"], callee["path"])) passed = False + + # dep is missing, not sure if it's correct. need verify it + for dep_name in mod["missing"]: + if dep_name in self.__base_sofiles: + continue + in_whitelist = False + for so_dict in white_lists: + for k, v in so_dict.items(): + if k == mod["name"] and v == dep_name: + in_whitelist = True + break + + if in whitelist: + continue + else: + print(json.dumps({ + "so_file_name": mod["name"], + "so_file_path": mod["path"], + "dep_file_name": dep_name, + "dep_file_path": "", + "description": f"system only module {mod['name']} depends on {dep_name} which is unknown so type" + }), end="\n") + self.error("NEED MODIFY: system only module %s depends on %s which is unknown so type" + %(mod["name"], dep_name)) + passed = False + # mod is vendor only scene elif self.is_only(mod) == "vendor" and \ all(item in self.__valid_vendor_tags for item in innerapi_tags): @@ -100,5 +126,30 @@ class BaseInnerapiRule(BaseRule): self.error("NEED MODIFY: vendor only module %s depends on wrong module as %s in %s, dep module path is %s" %(mod["name"], callee["name"], mod["labelPath"], callee["path"])) passed = False + + # dep is missing, not sure if it's correct. need verify it + for dep_name in mod["missing"]: + if dep_name in self.__base_sofiles: + continue + in_whitelist = False + for so_dict in white_lists: + for k, v in so_dict.items(): + if k == mod["name"] and v == dep_name: + in_whitelist = True + break + + if in whitelist: + continue + else: + print(json.dumps({ + "so_file_name": mod["name"], + "so_file_path": mod["path"], + "dep_file_name": dep_name, + "dep_file_path": "", + "description": f"vendor only module {mod['name']} depends on {dep_name} which is unknown so type" + }), end="\n") + self.error("NEED MODIFY: vendor only module %s depends on %s which is unknown so type" + %(mod["name"], dep_name)) + passed = False return passed diff --git a/tools/deps_guard/rules_checker/base_rule.py b/tools/deps_guard/rules_checker/base_rule.py index 4ea67667..b576a705 100755 --- a/tools/deps_guard/rules_checker/base_rule.py +++ b/tools/deps_guard/rules_checker/base_rule.py @@ -179,6 +179,31 @@ class BaseRule(object): passed = False self.error("NEED MODIFY: %s with innerapi_tags [%s] has dep file %s with %s contains wrong dep innerapi_tags [%s] in innerapi_tags [%s]" % (mod["name"], ",".join(innerapi_tags), callee["name"], callee["labelPath"], ",".join(wrong_tags), ",".join(dep_innerapi_tags))) + # dep is missing, not sure if it's correct. need verify it + for dep_name in mod["missing"]: + if dep_name in self.__base_sofiles: + continue + in_whitelist = False + for so_dict in white_lists: + for k, v in so_dict.items(): + if k == mod["name"] and v == dep_name: + in_whitelist = True + break + + if in whitelist: + continue + else: + print(json.dumps({ + "so_file_name": mod["name"], + "so_file_path": mod["path"], + "dep_file_name": dep_name, + "dep_file_path": "", + "description": f"system only module {mod['name']} depends on {dep_name} which is unknown so type" + }), end="\n") + self.error("NEED MODIFY: system only module %s depends on %s which is unknown so type" + %(mod["name"], dep_name)) + passed = False + else: wrong_tags = [item for item in innerapi_tags if item not in valid_mod_tags] self.error("NEED MODIFY: module %s with %s contains wrong mod innerapi_tags [%s] in innerapi_tags [%s]" @@ -186,3 +211,58 @@ class BaseRule(object): return False return passed + + def get_allow_list(self): + passthroughs = self.load_list.json("Passthrough", "passthrough_info.json") + llndk = self.load_list.json("LLndk", "llndk_info.json") + chipsetsdk_sp = self.load_list.json("ChipsetsdkSP", "chipsetsdk_sp_info.json") + return passthroughs + llndk + chipsetsdk_sp + + def get_vendor_allow_list(self): + passthroughs = self.load_list.json("Passthrough", "passthrough_info.json") + llndk = self.load_list.json("LLndk", "llndk_info.json") + chipsetsdk_sp = self.load_list.json("ChipsetsdkSP", "chipsetsdk_sp_info.json") + chipsetsdk = self.load_list.json("Chipsetsdk", "chipsetsdk_info.json") + return passthroughs + llndk + chipsetsdk_sp + chipsetsdk + + def parser_rules_file(self, rules_file, res): + try: + self.log("****Parsing rules file in {}****".format(rules_file)) + with open(rules_file, "r") as f: + contents = f.read() + if not contents: + self.log("****rules file {} is null****".format(rules_file)) + return res + json_data = json.loads(contents) + for so in json_data: + so_file_name = so.get("so_file_name") + if so_file_name and so_file_name not in res: + res.append(so_file_name) + except (FileNotFoundError, IOError, UnicodeDecodeError) as file_open_or_decode_err: + self.error(file_open_or_decode_err) + + return res + + def load_list_json(self, rule_name, name): + rules_dir = [] + if self._args and self._args.rules: + self.log("****add more chipsetsdk info in:{}****".format(self._args.rules)) + rules_dir = rules_dir + self._args.rules + + chipsetsdk_rules_path = self.get_out_path().replace("out", "out/products_ext") + new_rule_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "../rules") + if os.path.exists(chipsetsdk_rules_path): + rules_dir.append(chipsetsdk_rules_path) + self.log("****add more chipsetsdk info in dir:{}****".format(chipsetsdk_rules_path)) + elif os.path.exists(new_rule_path): + rules_dir.append(new_rule_path) + self.log("****add chipsetsdk_rules_path path:{}****".format(new_rule_path)) + res = [] + for d in rules_dir: + rules_file = os.path.join(d, rule_name, name) + if os.path.isfile(rules_file): + res = self.__parser_rules_file(rules_file, res) + else: + self.warn("****rules path not exist: {}****".format(rules_file)) + + return res