diff options
author | alexv-smirnov <alex@ydb.tech> | 2023-03-15 19:59:12 +0300 |
---|---|---|
committer | alexv-smirnov <alex@ydb.tech> | 2023-03-15 19:59:12 +0300 |
commit | 056bb284ccf8dd6793ec3a54ffa36c4fb2b9ad11 (patch) | |
tree | 4740980126f32e3af7937ba0ca5f83e59baa4ab0 /build/scripts/link_fat_obj.py | |
parent | 269126dcced1cc8b53eb4398b4a33e5142f10290 (diff) | |
download | ydb-056bb284ccf8dd6793ec3a54ffa36c4fb2b9ad11.tar.gz |
add library/cpp/actors, ymake build to ydb oss export
Diffstat (limited to 'build/scripts/link_fat_obj.py')
-rw-r--r-- | build/scripts/link_fat_obj.py | 91 |
1 files changed, 91 insertions, 0 deletions
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() |