aboutsummaryrefslogtreecommitdiffstats
path: root/build/scripts/fix_py2_protobuf.py
diff options
context:
space:
mode:
authormikhnenko <mikhnenko@yandex-team.com>2024-05-29 09:34:12 +0300
committermikhnenko <mikhnenko@yandex-team.com>2024-05-29 09:51:01 +0300
commit2b58663bc4bdccdb1a66be41b4a5024e30129676 (patch)
tree49dd654882cdfcef7807c0968416ea8e4a7e062d /build/scripts/fix_py2_protobuf.py
parent641d8332d02a38f849b08161a53860b221667e14 (diff)
downloadydb-2b58663bc4bdccdb1a66be41b4a5024e30129676.tar.gz
Add renaming py2-proto-symbols to all needed linking scripts
b7ff75f77e1a1818aac0062ec06948dad92af1bc
Diffstat (limited to 'build/scripts/fix_py2_protobuf.py')
-rw-r--r--build/scripts/fix_py2_protobuf.py113
1 files changed, 113 insertions, 0 deletions
diff --git a/build/scripts/fix_py2_protobuf.py b/build/scripts/fix_py2_protobuf.py
new file mode 100644
index 0000000000..06e81ed648
--- /dev/null
+++ b/build/scripts/fix_py2_protobuf.py
@@ -0,0 +1,113 @@
+import subprocess
+import os
+
+import process_command_files as pcf
+
+
+def run(*args):
+ # print >>sys.stderr, args
+ return subprocess.check_output(list(args), shell=False).strip()
+
+
+def gen_renames_1(d):
+ for l in d.split('\n'):
+ l = l.strip()
+
+ if ' ' in l:
+ yield l.split(' ')[-1]
+
+
+def gen_renames_2(p, d):
+ for s in gen_renames_1(d):
+ yield s + ' ' + p + s
+
+
+def gen_renames(p, d):
+ return '\n'.join(gen_renames_2(p, d)).strip() + '\n'
+
+
+def rename_syms(where, ret, libs):
+ p = 'py2_'
+
+ # join libs
+ run(where + 'llvm-ar', 'qcL', ret, *libs)
+
+ # find symbols to rename
+ syms = run(where + 'llvm-nm', '--extern-only', '--defined-only', '-A', ret)
+
+ # prepare rename plan
+ renames = gen_renames(p, syms)
+
+ with open('syms', 'w') as f:
+ f.write(renames)
+
+ # rename symbols
+ run(where + 'llvm-objcopy', '--redefine-syms=syms', ret)
+
+ # back-rename some symbols
+ args = [
+ where + 'llvm-objcopy',
+ '--redefine-sym',
+ p + 'init_api_implementation=init6google8protobuf8internal19_api_implementation',
+ '--redefine-sym',
+ p + 'init_message=init6google8protobuf5pyext8_message',
+ '--redefine-sym',
+ p + 'init6google8protobuf8internal19_api_implementation=init6google8protobuf8internal19_api_implementation',
+ '--redefine-sym',
+ p + 'init6google8protobuf5pyext8_message=init6google8protobuf5pyext8_message',
+ '--redefine-sym',
+ p + '_init6google8protobuf8internal19_api_implementation=_init6google8protobuf8internal19_api_implementation',
+ '--redefine-sym',
+ p + '_init6google8protobuf5pyext8_message=_init6google8protobuf5pyext8_message',
+ ret,
+ ]
+
+ run(*args)
+ return ret
+
+
+def fix_py2(cmd, have_comand_files=False, prefix='lib', suffix='a'):
+ args = cmd
+ if have_comand_files:
+ args = pcf.get_args(cmd)
+ if 'protobuf_old' not in str(args):
+ return cmd
+
+ py2_libs = [prefix + 'contrib-libs-protobuf_old.' + suffix, prefix + 'pypython-protobuf-py2.' + suffix]
+
+ def need_rename(x):
+ for v in py2_libs:
+ if v in x:
+ return True
+
+ return False
+
+ old = []
+ lib = []
+
+ where = os.path.dirname(cmd[0]) + '/'
+
+ for x in args:
+ if need_rename(x):
+ lib.append(x)
+ else:
+ old.append(x)
+
+ name = rename_syms(where, 'libprotoherobora.' + suffix, lib)
+
+ if not have_comand_files:
+ return old + [name]
+
+ for file in cmd:
+ if pcf.is_cmdfile_arg(file):
+ cmd_file_path = pcf.cmdfile_path(file)
+ args = pcf.read_from_command_file(cmd_file_path)
+ if not 'protobuf_old' in str(args):
+ continue
+ with open(cmd_file_path, 'w') as afile:
+ for arg in args:
+ if not need_rename(arg):
+ afile.write(arg + '\n')
+ afile.write(name)
+
+ return cmd