aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/tools/python
diff options
context:
space:
mode:
authormaxim-yurchuk <maxim-yurchuk@yandex-team.com>2024-10-09 12:29:46 +0300
committermaxim-yurchuk <maxim-yurchuk@yandex-team.com>2024-10-09 13:14:22 +0300
commit9731d8a4bb7ee2cc8554eaf133bb85498a4c7d80 (patch)
treea8fb3181d5947c0d78cf402aa56e686130179049 /contrib/tools/python
parenta44b779cd359f06c3ebbef4ec98c6b38609d9d85 (diff)
downloadydb-9731d8a4bb7ee2cc8554eaf133bb85498a4c7d80.tar.gz
publishFullContrib: true for ydb
<HIDDEN_URL> commit_hash:c82a80ac4594723cebf2c7387dec9c60217f603e
Diffstat (limited to 'contrib/tools/python')
-rw-r--r--contrib/tools/python/lib/bootstrap.py148
1 files changed, 148 insertions, 0 deletions
diff --git a/contrib/tools/python/lib/bootstrap.py b/contrib/tools/python/lib/bootstrap.py
new file mode 100644
index 0000000000..31d3f69fb6
--- /dev/null
+++ b/contrib/tools/python/lib/bootstrap.py
@@ -0,0 +1,148 @@
+import os
+import sys
+
+
+_SOURCE_ROOT = None
+
+
+def truncate_path(path):
+ path = os.path.normpath(path)
+ if _SOURCE_ROOT and path.startswith(_SOURCE_ROOT):
+ return os.path.relpath(path, _SOURCE_ROOT)
+ return os.path.basename(path)
+
+
+def module_load(name, path = None):
+ import imp
+
+ module_name = name
+ module_dot = name.find(".")
+ if module_dot >= 0:
+ module_name = module_name[:module_dot]
+
+ fileobject, pathname, description = imp.find_module(module_name, path and [path])
+
+ if os.path.isdir(pathname):
+ pathname = os.path.join(pathname, "")
+
+ if module_dot >= 0:
+ return module_load(name[module_dot + 1:], pathname)
+ return module_load("__init__", pathname)
+
+ return pathname, fileobject, name == "__init__"
+
+
+def list_modules():
+ import pydoc
+
+ modules = []
+
+ def module_callback(path, name, description):
+ modules.append(name)
+
+ module_scanner = pydoc.ModuleScanner()
+ module_scanner.run(module_callback)
+ return modules
+
+
+def make_path_directories(path):
+ path_directory = os.path.dirname(path)
+ if not os.path.exists(path_directory):
+ os.makedirs(path_directory)
+ return path
+
+
+def module_blob_compile(module_file, module_path):
+ import marshal
+ module_code = compile(module_file.read(), truncate_path(module_path), "exec")
+ return marshal.dumps(module_code)
+
+
+def module_blob_write(module_blob, module_blob_name, module_blob_file):
+ if EXTERN:
+ if _SOURCE_ROOT and _SOURCE_ROOT in module_blob:
+ raise Exception('Unable to add module %s because the blob contains the source root %s' % (module_blob_name, _SOURCE_ROOT))
+ if os.getcwd() in module_blob:
+ raise Exception('Unable to add module %s because the blob contains the build root %s' % (module_blob_name, os.getcwd()))
+
+ module_blob_file.write(module_blob)
+ return
+
+ module_blob_file.write(STATIC + "unsigned char %s[] = {" % module_blob_name)
+ for module_blob_byte in module_blob:
+ module_blob_file.write("%d," % ord(module_blob_byte))
+ module_blob_file.write("};\n\n")
+
+
+def module_table_write(module_blobs, module_table_file):
+ if EXTERN:
+ off = 0
+ module_table_file.write('extern unsigned char %s[];\n\n' % EXTERN)
+ for module_name, module_blob_name, module_blob_size in module_blobs:
+ if module_blob_size < 0:
+ module_blob_size = -module_blob_size
+ module_table_file.write("#define %s (%s + %d)\n" % (module_blob_name, EXTERN, off))
+ off += module_blob_size
+
+ module_table_file.write("""\n#include "Python.h"\n""")
+ module_table_file.write("\nstatic struct _frozen _PyImport_FrozenModules[] = {\n")
+
+ for module_name, module_blob_name, module_blob_size in module_blobs:
+ module_table_file.write("""\t{"%s", %s, %d},\n""" % (module_name, module_blob_name, module_blob_size))
+
+ module_table_file.write("\t{0, 0, 0}\n};\n")
+ module_table_file.write("\nstruct _frozen *PyImport_FrozenModules = _PyImport_FrozenModules;\n")
+
+
+def load_module_list(module_list_path):
+ return [line.strip() for line in open(module_list_path)]
+
+
+if len(sys.argv) == 4:
+ module_blob_path = make_path_directories(sys.argv[1])
+ module_table_path = make_path_directories(sys.argv[2])
+ modules_enabled = load_module_list(sys.argv[3])
+ mode2 = 'w'
+ STATIC = ''
+ EXTERN = os.path.basename(module_blob_path)[:-7]
+else:
+ module_blob_path = make_path_directories(sys.argv[1])
+ module_table_path = make_path_directories(sys.argv[1])
+ modules_enabled = load_module_list(sys.argv[2])
+ mode2 = 'a'
+ STATIC = 'static '
+ EXTERN = False
+
+
+#modules = list_modules()
+
+if 'ARCADIA_ROOT_DISTBUILD' in os.environ:
+ _SOURCE_ROOT = os.path.normpath(os.environ['ARCADIA_ROOT_DISTBUILD'])
+
+module_blobs = []
+
+with open(module_blob_path, "wb") as module_blob_file:
+ for module_name in modules_enabled:
+ #if module_name not in modules: continue
+
+ try:
+ module_path, module_file, module_is_package = module_load(module_name)
+ except ImportError as e:
+ print e
+ continue
+
+ if module_file and module_path != __file__:
+ module_blob_name = "M_" + "__".join(module_name.split("."))
+
+ module_blob = module_blob_compile(module_file, module_path)
+ module_blob_write(module_blob, module_blob_name, module_blob_file)
+ module_blob_size = len(module_blob)
+
+ if module_is_package:
+ module_blob_size = -module_blob_size
+
+ module_blobs.append((module_name, module_blob_name, module_blob_size))
+
+
+with open(module_table_path, mode2) as module_table_file:
+ module_table_write(module_blobs, module_table_file)