From 056bb284ccf8dd6793ec3a54ffa36c4fb2b9ad11 Mon Sep 17 00:00:00 2001
From: alexv-smirnov <alex@ydb.tech>
Date: Wed, 15 Mar 2023 19:59:12 +0300
Subject: add library/cpp/actors, ymake build to ydb oss export

---
 build/scripts/link_fat_obj.py | 91 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 91 insertions(+)
 create mode 100644 build/scripts/link_fat_obj.py

(limited to 'build/scripts/link_fat_obj.py')

diff --git a/build/scripts/link_fat_obj.py b/build/scripts/link_fat_obj.py
new file mode 100644
index 0000000000..c189668b9e
--- /dev/null
+++ b/build/scripts/link_fat_obj.py
@@ -0,0 +1,91 @@
+import argparse
+import subprocess
+import sys
+
+from process_whole_archive_option import ProcessWholeArchiveOption
+
+YA_ARG_PREFIX = '-Ya,'
+
+
+def get_args():
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--obj')
+    parser.add_argument('--globals-lib')
+    parser.add_argument('--lib', required=True)
+    parser.add_argument('--arch', required=True)
+    parser.add_argument('--build-root', default=None)
+    parser.add_argument('--with-own-obj', action='store_true', default=False)
+    parser.add_argument('--with-global-srcs', action='store_true', default=False)
+
+    groups = {}
+    args_list = groups.setdefault('default', [])
+    for arg in sys.argv[1:]:
+        if arg == '--with-own-obj':
+            groups['default'].append(arg)
+        elif arg == '--globals-lib':
+            groups['default'].append(arg)
+        elif arg == '--with-global-srcs':
+            groups['default'].append(arg)
+        elif arg.startswith(YA_ARG_PREFIX):
+            group_name = arg[len(YA_ARG_PREFIX):]
+            args_list = groups.setdefault(group_name, [])
+        else:
+            args_list.append(arg)
+
+    return parser.parse_args(groups['default']), groups
+
+
+def strip_suppression_files(srcs):
+    return [s for s in srcs if not s.endswith('.supp')]
+
+
+def main():
+    args, groups = get_args()
+
+    # Inputs
+    auto_input = groups['input']
+
+    # Outputs
+    lib_output = args.lib
+    obj_output = args.obj
+
+    # Dependencies
+    global_srcs = groups['global_srcs']
+    global_srcs = strip_suppression_files(global_srcs)
+    global_srcs = ProcessWholeArchiveOption(args.arch).construct_cmd(global_srcs)
+    peers = groups['peers']
+
+    # Tools
+    linker = groups['linker']
+    archiver = groups['archiver']
+
+    do_link = linker + ['-o', obj_output, '-Wl,-r', '-nodefaultlibs', '-nostartfiles'] + global_srcs + auto_input
+    do_archive = archiver + [lib_output] + peers
+    do_globals = None
+    if args.globals_lib:
+        do_globals = archiver + [args.globals_lib] + auto_input + global_srcs
+    if args.with_own_obj:
+        do_archive += auto_input
+    if args.with_global_srcs:
+        do_archive += global_srcs
+
+    def call(c):
+        proc = subprocess.Popen(c, shell=False, stderr=sys.stderr, stdout=sys.stdout, cwd=args.build_root)
+        proc.communicate()
+        return proc.returncode
+
+    if obj_output:
+        link_res = call(do_link)
+        if link_res:
+            sys.exit(link_res)
+
+    if do_globals:
+        glob_res = call(do_globals)
+        if glob_res:
+            sys.exit(glob_res)
+
+    sys.exit(call(do_archive))
+
+
+if __name__ == '__main__':
+    main()
-- 
cgit v1.2.3