summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorDarryl Green <darryl.green@arm.com>2019-02-27 16:53:40 +0000
committerDarryl Green <darryl.green@arm.com>2019-04-18 11:47:28 +0100
commitde118091f21722933466c38ffe894d8346778963 (patch)
tree5f35a43cb343c46844ed6fe3f728a8a25d26074b /scripts
parentae5d66c61209fc1a258617446845861da037e4c0 (diff)
Add handling for cases when not all .so files are present
We may wish to compare ABI/API between Mbed TLS and Mbed Crypto, which will cause issues as not all .so files are shared. Only compare .so files which both libraries have.
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/abi_check.py31
1 files changed, 18 insertions, 13 deletions
diff --git a/scripts/abi_check.py b/scripts/abi_check.py
index 6475a7e6..3f697fd4 100755
--- a/scripts/abi_check.py
+++ b/scripts/abi_check.py
@@ -62,7 +62,7 @@ class AbiChecker(object):
self.new_crypto_rev = new_crypto_rev
self.skip_file = skip_file
self.brief = brief
- self.mbedtls_modules = {}
+ self.mbedtls_modules = {"old": {}, "new": {}}
self.old_dumps = {}
self.new_dumps = {}
self.git_command = "git"
@@ -149,7 +149,7 @@ class AbiChecker(object):
if checkout_process.returncode != 0:
raise Exception("git checkout failed, aborting")
- def build_shared_libraries(self, git_worktree_path):
+ def build_shared_libraries(self, git_worktree_path, version):
"""Build the shared libraries in the specified worktree."""
my_environment = os.environ.copy()
my_environment["CFLAGS"] = "-g -Og"
@@ -166,20 +166,23 @@ class AbiChecker(object):
self.log.info(make_output.decode("utf-8"))
for root, dirs, files in os.walk(git_worktree_path):
for file in fnmatch.filter(files, "*.so"):
- self.mbedtls_modules[os.path.splitext(file)[0]] = os.path.join(
- root, file
+ self.mbedtls_modules[version][os.path.splitext(file)[0]] = (
+ os.path.join(root, file)
)
if make_process.returncode != 0:
raise Exception("make failed, aborting")
- def get_abi_dumps_from_shared_libraries(self, git_ref, git_worktree_path):
+ def get_abi_dumps_from_shared_libraries(self, git_ref, git_worktree_path,
+ version):
"""Generate the ABI dumps for the specified git revision.
It must be checked out in git_worktree_path and the shared libraries
must have been built."""
abi_dumps = {}
- for mbed_module, module_path in self.mbedtls_modules.items():
+ for mbed_module, module_path in self.mbedtls_modules[version].items():
output_path = os.path.join(
- self.report_dir, "{}-{}.dump".format(mbed_module, git_ref)
+ self.report_dir, version, "{}-{}.dump".format(
+ mbed_module, git_ref
+ )
)
abi_dump_command = [
"abi-dumper",
@@ -213,15 +216,15 @@ class AbiChecker(object):
if worktree_process.returncode != 0:
raise Exception("Worktree cleanup failed, aborting")
- def get_abi_dump_for_ref(self, remote_repo, git_rev, crypto_rev):
+ def get_abi_dump_for_ref(self, remote_repo, git_rev, crypto_rev, version):
"""Generate the ABI dumps for the specified git revision."""
git_worktree_path = self.get_clean_worktree_for_git_revision(
remote_repo, git_rev
)
self.update_git_submodules(git_worktree_path, crypto_rev)
- self.build_shared_libraries(git_worktree_path)
+ self.build_shared_libraries(git_worktree_path, version)
abi_dumps = self.get_abi_dumps_from_shared_libraries(
- git_rev, git_worktree_path
+ git_rev, git_worktree_path, version
)
self.cleanup_worktree(git_worktree_path)
return abi_dumps
@@ -250,7 +253,9 @@ class AbiChecker(object):
be available."""
compatibility_report = ""
compliance_return_code = 0
- for mbed_module, module_path in self.mbedtls_modules.items():
+ shared_modules = list(set(self.mbedtls_modules["old"].keys()) &
+ set(self.mbedtls_modules["new"].keys()))
+ for mbed_module in shared_modules:
output_path = os.path.join(
self.report_dir, "{}-{}-{}.html".format(
mbed_module, self.old_rev, self.new_rev
@@ -315,9 +320,9 @@ class AbiChecker(object):
self.check_repo_path()
self.check_abi_tools_are_installed()
self.old_dumps = self.get_abi_dump_for_ref(self.old_repo, self.old_rev,
- self.old_crypto_rev)
+ self.old_crypto_rev, "old")
self.new_dumps = self.get_abi_dump_for_ref(self.new_repo, self.new_rev,
- self.new_crypto_rev)
+ self.new_crypto_rev, "new")
return self.get_abi_compatibility_report()