File size: 4,989 Bytes
7932636
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
{
  description = "Synapse Agriculture β€” WASM-native farm stack development environment";

  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    rust-overlay.url = "github:oxalica/rust-overlay";
    flake-utils.url = "github:numtide/flake-utils";
  };

  outputs = { self, nixpkgs, rust-overlay, flake-utils }:
    flake-utils.lib.eachDefaultSystem (system:
      let
        overlays = [ (import rust-overlay) ];
        pkgs = import nixpkgs { inherit system overlays; };

        # Rust stable with WASM targets.
        # Two targets, two purposes:
        #   wasm32-unknown-unknown β†’ bare WASM for MCU (wasm3) and browser
        #   wasm32-wasip1          β†’ WASI preview 1 for gateway/host (wasmtime)
        rustToolchain = pkgs.rust-bin.stable.latest.default.override {
          extensions = [ "rust-src" "rust-analyzer" ];
          targets = [
            "wasm32-unknown-unknown"
            "wasm32-wasip1"
          ];
        };

      in
      {
        devShells.default = pkgs.mkShell {
          buildInputs = with pkgs; [
            # ── Rust compilation ──────────────────────────────────────
            rustToolchain

            # ── WASM runtimes ─────────────────────────────────────────
            wasmtime       # Full WASI + Component Model runtime
                           # Tests gateway/host modules with all capabilities

            # ── WASM binary tools ─────────────────────────────────────
            binaryen       # wasm-opt: aggressive size optimization
                           # wasm-opt -Oz -o small.wasm big.wasm
                           # Critical for MCU β€” can cut binaries 40-60%

            wabt           # wasm2wat / wat2wasm: bytecode inspection
                           # When something breaks, read the WAT

            wasm-tools     # Bytecode Alliance multi-tool:
                           #   validate, component lower, strip, compose
                           # component lower = component β†’ core wasm for MCU

            # ── Web frontend ──────────────────────────────────────────
            trunk          # Dev server for Leptos/Yew WASM apps
                           # Handles wasm-bindgen, assets, hot reload
            wasm-pack      # WASM npm package builder (JS interop)
            wasm-bindgen-cli

            # ── Size profiling ────────────────────────────────────────
            twiggy         # WASM code size profiler
                           # twiggy top module.wasm β€” largest functions
                           # twiggy dominators module.wasm β€” dep graph
                           # RP2350 budget: ~400KB for module + heap

            # ── Build deps ────────────────────────────────────────────
            cmake          # For building wasm3 from source
            pkg-config
            openssl

            # ── Dev workflow ──────────────────────────────────────────
            cargo-watch    # cargo watch -x test β€” auto-test on save
          ];

          shellHook = ''
            echo ""
            echo "  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”"
            echo "  β”‚  Synapse Agriculture β€” WASM Dev Environment  β”‚"
            echo "  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜"
            echo ""
            echo "  Rust:      $(rustc --version 2>/dev/null || echo 'loading...')"
            echo "  wasmtime:  $(wasmtime --version 2>/dev/null || echo 'loading...')"
            echo "  wasm-opt:  $(wasm-opt --version 2>/dev/null || echo 'loading...')"
            echo ""
            echo "  Build targets:"
            echo "    wasm32-unknown-unknown  β†’ MCU (wasm3) + browser"
            echo "    wasm32-wasip1           β†’ gateway/host (wasmtime)"
            echo ""
            echo "  Quick start:"
            echo "    cargo test                                      all native tests"
            echo "    cargo build -p synapse-sensor --target wasm32-unknown-unknown --release"
            echo "    wasm-opt -Oz -o opt.wasm target/.../synapse_sensor.wasm"
            echo "    twiggy top opt.wasm                             size check"
            echo ""
          '';
        };
      }
    );
}