Skip to content

Commit dfc8131

Browse files
authored
fix sysroot for make and pkgconfig built tools (#1356)
1 parent 64f8b6d commit dfc8131

File tree

3 files changed

+54
-8
lines changed

3 files changed

+54
-8
lines changed

foreign_cc/built_tools/make_build.bzl

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ load(
88
"FOREIGN_CC_BUILT_TOOLS_HOST_FRAGMENTS",
99
"absolutize",
1010
"built_tool_rule_impl",
11+
"extract_non_sysroot_flags",
12+
"extract_sysroot_flags",
1113
)
1214
load(
1315
"//foreign_cc/private:cc_toolchain_util.bzl",
@@ -46,13 +48,13 @@ def _make_tool_impl(ctx):
4648

4749
cc_path = tools_info.cc
4850
cflags = flags_info.cc
49-
sysroot_cflags = [flag for flag in cflags if flag.startswith("--sysroot=")]
50-
non_sysroot_cflags = [flag for flag in cflags if not flag.startswith("--sysroot=")]
51+
sysroot_cflags = extract_sysroot_flags(cflags)
52+
non_sysroot_cflags = extract_non_sysroot_flags(cflags)
5153

5254
ld_path = tools_info.cxx_linker_executable
5355
ldflags = flags_info.cxx_linker_executable
54-
sysroot_ldflags = [flag for flag in ldflags if flag.startswith("--sysroot=")]
55-
non_sysroot_ldflags = [flag for flag in ldflags if not flag.startswith("--sysroot=")]
56+
sysroot_ldflags = extract_sysroot_flags(ldflags)
57+
non_sysroot_ldflags = extract_non_sysroot_flags(ldflags)
5658

5759
# Make's build script does not forward CFLAGS to all compiler and linker
5860
# invocations, so we append --sysroot flags directly to CC and LD.

foreign_cc/built_tools/pkgconfig_build.bzl

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ load(
88
"FOREIGN_CC_BUILT_TOOLS_HOST_FRAGMENTS",
99
"absolutize",
1010
"built_tool_rule_impl",
11+
"extract_non_sysroot_flags",
12+
"extract_sysroot_flags",
1113
)
1214
load(
1315
"//foreign_cc/private:cc_toolchain_util.bzl",
@@ -29,13 +31,13 @@ def _pkgconfig_tool_impl(ctx):
2931

3032
cc_path = tools_info.cc
3133
cflags = flags_info.cc + ["-Wno-int-conversion"] # Fix building with clang 15+
32-
sysroot_cflags = [flag for flag in cflags if flag.startswith("--sysroot=")]
33-
non_sysroot_cflags = [flag for flag in cflags if not flag.startswith("--sysroot=")]
34+
sysroot_cflags = extract_sysroot_flags(cflags)
35+
non_sysroot_cflags = extract_non_sysroot_flags(cflags)
3436

3537
ld_path = tools_info.cxx_linker_executable
3638
ldflags = flags_info.cxx_linker_executable
37-
sysroot_ldflags = [flag for flag in ldflags if flag.startswith("--sysroot=")]
38-
non_sysroot_ldflags = [flag for flag in ldflags if not flag.startswith("--sysroot=")]
39+
sysroot_ldflags = extract_sysroot_flags(ldflags)
40+
non_sysroot_ldflags = extract_non_sysroot_flags(ldflags)
3941

4042
# Make's build script does not forward CFLAGS to all compiler and linker
4143
# invocations, so we append --sysroot flags directly to CC and LD.

foreign_cc/built_tools/private/built_tools_framework.bzl

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,48 @@ FOREIGN_CC_BUILT_TOOLS_HOST_FRAGMENTS = [
5050
def absolutize(workspace_name, text, force = False):
5151
return absolutize_path_in_str(workspace_name, "$$EXT_BUILD_ROOT$$/", text, force)
5252

53+
def extract_sysroot_flags(flags):
54+
"""Function to return sysroot args from list of flags like cflags or ldflags
55+
56+
sysroot args are either '--sysroot=</path/to/sysroot>' or '--sysroot </path/to/sysroot>'
57+
58+
Args:
59+
flags (list): list of flags
60+
61+
Returns:
62+
List of sysroot flags
63+
"""
64+
ret_flags = []
65+
for i in range(len(flags)):
66+
if flags[i] == "--sysroot":
67+
if i + 1 < len(flags):
68+
ret_flags.append(flags[i])
69+
ret_flags.append(flags[i + 1])
70+
elif flags[i].startswith("--sysroot="):
71+
ret_flags.append(flags[i])
72+
return ret_flags
73+
74+
def extract_non_sysroot_flags(flags):
75+
"""Function to return non sysroot args from list of flags like cflags or ldflags
76+
77+
sysroot args are either '--sysroot=</path/to/sysroot>' or '--sysroot </path/to/sysroot>'
78+
79+
Args:
80+
flags (list): list of flags
81+
82+
Returns:
83+
List of non sysroot flags
84+
"""
85+
ret_flags = []
86+
for i in range(len(flags)):
87+
if flags[i] == "--sysroot" or \
88+
flags[i].startswith("--sysroot=") or \
89+
(i != 0 and flags[i - 1] == "--sysroot"):
90+
continue
91+
else:
92+
ret_flags.append(flags[i])
93+
return ret_flags
94+
5395
def built_tool_rule_impl(ctx, script_lines, out_dir, mnemonic, additional_tools = None):
5496
"""Framework function for bootstrapping C/C++ build tools.
5597

0 commit comments

Comments
 (0)