aboutsummaryrefslogtreecommitdiffstats
path: root/build/conf/linkers
diff options
context:
space:
mode:
authoralexv-smirnov <alex@ydb.tech>2023-03-15 19:59:12 +0300
committeralexv-smirnov <alex@ydb.tech>2023-03-15 19:59:12 +0300
commit056bb284ccf8dd6793ec3a54ffa36c4fb2b9ad11 (patch)
tree4740980126f32e3af7937ba0ca5f83e59baa4ab0 /build/conf/linkers
parent269126dcced1cc8b53eb4398b4a33e5142f10290 (diff)
downloadydb-056bb284ccf8dd6793ec3a54ffa36c4fb2b9ad11.tar.gz
add library/cpp/actors, ymake build to ydb oss export
Diffstat (limited to 'build/conf/linkers')
-rw-r--r--build/conf/linkers/ld.conf338
-rw-r--r--build/conf/linkers/msvc_linker.conf271
2 files changed, 609 insertions, 0 deletions
diff --git a/build/conf/linkers/ld.conf b/build/conf/linkers/ld.conf
new file mode 100644
index 0000000000..17985e52b3
--- /dev/null
+++ b/build/conf/linkers/ld.conf
@@ -0,0 +1,338 @@
+LDFLAGS+=$USER_LDFLAGS $_LD_FLAGS
+LDFLAGS_GLOBAL+=
+
+_START_GROUP=
+_END_GROUP=
+START_WHOLE_ARCHIVE_VALUE=
+END_WHOLE_ARCHIVE_VALUE=
+LD_STRIP_FLAG=
+_SONAME_OPTION=
+_LD_SRCS_GLOBALS=--start-wa ${rootrel;ext=.a:SRCS_GLOBAL} --end-wa ${rootrel;ext=.o:SRCS_GLOBAL} ${rootrel;ext=.supp:SRCS_GLOBAL}
+when ($OS_LINUX == "yes" || $OS_ANDROID == "yes" || $OS_CYGWIN == "yes" || $OS_NONE == "yes") {
+ _START_GROUP=-Wl,--start-group
+ _END_GROUP=-Wl,--end-group
+ START_WHOLE_ARCHIVE_VALUE=-Wl,--whole-archive
+ END_WHOLE_ARCHIVE_VALUE=-Wl,--no-whole-archive
+ LD_STRIP_FLAG=-s
+ _SONAME_OPTION=-soname
+ _LD_SRCS_GLOBALS=-Wl,--whole-archive ${rootrel;ext=.a:SRCS_GLOBAL} -Wl,--no-whole-archive ${rootrel;ext=.o:SRCS_GLOBAL} ${rootrel;ext=.supp:SRCS_GLOBAL}
+}
+
+when ($_LD_WHOLE_ARCHIVE == "yes") {
+}
+
+when ($OS_DARWIN == "yes" || $OS_IOS == "yes") {
+ _SONAME_OPTION=-install_name
+}
+
+_LD_LINKER_OUTPUT=
+_LD_LINKER_OUTPUT_FLAG=--linker-output ${output;pre=$MODULE_PREFIX;suf=$MODULE_SUFFIX$MODULE_VERSION.linker.txt:REALPRJNAME}
+
+# Enable section-level DCE (dead code elimination):
+# remove whole unused code and data sections
+# (needs `-ffunction-sections` and `-fdata-sections` to be useful)
+#
+# NOTE: CGO linker doesn't seem to support DCE, but shares common LDFLAGS
+_LD_DCE_FLAG_GC_SECTIONS=
+_LD_DCE_FLAG_PRINT_SECTIONS=
+when ($OS_DARWIN == "yes") {
+ _LD_DCE_FLAG_GC_SECTIONS=-Wl,-dead_strip
+}
+elsewhen ($OS_LINUX == "yes" || $OS_ANDROID == "yes" || $OS_NONE == "yes") {
+ _LD_DCE_FLAG_GC_SECTIONS=-Wl,--gc-sections
+ when ($LINKER_DCE_PRINT_SECTIONS == "yes") {
+ _LD_DCE_FLAG_PRINT_SECTIONS=-Wl,--print-gc-sections
+ _LD_LINKER_OUTPUT=$_LD_LINKER_OUTPUT_FLAG
+ }
+}
+LD_DCE_FLAG =
+LD_DCE_FLAG+=$_LD_DCE_FLAG_GC_SECTIONS
+LD_DCE_FLAG+=$_LD_DCE_FLAG_PRINT_SECTIONS
+DCE_FLAG=
+
+_LD_ICF_FLAG=
+_LD_ICF_FLAG_PRINT_SECTIONS=
+when ($_DEFAULT_LINKER_ID == "lld") {
+ # Enable ICF (identical code folding pass) in safe mode
+ # https://research.google/pubs/pub36912/
+ _LD_ICF_FLAG=-Wl,-icf=safe
+ when ($LINKER_ICF_PRINT_SECTIONS == "yes") {
+ _LD_ICF_FLAG_PRINT_SECTIONS=-Wl,--print-icf-sections
+ _LD_LINKER_OUTPUT=$_LD_LINKER_OUTPUT_FLAG
+ }
+}
+LD_ICF_FLAG =
+LD_ICF_FLAG+=$_LD_ICF_FLAG
+LD_ICF_FLAG+=$_LD_ICF_FLAG_PRINT_SECTIONS
+ICF_FLAG=
+
+STRIP_FLAG=
+
+C_LIBRARY_PATH=
+C_SYSTEM_LIBRARIES_INTERCEPT=
+when ($USEMPROF == "yes" || $USE_MPROF == "yes") {
+ C_SYSTEM_LIBRARIES_INTERCEPT+=-ldmalloc
+}
+
+_LD_THREAD_LIBRARY=
+when ($OS_LINUX == "yes" || $OS_DARWIN == "yes") {
+ _LD_THREAD_LIBRARY=-lpthread
+}
+
+_LD_USE_STDLIB=
+when ($_BUILD_COVERAGE == "yes" || $GCOV_COVERAGE == "yes" || $CLANG_COVERAGE == "yes" || $_BUILD_SANITIZED == "yes") {
+ _LD_USE_STDLIB=
+}
+elsewhen ($OS_ANDROID == "yes") {
+ when ($_ANDROID_NDK_VERSION_LESS_THEN_23 == "yes") {
+ # Preserve old behaviour: specify runtime libs manually
+ _LD_USE_STDLIB=-nodefaultlibs
+ }
+ otherwise {
+ # Use toolchain defaults to link with libunwind/clang_rt.builtins
+ _LD_USE_STDLIB=-nostdlib++
+ }
+}
+elsewhen ($OS_LINUX == "yes" || $OS_DARWIN == "yes" || $OS_IOS == "yes") {
+ _LD_USE_STDLIB=-nodefaultlibs
+}
+
+_C_SYSTEM_LIBRARIES=$_LD_USE_STDLIB $_LD_THREAD_LIBRARY $_LD_SYS_LIB -lc
+when ($MUSL == "yes") {
+ _C_SYSTEM_LIBRARIES=-nostdlib
+}
+C_SYSTEM_LIBRARIES=$_C_SYSTEM_LIBRARIES
+
+OBJADDE=
+
+LD_EXPORT_ALL_DYNAMIC_SYMBOLS_FLAG=
+when ($OS_LINUX == "yes" || $OS_ANDROID == "yes") {
+ LD_EXPORT_ALL_DYNAMIC_SYMBOLS_FLAG=-rdynamic
+}
+
+NO_EXPORT_DYNAMIC_SYMBOLS=
+EXPORTS_VALUE=$LD_EXPORT_ALL_DYNAMIC_SYMBOLS_FLAG
+when ($EXPORTS_FILE) {
+ EXPORTS_VALUE=$LD_EXPORT_ALL_DYNAMIC_SYMBOLS_FLAG -Wl,--version-script=${input:EXPORTS_FILE}
+}
+when ($NO_EXPORT_DYNAMIC_SYMBOLS == "yes") {
+ EXPORTS_VALUE=
+}
+
+LINKER_SCRIPT_VALUE=${ext=.ld;pre=-T:SRCS_GLOBAL}
+
+_LINKER_TIME_TRACE_GRANULARITY=500
+when ($TIME_TRACE_GRANULARITY && $TIME_TRACE_GRANULARITY != "") {
+ _LINKER_TIME_TRACE_GRANULARITY=$TIME_TRACE_GRANULARITY
+}
+
+_LINKER_TIME_TRACE_FLAG=
+when (($TIME_TRACE == "yes" || $LINKER_TIME_TRACE == "yes") && $_DEFAULT_LINKER_ID == "lld") {
+ _LINKER_TIME_TRACE_FLAG=\
+ -Wl,--time-trace \
+ -Wl,--time-trace-granularity=$_LINKER_TIME_TRACE_GRANULARITY \
+ -Wl,--time-trace-file=${output;rootrel;pre=$MODULE_PREFIX;suf=$MODULE_SUFFIX.time_trace.json:REALPRJNAME}
+}
+
+_EXE_FLAGS=\
+ $C_FLAGS_PLATFORM \
+ $BEFORE_PEERS \
+ $_START_GROUP \
+ ${rootrel:PEERS} \
+ $_END_GROUP \
+ $AFTER_PEERS \
+ $EXPORTS_VALUE \
+ $LINKER_SCRIPT_VALUE \
+ $LDFLAGS \
+ $LDFLAGS_GLOBAL \
+ $OBJADDE \
+ $OBJADDE_LIB \
+ $C_LIBRARY_PATH \
+ $C_SYSTEM_LIBRARIES_INTERCEPT \
+ $C_SYSTEM_LIBRARIES \
+ $STRIP_FLAG \
+ $DCE_FLAG \
+ $ICF_FLAG \
+ $_LINKER_TIME_TRACE_FLAG
+
+_SONAME_FLAG=-Wl,$_SONAME_OPTION,$_SONAME
+_SHARED_FLAG=-shared
+_EXEC_SHARED_FLAG=
+when ($OS_LINUX == "yes") {
+ _EXEC_SHARED_FLAG=-pie -fPIE -Wl,--unresolved-symbols=ignore-all -rdynamic
+}
+
+_LD_ENV_STYLE=${cwd:ARCADIA_BUILD_ROOT} $TOOLCHAIN_ENV ${kv;hide:"p LD"} ${kv;hide:"pc light-blue"} ${kv;hide:"show_out"}
+
+# Program
+GENERATE_MF_CMD=\
+ $YMAKE_PYTHON ${input:"build/scripts/generate_mf.py"} ${input;hide:"build/scripts/process_command_files.py"} \
+ --build-root $ARCADIA_BUILD_ROOT \
+ --module-name $REALPRJNAME \
+ -o ${output;rootrel;pre=$MODULE_PREFIX;suf=$MODULE_SUFFIX.mf:REALPRJNAME} \
+ -t $MODULE_TYPE \
+ --ya-start-command-file \
+ -Ya,lics $LICENSE_NAMES \
+ -Ya,peers ${rootrel:PEERS} \
+ -Ya,credits ${input:CREDITS_TEXTS_FILE} $CREDITS_FLAGS \
+ --ya-end-command-file
+
+LINK_SCRIPT_EXE_FLAGS=
+
+REAL_LINK_EXE_CMDLINE =\
+ $YMAKE_PYTHON ${input:"build/scripts/link_exe.py"} \
+ --source-root $ARCADIA_ROOT
+ REAL_LINK_EXE_CMDLINE+=$_LD_LINKER_OUTPUT
+ REAL_LINK_EXE_CMDLINE+=\
+ ${pre=--whole-archive-peers :WHOLE_ARCHIVE_PEERS} \
+ ${pre=--whole-archive-libs :_WHOLE_ARCHIVE_LIBS_VALUE_GLOBAL} \
+ $_LD_ARCH_FLAG \
+ $LINK_SCRIPT_EXE_FLAGS \
+ $CXX_COMPILER \
+ $_LD_SRCS_GLOBALS \
+ $VCS_C_OBJ $AUTO_INPUT -o $TARGET \
+ $_EXE_FLAGS \
+ $_LD_ENV_STYLE
+
+REAL_LINK_EXE_TIDY=\
+ $YMAKE_PYTHON ${input:"build/scripts/clang_tidy_arch.py"} \
+ --build-root $ARCADIA_BUILD_ROOT \
+ --source-root $ARCADIA_ROOT \
+ --output-file $TARGET \
+ $AUTO_INPUT \
+ $_LD_ENV_STYLE
+
+# Executable Shared Library
+
+REAL_LINK_EXEC_DYN_LIB_CMDLINE =\
+ $YMAKE_PYTHON ${input:"build/scripts/link_dyn_lib.py"} \
+ --target $TARGET
+REAL_LINK_EXEC_DYN_LIB_CMDLINE+=$_LD_LINKER_OUTPUT
+REAL_LINK_EXEC_DYN_LIB_CMDLINE+=\
+ ${pre=--whole-archive-peers :WHOLE_ARCHIVE_PEERS} \
+ ${pre=--whole-archive-libs :_WHOLE_ARCHIVE_LIBS_VALUE_GLOBAL} \
+ $_LD_ARCH_FLAG \
+ $LINK_DYN_LIB_FLAGS \
+ $CXX_COMPILER \
+ $_LD_SRCS_GLOBALS \
+ $VCS_C_OBJ $AUTO_INPUT -o $TARGET \
+ $_EXEC_SHARED_FLAG \
+ $_SONAME_FLAG \
+ $_EXE_FLAGS \
+ $_LD_ENV_STYLE
+
+REAL_LINK_EXEC_DYN_LIB=$REAL_LINK_EXEC_DYN_LIB_IMPL($_WHOLE_ARCHIVE_PEERS_VALUE)
+
+# Shared Library
+
+LINK_DYN_LIB_FLAGS=
+
+REAL_LINK_DYN_LIB_CMDLINE =\
+ $YMAKE_PYTHON ${input:"build/scripts/link_dyn_lib.py"} \
+ --target $TARGET
+REAL_LINK_DYN_LIB_CMDLINE+=$_LD_LINKER_OUTPUT
+REAL_LINK_DYN_LIB_CMDLINE+=\
+ ${pre=--whole-archive-peers :WHOLE_ARCHIVE_PEERS} \
+ ${pre=--whole-archive-libs :_WHOLE_ARCHIVE_LIBS_VALUE_GLOBAL} \
+ $_LD_ARCH_FLAG \
+ $LINK_DYN_LIB_FLAGS \
+ $CXX_COMPILER \
+ $_LD_SRCS_GLOBALS \
+ $VCS_C_OBJ $AUTO_INPUT -o $TARGET \
+ $_SHARED_FLAG \
+ $_SONAME_FLAG \
+ $_EXE_FLAGS \
+ $_LD_ENV_STYLE
+
+REAL_LINK_DYN_LIB=$REAL_LINK_DYN_LIB_IMPL($_WHOLE_ARCHIVE_PEERS_VALUE)
+
+_DWARF_COMMAND=
+when ($OS_DARWIN == "yes" && $NO_DEBUGINFO != "yes" && $SPLIT_DWARF_VALUE != "no" && $NO_SPLIT_DWARF != "yes") {
+ _DWARF_COMMAND=$DWARF_TOOL $TARGET -o ${output;pre=$MODULE_PREFIX$REALPRJNAME.dSYM/Contents/Resources/DWARF/$MODULE_PREFIX:REALPRJNAME} $_LD_ENV_STYLE
+}
+elsewhen ($OS_DARWIN == "yes" && $NO_DEBUGINFO != "yes") {
+ _EXE_FLAGS+=$DEBUG_INFO_FLAGS
+}
+otherwise {
+ _DWARF_COMMAND=
+}
+DWARF_COMMAND=$_DWARF_COMMAND
+
+_REAL_LINK_EXE=$REAL_LINK_EXE_IMPL($_WHOLE_ARCHIVE_PEERS_VALUE)
+_LINK_EXE=$GENERATE_MF && $GENERATE_VCS_C_INFO_NODEP && $REAL_LINK_EXE && $DWARF_COMMAND && $LINK_ADDITIONAL_SECTIONS_COMMAND && $PACK_IOS_CMD
+_LINK_DYN_LIB=$GENERATE_MF && $GENERATE_VCS_C_INFO_NODEP && $REAL_LINK_DYN_LIB && $DWARF_COMMAND && $LINK_ADDITIONAL_SECTIONS_COMMAND
+when ($TIDY == "yes") {
+ _REAL_LINK_EXE=$REAL_LINK_EXE_TIDY
+ _LINK_EXE=$REAL_LINK_EXE
+ _LINK_DYN_LIB=$REAL_LINK_EXE
+}
+REAL_LINK_EXE=$_REAL_LINK_EXE
+LINK_EXE=$_LINK_EXE
+LINK_DYN_LIB=$_LINK_DYN_LIB
+
+LINK_EXEC_DYN_LIB=\
+ $GENERATE_MF && \
+ $GENERATE_VCS_C_INFO_NODEP && \
+ $REAL_LINK_EXEC_DYN_LIB && \
+ $DWARF_COMMAND && \
+ $LINK_ADDITIONAL_SECTIONS_COMMAND
+
+SWIG_DLL_JAR_CMD=\
+ $GENERATE_MF && \
+ $GENERATE_VCS_C_INFO_NODEP && \
+ $REAL_SWIG_DLL_JAR_CMD && \
+ $DWARF_COMMAND
+
+_LD_TAIL_LINK_LIB=$AUTO_INPUT ${kv;hide:"p AR"} $TOOLCHAIN_ENV ${kv;hide:"pc light-red"} ${kv;hide:"show_out"}
+_LD_ARCHIVER=$YMAKE_PYTHON ${input:"build/scripts/link_lib.py"} ${quo:AR_TOOL} $AR_TYPE $_LD_LLVM_AR_FORMAT $ARCADIA_BUILD_ROOT $_LD_AR_PLUGIN
+_LD_LIB_GENERATE_MF=$GENERATE_MF &&
+when ($TIDY == "yes") {
+ _LD_ARCHIVER=$YMAKE_PYTHON ${input:"build/scripts/clang_tidy_arch.py"} --source-root $ARCADIA_ROOT --build-root $ARCADIA_BUILD_ROOT --output-file
+ _LD_LIB_GENERATE_MF=
+}
+LINK_LIB=$_LD_LIB_GENERATE_MF $_LD_ARCHIVER $TARGET $_LD_TAIL_LINK_LIB
+GLOBAL_LINK_LIB=$_LD_ARCHIVER $GLOBAL_TARGET $_LD_TAIL_LINK_LIB
+
+# "Fat Object" : pre-linked global objects and static library with all dependencies
+_LD_LINK_FAT_PREFIX=$GENERATE_MF && $GENERATE_VCS_C_INFO_NODEP && $YMAKE_PYTHON ${input:"build/scripts/link_fat_obj.py"} --build-root $ARCADIA_BUILD_ROOT
+_LD_LINK_FAT_SRCS_GLOBALS_WA=$_LD_SRCS_GLOBALS
+_LD_LINK_FAT_SRCS_GLOBALS_NO_WA=${rootrel;ext=.a:SRCS_GLOBAL} ${rootrel;ext=.o:SRCS_GLOBAL}
+
+_LD_LINK_FAT_SUFFIX1=$_LD_ARCH_FLAG \
+ -Ya,input $AUTO_INPUT $VCS_C_OBJ \
+ -Ya,global_srcs
+
+_LD_LINK_FAT_SUFFIX2=-Ya,peers $PEERS \
+ -Ya,linker $CXX_COMPILER \
+ $LDFLAGS_GLOBAL $C_FLAGS_PLATFORM $LD_SDK_VERSION \
+ -Ya,archiver $_LD_ARCHIVER \
+ $TOOLCHAIN_ENV ${kv;hide:"p LD"} ${kv;hide:"pc light-blue"} ${kv;hide:"show_out"}
+
+LINK_FAT_OBJECT=\
+ $_LD_LINK_FAT_PREFIX \
+ --obj=$TARGET --lib=${output:REALPRJNAME.a} \
+ $_LD_LINK_FAT_SUFFIX1 \
+ $_LD_LINK_FAT_SRCS_GLOBALS_WA \
+ $_LD_LINK_FAT_SUFFIX2
+
+LINK_RECURSIVE_LIBRARY=\
+ $_LD_LINK_FAT_PREFIX \
+ --lib=$TARGET --with-own-obj --with-global-srcs \
+ $_LD_LINK_FAT_SUFFIX1 \
+ $_LD_LINK_FAT_SRCS_GLOBALS_NO_WA \
+ $_LD_LINK_FAT_SUFFIX2
+
+LINK_FAT_OBJECT_LIBRARY=\
+ $_LD_LINK_FAT_PREFIX \
+ --lib=$TARGET $FAT_OBJECT_ARGS $FAT_OBJECT_OUTS \
+ $_LD_LINK_FAT_SUFFIX1 \
+ $_LD_LINK_FAT_SRCS_GLOBALS_NO_WA \
+ $_LD_LINK_FAT_SUFFIX2
+
+LIBRT=-lrt
+MD5LIB=-lcrypt
+LIBRESOLV=
+when ($OS_LINUX || $OS_DARWIN || $OS_ANDROID) {
+ LIBRESOLV=-lresolv
+}
+PROFFLAG=-pg
diff --git a/build/conf/linkers/msvc_linker.conf b/build/conf/linkers/msvc_linker.conf
new file mode 100644
index 0000000000..9f852b1ef4
--- /dev/null
+++ b/build/conf/linkers/msvc_linker.conf
@@ -0,0 +1,271 @@
+_MSVC_ARCH=
+when ($ARCH_I386 == "yes" || $ARCH_I686 == "yes") {
+ _MSVC_ARCH=x86
+}
+elsewhen ($ARCH_X86_64 == "yes") {
+ _MSVC_ARCH=x64
+}
+elsewhen ($ARCH_ARM == "yes") {
+ _MSVC_ARCH=arm
+}
+
+_FLAGS_MACHINE=/MACHINE:${toupper:_MSVC_ARCH}
+
+_FLAGS_IGNORE=/IGNORE:4221
+
+_FLAGS_COMMON_IDE_MSVS=
+when ($IDE_MSVS == "yes") {
+ _FLAGS_COMMON_IDE_MSVS=/INCREMENTAL
+}
+otherwise {
+ _FLAGS_COMMON_IDE_MSVS=/INCREMENTAL:NO
+}
+
+# TODO(nslus): DEVTOOLS-1868 remove restriction.
+_FLAGS_DEBUG_ONLY_DEBUG=
+_FLAGS_RELEASE_ONLY_DEBUG=
+_FLAGS_COMMON_DEBUG=
+when (!$NO_DEBUGINFO || $NO_DEBUGINFO == "no" || $NO_DEBUGINFO == "0") {
+ when ($IDE_MSVS == "yes") {
+ when ($CLANG_CL == "yes") {
+ _FLAGS_DEBUG_ONLY_DEBUG=/DEBUG
+ }
+ otherwise {
+ _FLAGS_DEBUG_ONLY_DEBUG=/DEBUG:FASTLINK
+ }
+ _FLAGS_RELEASE_ONLY_DEBUG=/DEBUG
+ }
+ otherwise {
+ _FLAGS_COMMON_DEBUG=/DEBUG
+ }
+}
+
+_FLAGS_COMMON_LIBPATHS=
+when ($IDE_MSVS != "yes") {
+ _FLAGS_COMMON_LIBPATHS=\
+ /LIBPATH:"$_MSVC_TC_KIT_LIBS/um/$_MSVC_ARCH" \
+ /LIBPATH:"$_MSVC_TC_KIT_LIBS/ucrt/$_MSVC_ARCH" \
+ /LIBPATH:"$_MSVC_TC_VC_ROOT/lib/$_MSVC_ARCH"
+}
+
+_FLAGS_COMMON =/NOLOGO /ERRORREPORT:PROMPT /SUBSYSTEM:CONSOLE /TLBID:1 $MSVC_DYNAMICBASE /NXCOMPAT
+_FLAGS_COMMON+=$_FLAGS_IGNORE
+_FLAGS_COMMON+=$_FLAGS_MACHINE
+_FLAGS_COMMON+=$_FLAGS_COMMON_IDE_MSVS
+_FLAGS_COMMON+=$_FLAGS_COMMON_DEBUG
+_FLAGS_COMMON+=$_FLAGS_COMMON_LIBPATHS
+
+_FLAGS_DEBUG_ONLY_CLANG_CL=
+when ($CLANG_CL == "yes") {
+ _FLAGS_DEBUG_ONLY_CLANG_CL=/STACK:4194304
+}
+
+_FLAGS_DEBUG_ONLY =$_FLAGS_DEBUG_ONLY_CLANG_CL
+_FLAGS_DEBUG_ONLY+=$_FLAGS_DEBUG_ONLY_DEBUG
+_FLAGS_RELEASE_ONLY =$_FLAGS_RELEASE_ONLY_DEBUG
+
+LINK_EXE_FLAGS_DEBUG =$_FLAGS_COMMON
+LINK_EXE_FLAGS_DEBUG+=$_FLAGS_DEBUG_ONLY
+
+LINK_EXE_FLAGS_RELEASE =$_FLAGS_COMMON
+LINK_EXE_FLAGS_RELEASE+=$_FLAGS_RELEASE_ONLY
+
+LINK_LIB_FLAGS=$_FLAGS_IGNORE $_FLAGS_MACHINE
+
+LINK_STDLIBS=\
+ advapi32.lib \
+ comdlg32.lib \
+ crypt32.lib \
+ dnsapi.lib \
+ gdi32.lib \
+ iphlpapi.lib \
+ kernel32.lib \
+ mswsock.lib \
+ ole32.lib \
+ oleaut32.lib \
+ psapi.lib \
+ rpcrt4.lib \
+ secur32.lib \
+ shell32.lib \
+ shlwapi.lib \
+ user32.lib \
+ userenv.lib \
+ uuid.lib \
+ version.lib \
+ winmm.lib \
+ winspool.lib \
+ ws2_32.lib
+
+LDFLAGS_GLOBAL=
+LDFLAGS=
+OBJADDE=
+
+LINK_EXE_FLAGS=$LINK_EXE_FLAGS_PER_TYPE
+
+LINK_IMPLIB=/IMPLIB:${output;noext;rootrel;pre=$MODULE_PREFIX:REALPRJNAME.lib}
+_LINK_EXTRA_OUTPUT=
+when (!$NO_DEBUGINFO || $NO_DEBUGINFO == "no" || $NO_DEBUGINFO == "0") {
+ _LINK_EXTRA_OUTPUT=/PDB:${output;noext;rootrel;pre=$MODULE_PREFIX:REALPRJNAME.pdb}
+}
+LINK_EXTRA_OUTPUT=$_LINK_EXTRA_OUTPUT
+
+LIB_WRAPPER=${FIX_MSVC_OUTPUT} lib
+LINK_WRAPPER=${FIX_MSVC_OUTPUT} link
+when ($_UNDER_WINE == "yes") {
+ LIB_WRAPPER=
+ LINK_WRAPPER=
+}
+
+LINK_WRAPPER_DYNLIB=${YMAKE_PYTHON} ${input:"build/scripts/link_dyn_lib.py"} --arch WINDOWS --target $TARGET
+
+EXPORTS_VALUE=
+LINK_IMPLIB_VALUE=
+when ($EXPORTS_FILE) {
+ LINK_IMPLIB_VALUE=$LINK_IMPLIB
+ EXPORTS_VALUE=/DEF:${input:EXPORTS_FILE}
+}
+
+GENERATE_MF_CMD=\
+ $YMAKE_PYTHON ${input:"build/scripts/generate_mf.py"} ${input;hide:"build/scripts/process_command_files.py"} \
+ --build-root $ARCADIA_BUILD_ROOT \
+ --module-name $REALPRJNAME \
+ -o ${output;rootrel;pre=$MODULE_PREFIX;suf=$MODULE_SUFFIX.mf:REALPRJNAME} \
+ -t $MODULE_TYPE \
+ --ya-start-command-file \
+ -Ya,lics $LICENSE_NAMES \
+ -Ya,peers ${rootrel:PEERS} \
+ -Ya,credits ${input:CREDITS_TEXTS_FILE} $CREDITS_FLAGS \
+ --ya-end-command-file
+
+# we split srcs_global into two groups: libs and objs
+# # each group can be in its own command file
+# first group need /WHOLEARCHIVE: prefix which will be added in fix_msvc_output.py or run_msvc_wine.py
+# the tail of link commands will be added in the third command file
+_MSVC_SRCS_GLOBALS=\
+--start-wa --ya-start-command-file ${qe;rootrel;ext=.lib:SRCS_GLOBAL} --ya-end-command-file --end-wa \
+--ya-start-command-file ${qe;rootrel;ext=.obj:SRCS_GLOBAL} --ya-end-command-file
+
+REAL_LINK_DYN_LIB_CMDLINE=\
+ ${TOOLCHAIN_ENV} \
+ ${cwd:ARCADIA_BUILD_ROOT} \
+ ${LINK_WRAPPER} \
+ ${LINK_WRAPPER_DYNLIB} \
+ ${LINK_EXE_CMD} \
+ ${LINK_IMPLIB_VALUE} \
+ /DLL \
+ /OUT:${qe;rootrel:TARGET} \
+ ${LINK_EXTRA_OUTPUT} \
+ ${EXPORTS_VALUE} \
+ ${pre=--whole-archive-peers :WHOLE_ARCHIVE_PEERS} \
+ ${pre=--whole-archive-libs :_WHOLE_ARCHIVE_LIBS_VALUE_GLOBAL} \
+ $_MSVC_SRCS_GLOBALS \
+ --ya-start-command-file \
+ ${VCS_C_OBJ_RR} \
+ ${qe;rootrel:AUTO_INPUT} \
+ ${qe;rootrel;ext=.lib:PEERS} ${qe;rootrel;ext=.dll;noext;suf=.lib:PEERS} \
+ $LINK_EXE_FLAGS \
+ $LINK_STDLIBS $LDFLAGS \
+ $LDFLAGS_GLOBAL \
+ $OBJADDE \
+ --ya-end-command-file
+
+REAL_LINK_DYN_LIB=$REAL_LINK_DYN_LIB_IMPL($_WHOLE_ARCHIVE_PEERS_VALUE)
+
+SWIG_DLL_JAR_CMD=$GENERATE_MF && $GENERATE_VCS_C_INFO_NODEP && $REAL_SWIG_DLL_JAR_CMD
+
+_MSVC_HEAD_LINK_LIB=${TOOLCHAIN_ENV} ${cwd:ARCADIA_BUILD_ROOT} ${LIB_WRAPPER} ${LINK_LIB_CMD}
+_MSVC_TAIL_LINK_LIB=\
+ --ya-start-command-file \
+ ${qe;rootrel:AUTO_INPUT} \
+ $LINK_LIB_FLAGS \
+ --ya-end-command-file \
+ ${hide;kv:"soe"} ${hide;kv:"p AR"} ${hide;kv:"pc light-red"}
+
+LINK_LIB=${GENERATE_MF} && $_MSVC_HEAD_LINK_LIB /OUT:${qe;rootrel:TARGET} $_MSVC_TAIL_LINK_LIB
+GLOBAL_LINK_LIB=$_MSVC_HEAD_LINK_LIB /OUT:${qe;rootrel:GLOBAL_TARGET} $_MSVC_TAIL_LINK_LIB
+
+LINK_EXE_CMDLINE=\
+ ${GENERATE_MF} && \
+ $GENERATE_VCS_C_INFO_NODEP && \
+ ${TOOLCHAIN_ENV} \
+ ${cwd:ARCADIA_BUILD_ROOT} \
+ ${LINK_WRAPPER} \
+ ${LINK_EXE_CMD} \
+ /OUT:${qe;rootrel:TARGET} \
+ ${pre=--whole-archive-peers :WHOLE_ARCHIVE_PEERS} \
+ ${pre=--whole-archive-libs :_WHOLE_ARCHIVE_LIBS_VALUE_GLOBAL} \
+ ${LINK_EXTRA_OUTPUT} \
+ $_MSVC_SRCS_GLOBALS \
+ --ya-start-command-file \
+ ${VCS_C_OBJ_RR} \
+ ${qe;rootrel:AUTO_INPUT} \
+ $LINK_EXE_FLAGS \
+ $LINK_STDLIBS \
+ $LDFLAGS \
+ $LDFLAGS_GLOBAL \
+ $OBJADDE \
+ ${qe;rootrel;ext=.lib:PEERS} ${qe;rootrel;ext=.dll;noext;suf=.lib:PEERS} \
+ --ya-end-command-file \
+ ${hide;kv:"soe"} ${hide;kv:"p LD"} ${hide;kv:"pc blue"}
+
+LINK_EXE=$LINK_EXE_IMPL($_WHOLE_ARCHIVE_PEERS_VALUE)
+
+LINK_DYN_LIB=${GENERATE_MF} && $GENERATE_VCS_C_INFO_NODEP && $REAL_LINK_DYN_LIB ${hide;kv:"soe"} ${hide;kv:"p LD"} ${hide;kv:"pc blue"}
+
+LINK_EXEC_DYN_LIB_CMDLINE=\
+ ${GENERATE_MF} && \
+ $GENERATE_VCS_C_INFO_NODEP && \
+ ${TOOLCHAIN_ENV} \
+ ${cwd:ARCADIA_BUILD_ROOT} \
+ ${LINK_WRAPPER} \
+ ${LINK_WRAPPER_DYNLIB} \
+ ${LINK_EXE_CMD} \
+ /OUT:${qe;rootrel:TARGET} \
+ ${LINK_EXTRA_OUTPUT} \
+ ${EXPORTS_VALUE} \
+ ${pre=--whole-archive-peers :WHOLE_ARCHIVE_PEERS} \
+ ${pre=--whole-archive-libs :_WHOLE_ARCHIVE_LIBS_VALUE_GLOBAL} \
+ $_MSVC_SRCS_GLOBALS \
+ '--ya-start-command-file \
+ ${VCS_C_OBJ_RR} \
+ ${qe;rootrel:AUTO_INPUT} \
+ ${qe;rootrel;ext=.lib:PEERS} ${qe;rootrel;ext=.dll;noext;suf=.lib:PEERS} \
+ $LINK_EXE_FLAGS \
+ $LINK_STDLIBS \
+ $LDFLAGS $LDFLAGS_GLOBAL \
+ $OBJADDE \
+ --ya-end-command-file \
+ ${hide;kv:"soe"} ${hide;kv:"p LD"} ${hide;kv:"pc blue"}
+
+LINK_EXEC_DYN_LIB=$LINK_EXEC_DYN_LIB_IMPL($_WHOLE_ARCHIVE_PEERS_VALUE)
+
+LINK_GLOBAL_FAT_OBJECT=\
+ ${TOOLCHAIN_ENV} \
+ ${cwd:ARCADIA_BUILD_ROOT} \
+ ${LIB_WRAPPER} \
+ ${LINK_LIB_CMD} \
+ /OUT:${qe;rootrel:TARGET} \
+ --ya-start-command-file \
+ ${qe;rootrel;ext=.lib:SRCS_GLOBAL} \
+ ${qe;rootrel;ext=.obj:SRCS_GLOBAL} \
+ ${qe;rootrel:AUTO_INPUT} \
+ $LINK_LIB_FLAGS \
+ --ya-end-command-file
+
+LINK_PEERS_FAT_OBJECT=\
+ ${TOOLCHAIN_ENV} \
+ ${cwd:ARCADIA_BUILD_ROOT} \
+ ${LIB_WRAPPER} \
+ ${LINK_LIB_CMD} \
+ /OUT:${qe;rootrel;output:REALPRJNAME.lib} \
+ --ya-start-command-file \
+ ${qe;rootrel:PEERS} \
+ $LINK_LIB_FLAGS \
+ --ya-end-command-file
+
+LINK_FAT_OBJECT=\
+ ${GENERATE_MF} && \
+ $GENERATE_VCS_C_INFO_NODEP && \
+ $LINK_GLOBAL_FAT_OBJECT && \
+ $LINK_PEERS_FAT_OBJECT \
+ ${kv;hide:"p LD"} ${kv;hide:"pc light-blue"} ${kv;hide:"show_out"}