Skip to content

Commit 46458a1

Browse files
committed
fix: resolve C++ header propagation and sysroot path issues (#28, #29)
Implement CcInfo provider support in cc_component_library and fix WASI SDK sysroot path resolution for external repository compatibility.
1 parent 6f4cbfc commit 46458a1

File tree

1 file changed

+55
-20
lines changed

1 file changed

+55
-20
lines changed

cpp/defs.bzl

Lines changed: 55 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,14 @@ def _cpp_component_impl(ctx):
2929
dep_headers = []
3030
dep_libraries = []
3131
dep_includes = []
32-
32+
3333
for dep in ctx.attr.deps:
3434
if CcInfo in dep:
3535
# Use proper CcInfo provider for header and library information
3636
cc_info = dep[CcInfo]
3737
dep_headers.extend(cc_info.compilation_context.headers.to_list())
3838
dep_includes.extend(cc_info.compilation_context.includes.to_list())
39+
3940
# Extract static libraries from linking context
4041
for linker_input in cc_info.linking_context.linker_inputs.to_list():
4142
for library in linker_input.libraries:
@@ -87,16 +88,22 @@ def _cpp_component_impl(ctx):
8788

8889
# Basic compiler flags for Preview2
8990
compile_args.add("--target=wasm32-wasip2")
90-
# Compute sysroot path from sysroot_files for external repository compatibility
91+
92+
# Build sysroot path from toolchain repository for external compatibility
9193
if sysroot_files and sysroot_files.files:
92-
# Use the directory containing the sysroot files as the sysroot path
93-
sysroot_file = sysroot_files.files.to_list()[0]
94-
# Extract the repository-relative sysroot path
95-
sysroot_path = sysroot_file.path.split("/sysroot/")[0] + "/sysroot"
94+
# Use sysroot_files to determine the actual sysroot directory
95+
toolchain_file = sysroot_files.files.to_list()[0]
96+
97+
# Extract the sysroot directory by removing the file component
98+
if "/sysroot/" in toolchain_file.path:
99+
# Get everything up to and including /sysroot/
100+
sysroot_base = toolchain_file.path.split("/sysroot/")[0] + "/sysroot"
101+
sysroot_path = sysroot_base
102+
else:
103+
sysroot_path = sysroot
96104
else:
97-
# Fallback to configured path
98105
sysroot_path = sysroot
99-
106+
100107
compile_args.add("--sysroot=" + sysroot_path)
101108

102109
# Component model definitions
@@ -132,20 +139,30 @@ def _cpp_component_impl(ctx):
132139

133140
# Include directories
134141
compile_args.add("-I" + work_dir.path)
135-
142+
136143
# Add C++ standard library paths for wasm32-wasip2 target
137144
if ctx.attr.language == "cpp":
138-
compile_args.add("-I" + sysroot_path + "/include/wasm32-wasip2/c++/v1")
139-
compile_args.add("-I" + sysroot_path + "/include/c++/v1")
140-
145+
# WASI SDK stores C++ headers in share/wasi-sysroot, not just sysroot
146+
if "/external/" in sysroot_path:
147+
toolchain_repo = sysroot_path.split("/sysroot")[0]
148+
wasi_sysroot = toolchain_repo + "/share/wasi-sysroot"
149+
else:
150+
wasi_sysroot = sysroot_path
151+
compile_args.add("-I" + wasi_sysroot + "/include/wasm32-wasip2/c++/v1")
152+
compile_args.add("-I" + wasi_sysroot + "/include/c++/v1")
153+
154+
# Also add clang's builtin headers
155+
if "/external/" in sysroot_path:
156+
compile_args.add("-I" + toolchain_repo + "/lib/clang/20/include")
157+
141158
for include in ctx.attr.includes:
142159
compile_args.add("-I" + include)
143160

144161
# Add dependency include directories from CcInfo
145162
for include_dir in dep_includes:
146163
if include_dir not in [work_dir.path] + ctx.attr.includes:
147164
compile_args.add("-I" + include_dir)
148-
165+
149166
# Add dependency header directories (fallback for non-CcInfo deps)
150167
for dep_hdr in dep_headers:
151168
include_dir = dep_hdr.dirname
@@ -428,8 +445,16 @@ def _cc_component_library_impl(ctx):
428445
# Compile arguments
429446
compile_args = ctx.actions.args()
430447
compile_args.add("--target=wasm32-wasip2")
448+
431449
# Resolve sysroot path dynamically for external repository compatibility
432-
sysroot_dir = sysroot_files.files.to_list()[0].dirname if sysroot_files.files else sysroot
450+
if sysroot_files and sysroot_files.files:
451+
toolchain_file = sysroot_files.files.to_list()[0]
452+
if "/sysroot/" in toolchain_file.path:
453+
sysroot_dir = toolchain_file.path.split("/sysroot/")[0] + "/sysroot"
454+
else:
455+
sysroot_dir = sysroot
456+
else:
457+
sysroot_dir = sysroot
433458
compile_args.add("--sysroot=" + sysroot_dir)
434459
compile_args.add("-c") # Compile only, don't link
435460

@@ -461,12 +486,22 @@ def _cc_component_library_impl(ctx):
461486
# Include directories
462487
for hdr in ctx.files.hdrs:
463488
compile_args.add("-I" + hdr.dirname)
464-
489+
465490
# Add C++ standard library paths for wasm32-wasip2 target
466491
if ctx.attr.language == "cpp":
467-
compile_args.add("-I" + sysroot + "/include/wasm32-wasip2/c++/v1")
468-
compile_args.add("-I" + sysroot + "/include/c++/v1")
469-
492+
# WASI SDK stores C++ headers in share/wasi-sysroot, not just sysroot
493+
if "/external/" in sysroot_dir:
494+
toolchain_repo = sysroot_dir.split("/sysroot")[0]
495+
wasi_sysroot = toolchain_repo + "/share/wasi-sysroot"
496+
else:
497+
wasi_sysroot = sysroot_dir
498+
compile_args.add("-I" + wasi_sysroot + "/include/wasm32-wasip2/c++/v1")
499+
compile_args.add("-I" + wasi_sysroot + "/include/c++/v1")
500+
501+
# Also add clang's builtin headers
502+
if "/external/" in sysroot_dir:
503+
compile_args.add("-I" + toolchain_repo + "/lib/clang/20/include")
504+
470505
for include in ctx.attr.includes:
471506
compile_args.add("-I" + include)
472507

@@ -514,7 +549,7 @@ def _cc_component_library_impl(ctx):
514549
transitive_headers = []
515550
transitive_libraries = []
516551
transitive_includes = []
517-
552+
518553
for dep in ctx.attr.deps:
519554
if CcInfo in dep:
520555
cc_info = dep[CcInfo]
@@ -527,7 +562,7 @@ def _cc_component_library_impl(ctx):
527562
headers = depset(ctx.files.hdrs, transitive = transitive_headers),
528563
includes = depset([h.dirname for h in ctx.files.hdrs] + ctx.attr.includes, transitive = [depset(transitive_includes)]),
529564
)
530-
565+
531566
# Create CcInfo provider with compilation context only
532567
# Note: We don't create linking context since we're using custom WASM toolchain
533568
cc_info = CcInfo(

0 commit comments

Comments
 (0)