diff options
author | mikhnenko <mikhnenko@yandex-team.com> | 2024-05-29 09:34:12 +0300 |
---|---|---|
committer | mikhnenko <mikhnenko@yandex-team.com> | 2024-05-29 09:51:01 +0300 |
commit | 2b58663bc4bdccdb1a66be41b4a5024e30129676 (patch) | |
tree | 49dd654882cdfcef7807c0968416ea8e4a7e062d /build/scripts/fix_py2_protobuf.py | |
parent | 641d8332d02a38f849b08161a53860b221667e14 (diff) | |
download | ydb-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.py | 113 |
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 |