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:
lldb
\__ 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
http://reviews.llvm.org/D13906
Files:
lldb.root
lldb_shared_base.py
test/dotest.py
test/lldb_shared.py
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()))
+add_third_party_module_dirs(lldb_root)
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()))
+add_third_party_module_dirs(lldb_root)
_______________________________________________
lldb-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits