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/cpp/defs.bzl b/cpp/defs.bzl index 5e5f0f20..b67bca23 100644 --- a/cpp/defs.bzl +++ b/cpp/defs.bzl @@ -68,6 +68,8 @@ Example usage: ) """ +load("@rules_cc//cc/common:cc_common.bzl", "cc_common") +load("@rules_cc//cc/common:cc_info.bzl", "CcInfo") load("//providers:providers.bzl", "WasmComponentInfo") load("//rust:transitions.bzl", "wasm_transition") load("//tools/bazel_helpers:file_ops_actions.bzl", "setup_cpp_workspace_action") diff --git a/cpp/private/cpp_wasm_binary.bzl b/cpp/private/cpp_wasm_binary.bzl index 3c4309a3..65e1fb91 100644 --- a/cpp/private/cpp_wasm_binary.bzl +++ b/cpp/private/cpp_wasm_binary.bzl @@ -29,6 +29,7 @@ Example usage: # Run with: wasmtime run bazel-bin/examples/hello.wasm """ +load("@rules_cc//cc/common:cc_info.bzl", "CcInfo") load("//providers:providers.bzl", "WasmComponentInfo") load("//rust:transitions.bzl", "wasm_transition") load("//tools/bazel_helpers:file_ops_actions.bzl", "setup_cpp_workspace_action") 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, diff --git a/rust/private/rust_wasm_component_bindgen.bzl b/rust/private/rust_wasm_component_bindgen.bzl index 5a834b91..1a3cb933 100644 --- a/rust/private/rust_wasm_component_bindgen.bzl +++ b/rust/private/rust_wasm_component_bindgen.bzl @@ -1,5 +1,6 @@ """Rust WASM component with WIT bindgen integration""" +load("@rules_cc//cc/common:cc_info.bzl", "CcInfo") load("@rules_rust//rust:defs.bzl", "rust_common", "rust_library") load("//wit:defs.bzl", "symmetric_wit_bindgen", "wit_bindgen") load("//toolchains:tool_versions.bzl", "get_tool_version") diff --git a/test/cpp/cpp_component_tests.bzl b/test/cpp/cpp_component_tests.bzl index 5eb361ca..40d0539c 100644 --- a/test/cpp/cpp_component_tests.bzl +++ b/test/cpp/cpp_component_tests.bzl @@ -8,6 +8,7 @@ This module provides comprehensive testing for WASI SDK + clang integration: """ load("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts") +load("@rules_cc//cc/common:cc_info.bzl", "CcInfo") load("@rules_wasm_component//providers:providers.bzl", "WasmComponentInfo") def _cpp_component_analysis_test_impl(ctx): diff --git a/toolchains/wasi_sdk_toolchain.bzl b/toolchains/wasi_sdk_toolchain.bzl index 41814f04..24f24d36 100644 --- a/toolchains/wasi_sdk_toolchain.bzl +++ b/toolchains/wasi_sdk_toolchain.bzl @@ -292,12 +292,14 @@ alias( # Create cc_toolchain_config.bzl with proper path resolution cc_config_content = ''' load( - "@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl", + "@rules_cc//cc:cc_toolchain_config_lib.bzl", "feature", "flag_group", "flag_set", "tool_path", ) +load("@rules_cc//cc/common:cc_common.bzl", "cc_common") +load("@rules_cc//cc/toolchains:cc_toolchain_config_info.bzl", "CcToolchainConfigInfo") def _wasm_cc_toolchain_config_impl(ctx): """C++ toolchain config for WASM using WASI SDK""" diff --git a/toolchains/wasm_cc_toolchain.bzl b/toolchains/wasm_cc_toolchain.bzl index 98a2e9ef..154f36a9 100644 --- a/toolchains/wasm_cc_toolchain.bzl +++ b/toolchains/wasm_cc_toolchain.bzl @@ -1,7 +1,7 @@ """Minimal C++ toolchain for WASM builds""" load( - "@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl", + "@rules_cc//cc:cc_toolchain_config_lib.bzl", "env_entry", "env_set", "feature", @@ -9,6 +9,8 @@ load( "flag_set", "tool_path", ) +load("@rules_cc//cc/common:cc_common.bzl", "cc_common") +load("@rules_cc//cc/toolchains:cc_toolchain_config_info.bzl", "CcToolchainConfigInfo") def _wasm_cc_toolchain_config_impl(ctx): """C++ toolchain config for WASM using WASI SDK"""