Browse Source

Use lld-link for target-platform windows once again
da1125f4b9b5aebe87b610dd1e1a61864ba500cf

mikhnenko 10 months ago
parent
commit
6c78e22d15

+ 19 - 1
build/conf/linkers/msvc_linker.conf

@@ -106,6 +106,21 @@ OBJADDE_LIB=
 OBJADDE_LIB_GLOBAL=
 
 LINK_EXE_FLAGS=$LINK_EXE_FLAGS_PER_TYPE
+LINK_EXE_VFS_FLAGS=
+when ($_UNDER_WINE_LINK != "yes") {
+    LINK_EXE_VFS_FLAGS=/vfsoverlay:${BINDIR}/vfsoverlay.yaml
+}
+LINK_EXE_FLAGS+=${LINK_EXE_VFS_FLAGS}
+
+GENERATE_COMMON_LIB_VFS_CMD=\
+    ${YMAKE_PYTHON3} ${input:"build/scripts/generate_win_vfs.py"} \
+    ${BINDIR} \
+    ${_FLAGS_COMMON_LIBPATHS}
+
+GENERATE_COMMON_LIB_VFS=
+when ($_UNDER_WINE_LINK != "yes") {
+    GENERATE_COMMON_LIB_VFS=${GENERATE_COMMON_LIB_VFS_CMD}
+}
 
 LINK_IMPLIB=/IMPLIB:${output;noext;rootrel;pre=$MODULE_PREFIX:REALPRJNAME.lib}
 _LINK_EXTRA_OUTPUT=
@@ -116,7 +131,7 @@ LINK_EXTRA_OUTPUT=$_LINK_EXTRA_OUTPUT
 
 LIB_WRAPPER=${FIX_MSVC_OUTPUT} lib
 LINK_WRAPPER=${FIX_MSVC_OUTPUT} link
-when ($_UNDER_WINE_TOOLS == "yes") {
+when ($_UNDER_WINE_LINK == "yes") {
     LINK_WRAPPER=
 }
 when ($_UNDER_WINE_LIB == "yes") {
@@ -156,6 +171,7 @@ _MSVC_SRCS_GLOBALS=\
 --ya-start-command-file ${qe;rootrel;ext=.obj:SRCS_GLOBAL} --ya-end-command-file
 
 REAL_LINK_DYN_LIB_CMDLINE=\
+    ${GENERATE_COMMON_LIB_VFS} && \
     ${TOOLCHAIN_ENV} \
     ${cwd:ARCADIA_BUILD_ROOT} \
     ${LINK_WRAPPER} \
@@ -198,6 +214,7 @@ LINK_EXE_CMDLINE=\
     ${GENERATE_MF} && \
     ${_GENERATE_EXTRA_OBJS} && \
     $GENERATE_VCS_C_INFO_NODEP && \
+    ${GENERATE_COMMON_LIB_VFS} && \
     ${TOOLCHAIN_ENV} \
     ${cwd:ARCADIA_BUILD_ROOT} \
     ${LINK_WRAPPER} \
@@ -227,6 +244,7 @@ LINK_DYN_LIB=${GENERATE_MF} && $GENERATE_VCS_C_INFO_NODEP && $REAL_LINK_DYN_LIB
 LINK_EXEC_DYN_LIB_CMDLINE=\
     ${GENERATE_MF} && \
     $GENERATE_VCS_C_INFO_NODEP && \
+    ${GENERATE_COMMON_LIB_VFS} && \
     ${TOOLCHAIN_ENV} \
     ${cwd:ARCADIA_BUILD_ROOT} \
     ${LINK_WRAPPER} \

+ 3 - 1
build/conf/toolchains/msvc_toolchain.conf

@@ -10,9 +10,11 @@ _WINE_LINK_PREFIX=
 _WINE_LIB_PREFIX=
 _WINE_MASM_PREFIX=
 when ($_UNDER_WINE_TOOLS == "yes") {
-    _WINE_LINK_PREFIX=${_WINE_CMD} link ${ARCADIA_ROOT} ${ARCADIA_BUILD_ROOT}
     _WINE_MASM_PREFIX=${_WINE_CMD} masm ${ARCADIA_ROOT} ${ARCADIA_BUILD_ROOT}
 }
+when ($_UNDER_WINE_LINK == "yes") {
+    _WINE_LINK_PREFIX=${_WINE_CMD} link ${ARCADIA_ROOT} ${ARCADIA_BUILD_ROOT}
+}
 when ($_UNDER_WINE_LIB == "yes") {
     _WINE_LIB_PREFIX=${_WINE_CMD} lib ${ARCADIA_ROOT} ${ARCADIA_BUILD_ROOT}
 }

+ 31 - 0
build/scripts/generate_win_vfs.py

@@ -0,0 +1,31 @@
+import json
+import os
+import sys
+
+
+def make_vfsoverlay(bin_dir, args):
+    # args - list of paths in format: '/LIBPATH:"path_to_dir"'
+    libpaths = [path[len('/LIBPATH:"'):-1] for path in args]
+    overlay = {
+        "version": 0,
+        "case-sensitive": "false",
+        "roots": []
+    }
+    for dir in libpaths:
+        for file in os.listdir(dir):
+            path_to_file = os.path.join(dir, file)
+            root = {
+                "type": "file",
+                "name": path_to_file,
+                "external-contents": path_to_file
+            }
+            overlay["roots"].append(root)
+
+    with open(os.path.join(bin_dir, "vfsoverlay.yaml"), "w") as f:
+        json.dump(overlay, f)
+
+
+if __name__ == '__main__':
+    bin_dir = sys.argv[1]
+    args = sys.argv[2:]
+    make_vfsoverlay(bin_dir, args)

+ 1 - 0
build/scripts/ya.make

@@ -86,6 +86,7 @@ ELSEIF (PY3)
         gen_yql_python_udf.py
         generate_mf.py
         generate_pom.py
+        generate_win_vfs.py
         go_proto_wrapper.py
         java_pack_to_file.py
         jni_swig.py

+ 11 - 1
build/ymake_conf.py

@@ -1800,10 +1800,12 @@ class MSVCToolchainOptions(ToolchainOptions):
 
         self.under_wine_compiler = self.params.get('wine', False)
         self.under_wine_tools = not build.host.is_windows
+        self.under_wine_link = self.under_wine_tools
         self.under_wine_lib = self.under_wine_tools
         self.system_msvc = self.params.get('system_msvc', False)
         self.ide_msvs = self.params.get('ide_msvs', False)
         self.use_clang = self.params.get('use_clang', False)
+        self.use_msvc_linker = is_positive('USE_MSVC_LINKER')
         self.use_arcadia_toolchain = self.params.get('use_arcadia_toolchain', False)
 
         self.sdk_version = None
@@ -1872,7 +1874,13 @@ class MSVCToolchainOptions(ToolchainOptions):
             ])
 
             self.masm_compiler = win_path_fix(os.path.join(bindir, tools_name, asm_name))
-            self.link = win_path_fix(os.path.join(bindir, tools_name, 'link.exe'))
+
+            if self.use_clang and not self.use_msvc_linker:
+                self.link = self.host.exe(self.name_marker, "bin", "lld-link")
+                self.under_wine_link = False
+            else:
+                self.link = win_path_fix(os.path.join(bindir, tools_name, 'link.exe'))
+                self.under_wine_link = self.under_wine_tools
 
             if self.use_clang:
                 self.lib = self.host.exe(self.name_marker, "bin", "llvm-lib")
@@ -1921,6 +1929,8 @@ class MSVCToolchain(MSVC, Toolchain):
 
         if self.tc.under_wine_tools:
             emit('_UNDER_WINE_TOOLS', 'yes')
+        if self.tc.under_wine_link:
+            emit('_UNDER_WINE_LINK', 'yes')
         if self.tc.under_wine_lib:
             emit('_UNDER_WINE_LIB', 'yes')
         if self.tc.under_wine_compiler: