Skip to content

Commit 6443fdf

Browse files
committed
Mingw fixes
1 parent cdaf15f commit 6443fdf

File tree

7 files changed

+334
-29
lines changed

7 files changed

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