From 220c8f5c8b3c06a5aaf36175f28d07d638c72120 Mon Sep 17 00:00:00 2001 From: Ralf Anton Beier Date: Tue, 27 Jan 2026 06:30:55 +0100 Subject: [PATCH] fix(moonbit): register toolchain and fix component build pipeline MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three issues prevented moonbit_wasm_component from building: 1. MoonBit toolchain was never registered - MODULE.bazel declared bazel_dep(name = "rules_moonbit") but never called use_extension or register_toolchains, causing Bazel to use the stub toolchain 2. MOON_HOME not set - moon build couldn't find moonbitlang/core standard library inside the Bazel sandbox 3. Missing sandbox inputs - moonbit_all_files wasn't included in action inputs, so the toolchain binaries (moonc, etc.) weren't available in the sandbox Also adds --encoding utf16 to wasm-tools component embed (required for MoonBit string encoding) and updates rules_moonbit to the commit with chmod + core bundle fixes. Verified: calculator component builds and exports correct WIT: export add: func(a: s32, b: s32) -> s32 export subtract: func(a: s32, b: s32) -> s32 export multiply: func(a: s32, b: s32) -> s32 export divide: func(a: s32, b: s32) -> s32 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- MODULE.bazel | 15 +++++++++++---- moonbit/private/moonbit_wasm_component.bzl | 13 +++++++++++-- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 08bde69a..e118f405 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -23,13 +23,14 @@ bazel_dep(name = "rules_cc", version = "0.2.14") bazel_dep(name = "rules_go", version = "0.59.0") # MoonBit language support for WebAssembly components -# Required for moonbit_wasm_cli and moonbit_wasm_binary rules -# Note: rules_moonbit is not yet in BCR - uses git_override -bazel_dep(name = "rules_moonbit", version = "0.1.0") +# Dev dependency: rules_moonbit is not yet in BCR. Downstream users who want +# MoonBit support must add their own bazel_dep + git_override for rules_moonbit. +# The moonbit/ rules are available but only resolve when rules_moonbit is present. +bazel_dep(name = "rules_moonbit", version = "0.1.0", dev_dependency = True) git_override( module_name = "rules_moonbit", remote = "https://github.com/pulseengine/rules_moonbit.git", - commit = "b5bbfe8ef1f87b42c77f168640817f67ed8758a3", + commit = "e95c912e55094b90b6c02a6052c0a284b142e6b8", # includes chmod + bundle + dev_dependency fix ) # OCI image signing capabilities @@ -241,6 +242,12 @@ use_repo(componentize_py, "componentize_py_toolchain") register_toolchains("@componentize_py_toolchain//:componentize_py_toolchain") +# MoonBit hermetic toolchain for WebAssembly component builds (dev only) +moonbit = use_extension("@rules_moonbit//moonbit:extensions.bzl", "moonbit_toolchain_extension", dev_dependency = True) +use_repo(moonbit, "moonbit_toolchain") + +register_toolchains("@moonbit_toolchain//:moonbit_toolchain", dev_dependency = True) + # File Operations Component toolchain for universal file handling register_toolchains("//toolchains:file_ops_toolchain_target") diff --git a/moonbit/private/moonbit_wasm_component.bzl b/moonbit/private/moonbit_wasm_component.bzl index 11958693..2273b28f 100644 --- a/moonbit/private/moonbit_wasm_component.bzl +++ b/moonbit/private/moonbit_wasm_component.bzl @@ -46,6 +46,7 @@ def _moonbit_wasm_component_impl(ctx): moonbit_toolchain = ctx.toolchains["@rules_moonbit//moonbit:moonbit_toolchain_type"] moon = moonbit_toolchain.moonbit.moon_executable + moonbit_all_files = moonbit_toolchain.moonbit.all_files wit_file = ctx.file.wit srcs = ctx.files.srcs @@ -70,6 +71,12 @@ WIT_FILE="$(pwd)/{wit_file}" OUTPUT="$(pwd)/{output}" ORIG_DIR="$(pwd)" +# Set MOON_HOME so moon build can find the core library +# MOON path: /path/to/external/moonbit_toolchain/bin/moon +# MOON_HOME: /path/to/external/moonbit_toolchain/.moon +TOOLCHAIN_ROOT=$(dirname $(dirname "$MOON")) +export MOON_HOME="$TOOLCHAIN_ROOT/.moon" + # Create temporary project directory PROJECT_DIR=$(mktemp -d) cleanup() {{ rm -rf "$PROJECT_DIR"; }} @@ -94,7 +101,7 @@ if [ -d "$STUB_DIR" ]; then fi # Step 3: Compile with MoonBit -"$MOON" build --target wasm --release 2>&1 || {{ +"$MOON" build --target wasm 2>&1 || {{ echo "MoonBit compilation failed" >&2 exit 1 }} @@ -107,7 +114,9 @@ if [ -z "$CORE_WASM" ]; then fi # Step 4: Embed WIT metadata +# Use --encoding utf16 for MoonBit string encoding "$WASM_TOOLS" component embed \\ + --encoding utf16 \\ --world {world} \\ "$WIT_FILE" \\ "$CORE_WASM" \\ @@ -135,7 +144,7 @@ echo "Created component: $OUTPUT" ctx.actions.run_shell( command = script, - inputs = [wit_file, wit_bindgen, moon, wasm_tools] + srcs, + inputs = [wit_file, wit_bindgen, moon, wasm_tools] + srcs + moonbit_all_files.to_list(), outputs = [component_wasm], mnemonic = "MoonbitWasmComponent", progress_message = "Building MoonBit WASM component %s" % ctx.label,