Skip to content

Commit 9ec84d9

Browse files
committed
Mingw fixes
1 parent cdaf15f commit 9ec84d9

File tree

7 files changed

+349
-30
lines changed

7 files changed

+349
-30
lines changed

rust/platform/triple_mappings.bzl

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,11 @@ _SYSTEM_TO_STDLIB_LINKFLAGS = {
279279
"wasi": [],
280280
"wasip1": [],
281281
"wasip2": [],
282-
"windows": ["advapi32.lib", "ws2_32.lib", "userenv.lib", "Bcrypt.lib"],
282+
"windows": {
283+
"gnu": ["-ladvapi32", "-lws2_32", "-luserenv"],
284+
"gnullvm": ["-ladvapi32", "-lws2_32", "-luserenv"],
285+
"msvc": ["advapi32.lib", "ws2_32.lib", "userenv.lib", "Bcrypt.lib"],
286+
},
283287
}
284288

285289
def cpu_arch_to_constraints(cpu_arch, *, system = None):
@@ -404,8 +408,11 @@ def system_to_staticlib_ext(system):
404408
def system_to_binary_ext(system):
405409
return _SYSTEM_TO_BINARY_EXT[system]
406410

407-
def system_to_stdlib_linkflags(system):
408-
return _SYSTEM_TO_STDLIB_LINKFLAGS[system]
411+
def system_to_stdlib_linkflags(target_triple):
412+
val = _SYSTEM_TO_STDLIB_LINKFLAGS[target_triple.system]
413+
if type(val) == "list":
414+
return val
415+
return val[target_triple.abi]
409416

410417
def triple_to_constraint_set(target_triple):
411418
"""Returns a set of constraints for a given platform triple

rust/private/repository_utils.bzl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,7 @@ def BUILD_for_rust_toolchain(
393393
str: A rendered template of a `rust_toolchain` declaration
394394
"""
395395
if stdlib_linkflags == None:
396-
stdlib_linkflags = ", ".join(['"%s"' % x for x in system_to_stdlib_linkflags(target_triple.system)])
396+
stdlib_linkflags = ", ".join(['"%s"' % x for x in system_to_stdlib_linkflags(target_triple)])
397397

398398
rustfmt_label = None
399399
if include_rustfmt:

rust/private/rustc.bzl

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -560,9 +560,9 @@ def _symlink_for_ambiguous_lib(actions, toolchain, crate_info, lib):
560560

561561
# Take the absolute value of hash() since it could be negative.
562562
path_hash = abs(hash(lib.path))
563-
lib_name = get_lib_name_for_windows(lib) if toolchain.target_os.startswith("windows") else get_lib_name_default(lib)
563+
lib_name = get_lib_name_for_windows(lib) if toolchain.target_abi == "msvc" else get_lib_name_default(lib)
564564

565-
if toolchain.target_os.startswith("windows"):
565+
if toolchain.target_abi == "msvc":
566566
prefix = ""
567567
extension = ".lib"
568568
elif lib_name.endswith(".pic"):
@@ -1495,7 +1495,7 @@ def rustc_compile_action(
14951495
pdb_file = None
14961496
dsym_folder = None
14971497
if crate_info.type in ("cdylib", "bin") and not experimental_use_cc_common_link:
1498-
if toolchain.target_os == "windows" and compilation_mode.strip_level == "none":
1498+
if toolchain.target_abi == "msvc" and compilation_mode.strip_level == "none":
14991499
pdb_file = ctx.actions.declare_file(crate_info.output.basename[:-len(crate_info.output.extension)] + "pdb", sibling = crate_info.output)
15001500
action_outputs.append(pdb_file)
15011501
elif toolchain.target_os in ["macos", "darwin"]:
@@ -2200,7 +2200,7 @@ def _get_crate_dirname(crate):
22002200
"""
22012201
return crate.output.dirname
22022202

2203-
def _portable_link_flags(lib, use_pic, ambiguous_libs, get_lib_name, for_windows = False, for_darwin = False, flavor_msvc = False):
2203+
def _portable_link_flags(lib, use_pic, ambiguous_libs, get_lib_name, for_darwin = False, flavor_msvc = False):
22042204
artifact = get_preferred_artifact(lib, use_pic)
22052205
if ambiguous_libs and artifact.path in ambiguous_libs:
22062206
artifact = ambiguous_libs[artifact.path]
@@ -2240,17 +2240,11 @@ def _portable_link_flags(lib, use_pic, ambiguous_libs, get_lib_name, for_windows
22402240
):
22412241
return [] if for_darwin else ["-lstatic=%s" % get_lib_name(artifact)]
22422242

2243-
if for_windows:
2244-
if flavor_msvc:
2245-
return [
2246-
"-lstatic=%s" % get_lib_name(artifact),
2247-
"-Clink-arg={}".format(artifact.basename),
2248-
]
2249-
else:
2250-
return [
2251-
"-lstatic=%s" % get_lib_name(artifact),
2252-
"-Clink-arg=-l{}".format(artifact.basename),
2253-
]
2243+
if flavor_msvc:
2244+
return [
2245+
"-lstatic=%s" % get_lib_name(artifact),
2246+
"-Clink-arg={}".format(artifact.basename),
2247+
]
22542248
else:
22552249
return [
22562250
"-lstatic=%s" % get_lib_name(artifact),
@@ -2281,7 +2275,8 @@ def _make_link_flags_windows(make_link_flags_args, flavor_msvc, use_direct_drive
22812275
("-Clink-arg=%s--no-whole-archive" % prefix),
22822276
])
22832277
elif include_link_flags:
2284-
ret.extend(_portable_link_flags(lib, use_pic, ambiguous_libs, get_lib_name_for_windows, for_windows = True, flavor_msvc = flavor_msvc))
2278+
get_lib_name = get_lib_name_for_windows if flavor_msvc else get_lib_name_default
2279+
ret.extend(_portable_link_flags(lib, use_pic, ambiguous_libs, get_lib_name, flavor_msvc = flavor_msvc))
22852280
_add_user_link_flags(ret, linker_input)
22862281
return ret
22872282

@@ -2361,19 +2356,19 @@ def _get_make_link_flag_funcs(target_os, target_abi, use_direct_link_driver):
23612356
- callable: The function for producing link args.
23622357
- callable: The function for formatting link library names.
23632358
"""
2359+
2360+
get_lib_name = get_lib_name_default
2361+
23642362
if target_os == "windows":
2365-
make_link_flags_windows_msvc = _make_link_flags_windows_msvc_direct if use_direct_link_driver else _make_link_flags_windows_msvc_indirect
2366-
make_link_flags_windows_gnu = _make_link_flags_windows_gnu_direct if use_direct_link_driver else _make_link_flags_windows_gnu_indirect
2367-
make_link_flags = make_link_flags_windows_msvc if target_abi == "msvc" else make_link_flags_windows_gnu
2368-
get_lib_name = get_lib_name_for_windows
2363+
if target_abi == "msvc":
2364+
make_link_flags = _make_link_flags_windows_msvc_direct if use_direct_link_driver else _make_link_flags_windows_msvc_indirect
2365+
get_lib_name = get_lib_name_for_windows
2366+
else:
2367+
make_link_flags = _make_link_flags_windows_gnu_direct if use_direct_link_driver else _make_link_flags_windows_gnu_indirect
23692368
elif target_os.startswith(("mac", "darwin", "ios")):
2370-
make_link_flags_darwin = _make_link_flags_darwin_direct if use_direct_link_driver else _make_link_flags_darwin_indirect
2371-
make_link_flags = make_link_flags_darwin
2372-
get_lib_name = get_lib_name_default
2369+
make_link_flags = _make_link_flags_darwin_direct if use_direct_link_driver else _make_link_flags_darwin_indirect
23732370
else:
2374-
make_link_flags_default = _make_link_flags_default_direct if use_direct_link_driver else _make_link_flags_default_indirect
2375-
make_link_flags = make_link_flags_default
2376-
get_lib_name = get_lib_name_default
2371+
make_link_flags = _make_link_flags_default_direct if use_direct_link_driver else _make_link_flags_default_indirect
23772372

23782373
return (make_link_flags, get_lib_name)
23792374

@@ -2703,3 +2698,7 @@ no_std = rule(
27032698
},
27042699
implementation = _no_std_impl,
27052700
)
2701+
2702+
# Test-only exports for private helpers.
2703+
portable_link_flags_for_testing = _portable_link_flags
2704+
symlink_for_ambiguous_lib_for_testing = _symlink_for_ambiguous_lib
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
load(":windows_lib_name_test.bzl", "windows_lib_name_test_suite")
2+
3+
windows_lib_name_test_suite(name = "windows_lib_name_test_suite")
Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
"""Analysistests for Windows-specific library naming and link flags."""
2+
3+
load("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts")
4+
5+
# buildifier: disable=bzl-visibility
6+
load("//rust/private:rustc.bzl", "portable_link_flags_for_testing", "symlink_for_ambiguous_lib_for_testing")
7+
8+
# buildifier: disable=bzl-visibility
9+
load("//rust/private:utils.bzl", "get_lib_name_default", "get_lib_name_for_windows")
10+
11+
# buildifier: disable=provider-params
12+
LinkFlagsInfo = provider(fields = {"flags": "List[str]"})
13+
14+
# buildifier: disable=provider-params
15+
SymlinkInfo = provider(fields = {"symlink": "File"})
16+
17+
def _portable_link_flags_probe_impl(ctx):
18+
lib_artifact = ctx.actions.declare_file(ctx.attr.lib_basename)
19+
ctx.actions.write(lib_artifact, "", is_executable = False)
20+
library_to_link = struct(
21+
static_library = lib_artifact,
22+
pic_static_library = None,
23+
dynamic_library = None,
24+
interface_library = None,
25+
alwayslink = False,
26+
)
27+
28+
get_lib_name = get_lib_name_for_windows if ctx.attr.flavor_msvc else get_lib_name_default
29+
flags = portable_link_flags_for_testing(
30+
lib = library_to_link,
31+
use_pic = False,
32+
ambiguous_libs = {},
33+
get_lib_name = get_lib_name,
34+
for_windows = True,
35+
flavor_msvc = ctx.attr.flavor_msvc,
36+
)
37+
38+
return [
39+
DefaultInfo(files = depset([])),
40+
LinkFlagsInfo(flags = flags),
41+
]
42+
43+
portable_link_flags_probe = rule(
44+
implementation = _portable_link_flags_probe_impl,
45+
attrs = {
46+
"flavor_msvc": attr.bool(default = False),
47+
"lib_basename": attr.string(mandatory = True),
48+
},
49+
)
50+
51+
def _symlink_probe_impl(ctx):
52+
lib_artifact = ctx.actions.declare_file(ctx.attr.lib_basename)
53+
ctx.actions.write(lib_artifact, "", is_executable = False)
54+
crate_output = ctx.actions.declare_file("crate.rlib")
55+
ctx.actions.write(crate_output, "", is_executable = False)
56+
symlink = symlink_for_ambiguous_lib_for_testing(
57+
ctx.actions,
58+
toolchain = struct(target_abi = ctx.attr.target_abi),
59+
crate_info = struct(output = crate_output),
60+
lib = lib_artifact,
61+
)
62+
63+
return [
64+
SymlinkInfo(symlink = symlink),
65+
DefaultInfo(files = depset([symlink])),
66+
]
67+
68+
symlink_probe = rule(
69+
implementation = _symlink_probe_impl,
70+
attrs = {
71+
"lib_basename": attr.string(mandatory = True),
72+
"target_abi": attr.string(mandatory = True),
73+
},
74+
)
75+
76+
def _portable_link_flags_windows_gnu_test_impl(ctx):
77+
env = analysistest.begin(ctx)
78+
flags = analysistest.target_under_test(env)[LinkFlagsInfo].flags
79+
80+
asserts.equals(
81+
env,
82+
["-lstatic=foo.dll", "-Clink-arg=-lfoo.dll"],
83+
flags,
84+
)
85+
return analysistest.end(env)
86+
87+
portable_link_flags_windows_gnu_test = analysistest.make(
88+
_portable_link_flags_windows_gnu_test_impl,
89+
)
90+
91+
def _portable_link_flags_windows_msvc_test_impl(ctx):
92+
env = analysistest.begin(ctx)
93+
flags = analysistest.target_under_test(env)[LinkFlagsInfo].flags
94+
95+
asserts.equals(
96+
env,
97+
["-lstatic=libfoo.dll", "-Clink-arg=libfoo.dll.lib"],
98+
flags,
99+
)
100+
return analysistest.end(env)
101+
102+
portable_link_flags_windows_msvc_test = analysistest.make(
103+
_portable_link_flags_windows_msvc_test_impl,
104+
)
105+
106+
def _symlink_name_windows_gnu_test_impl(ctx):
107+
env = analysistest.begin(ctx)
108+
symlink = analysistest.target_under_test(env)[SymlinkInfo].symlink
109+
110+
asserts.true(env, symlink.basename.startswith("libfoo.dll-"))
111+
asserts.true(env, symlink.basename.endswith(".a"))
112+
asserts.false(env, symlink.basename.startswith("liblib"))
113+
114+
return analysistest.end(env)
115+
116+
symlink_name_windows_gnu_test = analysistest.make(_symlink_name_windows_gnu_test_impl)
117+
118+
def _symlink_name_windows_msvc_test_impl(ctx):
119+
env = analysistest.begin(ctx)
120+
symlink = analysistest.target_under_test(env)[SymlinkInfo].symlink
121+
122+
asserts.true(env, symlink.basename.startswith("native_dep-"))
123+
asserts.true(env, symlink.basename.endswith(".lib"))
124+
125+
return analysistest.end(env)
126+
127+
symlink_name_windows_msvc_test = analysistest.make(_symlink_name_windows_msvc_test_impl)
128+
129+
def _define_targets():
130+
portable_link_flags_probe(
131+
name = "portable_link_flags_windows_gnu_probe",
132+
flavor_msvc = False,
133+
lib_basename = "libfoo.dll.a",
134+
)
135+
portable_link_flags_probe(
136+
name = "portable_link_flags_windows_msvc_probe",
137+
flavor_msvc = True,
138+
lib_basename = "libfoo.dll.lib",
139+
)
140+
141+
symlink_probe(
142+
name = "symlink_windows_gnu_probe",
143+
lib_basename = "libfoo.dll.a",
144+
target_abi = "gnu",
145+
)
146+
symlink_probe(
147+
name = "symlink_windows_msvc_probe",
148+
lib_basename = "native_dep.lib",
149+
target_abi = "msvc",
150+
)
151+
152+
def windows_lib_name_test_suite(name):
153+
"""Entry-point macro for Windows library naming tests.
154+
155+
Args:
156+
name: test suite name
157+
"""
158+
_define_targets()
159+
160+
portable_link_flags_windows_gnu_test(
161+
name = "portable_link_flags_windows_gnu_test",
162+
target_under_test = ":portable_link_flags_windows_gnu_probe",
163+
)
164+
portable_link_flags_windows_msvc_test(
165+
name = "portable_link_flags_windows_msvc_test",
166+
target_under_test = ":portable_link_flags_windows_msvc_probe",
167+
)
168+
symlink_name_windows_gnu_test(
169+
name = "symlink_name_windows_gnu_test",
170+
target_under_test = ":symlink_windows_gnu_probe",
171+
)
172+
symlink_name_windows_msvc_test(
173+
name = "symlink_name_windows_msvc_test",
174+
target_under_test = ":symlink_windows_msvc_probe",
175+
)
176+
177+
native.test_suite(
178+
name = name,
179+
tests = [
180+
":portable_link_flags_windows_gnu_test",
181+
":portable_link_flags_windows_msvc_test",
182+
":symlink_name_windows_gnu_test",
183+
":symlink_name_windows_msvc_test",
184+
],
185+
)
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
load(":windows_stdlib_test.bzl", "windows_stdlib_test_suite")
2+
3+
windows_stdlib_test_suite(name = "windows_stdlib_test_suite")

0 commit comments

Comments
 (0)