[Lldb-commits] [PATCH] D13906: Introduce a mechanism for sharing code across lldb/test and lldb/scripts

Zachary Turner via lldb-commits lldb-commits at lists.llvm.org
Tue Oct 20 10:34:27 PDT 2015

zturner created this revision.
zturner added a reviewer: tfiala.
zturner added a subscriber: lldb-commits.

We have a lot of Python code in test and scripts that in theory could be reused amongst the two.  Until now there is no mechanism to support this because Python's module / packaging system imposes some limitations on how and where your code must be in order to be re-used.

This patch addresses this by creating a new module `lldb_shared` which searches up the tree until it finds an `lldb.root` file.  Then, it dynamically imports `lldb_shared_base` from that folder.  `lldb_shared_base` is a module that exists only as a means to modify `sys.path` to add all of the shared module locations ot the path.

In order to make use of this, you need to copy the `lldb_shared.py` file into the root of each project that you wish to make use of this shared code.

The end result of this is that if you have a directory structure like this:

    \__ test
    \__ scripts
    \__ common
          \__ useful_utility.py
    \__ third_party
          \__ six
                \__ six.py

All you need to do is add `lldb_shared.py` to the root of `lldb/test` and `lldb/scripts` and then you can write 

    import lldb_shared
    import useful_utility
    import six

This patch is dependent on D13880



Index: test/lldb_shared.py
--- /dev/null
+++ test/lldb_shared.py
@@ -0,0 +1,21 @@
+import os
+import sys
+def find_lldb_root():
+    lldb_root = os.getcwd()
+    while True:
+        lldb_root = os.path.dirname(lldb_root)
+        if lldb_root is None:
+            return None
+        test_path = os.path.join(lldb_root, "lldb.root")
+        if os.path.isfile(test_path):
+            return lldb_root
+    return None
+lldb_root = find_lldb_root()
+if lldb_root is not None:
+    import imp
+    module = imp.find_module("lldb_shared_base", [lldb_root])
+    if module is not None:
+        imp.load_module("lldb_shared_base", *module)
\ No newline at end of file
Index: test/dotest.py
--- test/dotest.py
+++ test/dotest.py
@@ -22,6 +22,8 @@
 from __future__ import print_function
+import lldb_shared
 import atexit
 import commands
 import importlib
@@ -40,6 +42,8 @@
 import unittest2
 import lldbtest_config
+import six
 def is_exe(fpath):
     """Returns true if fpath is an executable."""
Index: lldb_shared_base.py
--- /dev/null
+++ lldb_shared_base.py
@@ -0,0 +1,15 @@
+import inspect
+import os
+import sys
+def add_third_party_module_dirs(lldb_root):
+    third_party_modules_dir = os.path.join(lldb_root, "third_party", "Python", "module")
+    if not os.path.isdir(third_party_modules_dir):
+        return
+    module_dirs = os.listdir(third_party_modules_dir)
+    for module_dir in module_dirs:
+        module_dir = os.path.join(third_party_modules_dir, module_dir)
+        sys.path.append(module_dir)
+lldb_root = os.path.dirname(inspect.getfile(inspect.currentframe()))

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D13906.37894.patch
Type: text/x-patch
Size: 1858 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20151020/f94205e9/attachment.bin>

More information about the lldb-commits mailing list