Introduce a test to verify efl-one only links to the correct libs
authorMarcel Hollerbach <mail@marcel-hollerbach.de>
Thu, 28 May 2020 09:46:45 +0000 (11:46 +0200)
committerJongmin Lee <jm105.lee@samsung.com>
Sun, 31 May 2020 21:34:20 +0000 (06:34 +0900)
whenever this script finds any module linked to libe* (but not
libefl-one.so) it will error.

Differential Revision: https://phab.enlightenment.org/D11900

scripts/test-efl-one.py [new file with mode: 0755]

diff --git a/scripts/test-efl-one.py b/scripts/test-efl-one.py
new file mode 100755 (executable)
index 0000000..ba3e34e
--- /dev/null
@@ -0,0 +1,52 @@
+#!/bin/env python3
+import os
+import subprocess
+import argparse
+import json
+from elftools.elf.elffile import ELFFile
+
+
+#meson changed behaviour from 0.49 to 0.50 so we need this:
+def meson_fetch_filename(filename_object):
+  if isinstance(filename_object, str):
+    return filename_object
+  else:
+    return filename_object[0]
+
+
+def needed_libs(filename):
+  print('Processing file:', filename)
+  result = []
+  with open(filename, 'rb') as f:
+    elffile = ELFFile(f)
+    for section in elffile.iter_sections():
+      if section.name.startswith('.dynamic'):
+        for tag in section.iter_tags():
+          if tag.entry.d_tag == 'DT_NEEDED':
+            result.append(getattr(tag, tag.entry.d_tag[3:].lower()))
+  return result
+
+
+parser = argparse.ArgumentParser(description='Check that when build with efl-one that no module nor efl-one lib does drag in libeina or the likes')
+parser.add_argument('builddir', metavar='build', help='the path where to find the meson build directory')
+
+G = parser.parse_args()
+
+#Run meson to fetch all examples
+meson_introspect = subprocess.Popen(["meson", "introspect", G.builddir, "--targets"],
+      stdout = subprocess.PIPE,
+      stderr = subprocess.PIPE,
+)
+meson_introspect.poll()
+build_targets = json.loads(meson_introspect.stdout.read())
+build_modules = [meson_fetch_filename(b["filename"]) for b in build_targets if "modules" in meson_fetch_filename(b["filename"]) and meson_fetch_filename(b["filename"]).endswith('.so')]
+
+for build_modules in build_modules:
+  libs = needed_libs(build_modules)
+  lib_es = [lib for lib in libs if lib.startswith("libe") and lib != "libefl-one.so.1"]
+  if len(lib_es) != 0:
+    print("Error, {} requies lib {}".format(build_modules, lib_es[0]))
+    exit(-1)
+
+print("Nothing wrong found!")
+