aboutsummaryrefslogtreecommitdiffstats
path: root/build
diff options
context:
space:
mode:
authormikhnenko <mikhnenko@yandex-team.com>2024-05-13 19:05:38 +0300
committermikhnenko <mikhnenko@yandex-team.com>2024-05-13 19:15:54 +0300
commit6c78e22d15a1ee71f94637cfafd3e9f502930bef (patch)
treee1f32c2a55b6bc6ab4d4d4fda4b036a77c9813e5 /build
parentee1f0b2b864ead167a701a030f064ae9e7278d95 (diff)
downloadydb-6c78e22d15a1ee71f94637cfafd3e9f502930bef.tar.gz
Use lld-link for target-platform windows once again
da1125f4b9b5aebe87b610dd1e1a61864ba500cf
Diffstat (limited to 'build')
-rw-r--r--build/conf/linkers/msvc_linker.conf20
-rw-r--r--build/conf/toolchains/msvc_toolchain.conf4
-rw-r--r--build/scripts/generate_win_vfs.py31
-rw-r--r--build/scripts/ya.make1
-rwxr-xr-xbuild/ymake_conf.py12
5 files changed, 65 insertions, 3 deletions
diff --git a/build/conf/linkers/msvc_linker.conf b/build/conf/linkers/msvc_linker.conf
index 6ed23489ca..d0e1db7098 100644
--- a/build/conf/linkers/msvc_linker.conf
+++ b/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} \
diff --git a/build/conf/toolchains/msvc_toolchain.conf b/build/conf/toolchains/msvc_toolchain.conf
index 94e0e444f0..ce99c84089 100644
--- a/build/conf/toolchains/msvc_toolchain.conf
+++ b/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}
}
diff --git a/build/scripts/generate_win_vfs.py b/build/scripts/generate_win_vfs.py
new file mode 100644
index 0000000000..b6635aee7d
--- /dev/null
+++ b/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)
diff --git a/build/scripts/ya.make b/build/scripts/ya.make
index c5e310d387..d7e2411e72 100644
--- a/build/scripts/ya.make
+++ b/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
diff --git a/build/ymake_conf.py b/build/ymake_conf.py
index 76f4706a2b..1e6669eb9e 100755
--- a/build/ymake_conf.py
+++ b/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: