@@ -23,6 +23,26 @@ load("//providers:providers.bzl", "WasmComponentInfo", "WitInfo")
2323load ("//rust:transitions.bzl" , "wasm_transition" )
2424load ("//tools/bazel_helpers:file_ops_actions.bzl" , "setup_go_module_action" )
2525
26+ def _build_tool_path_resolution (tool_paths ):
27+ """Build shell script code to resolve relative tool paths to absolute paths"""
28+ if not tool_paths :
29+ return 'TOOL_PATHS="/usr/bin:/bin" # fallback'
30+
31+ resolution_code = []
32+ for i , path in enumerate (tool_paths ):
33+ resolution_code .append ("""
34+ if [[ "{path}" = /* ]]; then
35+ TOOL_PATH_{i}="{path}"
36+ else
37+ TOOL_PATH_{i}="$(pwd)/{path}"
38+ fi""" .format (path = path , i = i ))
39+
40+ # Add system utilities to PATH
41+ path_assignment = "TOOL_PATHS=" + ":" .join (["\" $TOOL_PATH_%d\" " % i for i in range (len (tool_paths ))]) + ":/usr/bin:/bin"
42+ resolution_code .append ("\n " + path_assignment )
43+
44+ return "" .join (resolution_code )
45+
2646def _go_wasm_component_impl (ctx ):
2747 """Implementation of go_wasm_component rule - THE BAZEL WAY"""
2848
@@ -37,26 +57,19 @@ def _go_wasm_component_impl(ctx):
3757 tinygo = tinygo_toolchain .tinygo
3858 wasm_tools = wasm_tools_toolchain .wasm_tools
3959
40- # Get hermetic Go binary from exec configuration
41- go_sdk = ctx .attr ._go_binary
42- go_binary = None
43- if go_sdk and hasattr (go_sdk , "files" ):
44- # Find the go binary in the SDK files
45- for file in go_sdk .files .to_list ():
46- if file .basename == "go" and file .is_executable :
47- go_binary = file
48- print ("DEBUG: Found hermetic Go binary at: %s" % go_binary .path )
49- break
60+ # Get hermetic Go binary from TinyGo toolchain
61+ go_binary = getattr (tinygo_toolchain , "go" , None )
62+ if go_binary :
63+ print ("DEBUG: Found hermetic Go binary from TinyGo toolchain: %s" % go_binary .path )
64+ else :
65+ print ("DEBUG: No Go binary provided by TinyGo toolchain" )
5066
51- if not go_binary :
52- print ("DEBUG: No hermetic Go binary found in SDK: %s" % go_sdk )
53- if go_sdk and hasattr (go_sdk , "files" ):
54- files = go_sdk .files .to_list ()
55- print ("DEBUG: SDK contains %d files: %s" % (len (files ), [f .path for f in files [:5 ]]))
56- print ("DEBUG: Looking for executable files with basename 'go'" )
57- for file in files :
58- if file .basename == "go" :
59- print ("DEBUG: Found 'go' file at %s, executable: %s" % (file .path , file .is_executable ))
67+ # Get wasm-opt binary from TinyGo toolchain
68+ wasm_opt_binary = getattr (tinygo_toolchain , "wasm_opt" , None )
69+ if wasm_opt_binary :
70+ print ("DEBUG: Found wasm-opt binary from TinyGo toolchain: %s" % wasm_opt_binary .path )
71+ else :
72+ print ("DEBUG: No wasm-opt binary provided by TinyGo toolchain" )
6073
6174 # Validate toolchain binaries
6275 if not tinygo :
@@ -72,7 +85,7 @@ def _go_wasm_component_impl(ctx):
7285 go_module_files = _prepare_go_module (ctx , tinygo_toolchain )
7386
7487 # Step 2: Compile with TinyGo to WASM module
75- _compile_tinygo_module (ctx , tinygo , go_binary , wasm_module , go_module_files )
88+ _compile_tinygo_module (ctx , tinygo , go_binary , wasm_opt_binary , wasm_tools , wasm_tools_toolchain , wasm_module , go_module_files )
7689
7790 # Step 3: Convert module to component if needed
7891 _convert_to_component (ctx , wasm_tools , wasm_module , component_wasm )
@@ -120,7 +133,7 @@ def _prepare_go_module(ctx, tinygo_toolchain):
120133
121134 return module_dir
122135
123- def _compile_tinygo_module (ctx , tinygo , go_binary , wasm_module , go_module_files ):
136+ def _compile_tinygo_module (ctx , tinygo , go_binary , wasm_opt_binary , wasm_tools , wasm_tools_toolchain , wasm_module , go_module_files ):
124137 """Compile Go sources to WASM module using TinyGo - THE BAZEL WAY"""
125138
126139 # Validate inputs
@@ -148,11 +161,11 @@ def _compile_tinygo_module(ctx, tinygo, go_binary, wasm_module, go_module_files)
148161 wasm_module .path ,
149162 ]
150163
151- # Add optimization flags
164+ # Add optimization flags (now we have hermetic wasm-opt)
152165 if ctx .attr .optimization == "release" :
153- tinygo_args .extend (["-opt=2" , "-no-debug" ])
166+ tinygo_args .extend (["-opt=2" , "-no-debug" ]) # Use full optimization with wasm-opt
154167 else :
155- tinygo_args .extend (["-opt=1" ])
168+ tinygo_args .extend (["-opt=1" ]) # Use basic optimization for debug
156169
157170 # Add WIT integration if available
158171 if ctx .attr .wit and ctx .attr .world :
@@ -207,6 +220,19 @@ def _compile_tinygo_module(ctx, tinygo, go_binary, wasm_module, go_module_files)
207220 if go_binary :
208221 go_bin_dir = go_binary .dirname
209222 tool_paths .append (go_bin_dir )
223+ print ("DEBUG: Added Go binary directory to PATH: %s" % go_bin_dir )
224+
225+ # Include wasm-opt binary directory from Binaryen
226+ if wasm_opt_binary :
227+ wasm_opt_bin_dir = wasm_opt_binary .dirname
228+ tool_paths .append (wasm_opt_bin_dir )
229+ print ("DEBUG: Added wasm-opt binary directory to PATH: %s" % wasm_opt_bin_dir )
230+
231+ # Include wasm-tools binary directory
232+ if wasm_tools :
233+ wasm_tools_bin_dir = wasm_tools .dirname
234+ tool_paths .append (wasm_tools_bin_dir )
235+ print ("DEBUG: Added wasm-tools binary directory to PATH: %s" % wasm_tools_bin_dir )
210236
211237 # Set up environment - THE BAZEL WAY with proper path handling
212238 # Build environment with absolute paths for TinyGo
241267# Create GOCACHE directory if it doesn't exist
242268mkdir -p "{cache_path}"
243269
270+ # Build absolute PATH from relative tool paths
271+ TOOL_PATHS=""
272+ {tool_path_resolution}
273+
244274# Set up environment with absolute paths
245275export TINYGOROOT
246276export GOCACHE="{cache_path}"
@@ -249,7 +279,8 @@ export GO111MODULE="off"
249279export GOPROXY="direct"
250280export HOME="{home_path}"
251281export TMPDIR="{tmp_path}"
252- export PATH="{tool_path}"
282+ export PATH="$TOOL_PATHS"
283+ # Note: WASMOPT is not set - TinyGo will find wasm-opt in PATH
253284
254285# Debug output (can be disabled in production)
255286echo "TinyGo wrapper environment:"
@@ -266,7 +297,7 @@ exec "$@"
266297 cache_path = abs_cache_path ,
267298 home_path = temp_cache_dir .path ,
268299 tmp_path = temp_cache_dir .path ,
269- tool_path = ":" . join (tool_paths ),
300+ tool_path_resolution = _build_tool_path_resolution (tool_paths ),
270301 )
271302
272303 ctx .actions .write (
@@ -278,14 +309,24 @@ exec "$@"
278309 # Prepare wrapper arguments: wrapper_script + tinygo_binary + tinygo_args
279310 wrapper_args = [tinygo .path ] + tinygo_args
280311
281- # Prepare inputs including wrapper script and hermetic Go binary (if available)
282- inputs = [go_module_files , tinygo , wrapper_script ]
312+ # Prepare inputs including wrapper script and hermetic binaries (if available)
313+ inputs = [go_module_files , tinygo , wrapper_script , wasm_tools ]
283314 if go_binary :
284315 inputs .append (go_binary )
316+ if wasm_opt_binary :
317+ inputs .append (wasm_opt_binary )
285318
286319 # Include TinyGo toolchain files for complete environment
287320 if hasattr (tinygo_toolchain , "tinygo_files" ) and tinygo_toolchain .tinygo_files :
288321 inputs .extend (tinygo_toolchain .tinygo_files .files .to_list ())
322+
323+ # Include Binaryen files for wasm-opt
324+ if hasattr (tinygo_toolchain , "binaryen_files" ) and tinygo_toolchain .binaryen_files :
325+ inputs .extend (tinygo_toolchain .binaryen_files .files .to_list ())
326+
327+ # Include wasm-tools files
328+ if hasattr (wasm_tools_toolchain , "wasm_tools_files" ) and wasm_tools_toolchain .wasm_tools_files :
329+ inputs .extend (wasm_tools_toolchain .wasm_tools_files .files .to_list ())
289330
290331 if ctx .attr .wit :
291332 wit_info = ctx .attr .wit [WitInfo ]
@@ -345,11 +386,6 @@ go_wasm_component = rule(
345386 default = "release" ,
346387 values = ["debug" , "release" ],
347388 ),
348- "_go_binary" : attr .label (
349- default = "@go_toolchains//:_0000_main___download_0_go_darwin_arm64" ,
350- cfg = "exec" ,
351- doc = "Hermetic Go binary for TinyGo compilation" ,
352- ),
353389 },
354390 toolchains = [
355391 "@rules_wasm_component//toolchains:tinygo_toolchain_type" ,
0 commit comments