Build wasmtime with wasmtime-c-api-impl crate - #501

Merged
leonm1 merged 9 commits into
proxy-wasm:mainfrom
leonm1:build/wasmtime
Mar 12, 2026
Merged

Build wasmtime with wasmtime-c-api-impl crate#501
leonm1 merged 9 commits into
proxy-wasm:mainfrom
leonm1:build/wasmtime

Conversation

@leonm1

@leonm1leonm1 commented Mar 2, 2026

Copy link
Copy Markdown
Contributor

Always uses prefixed wasmtime-c-api-impl, otherwise the prefixed implementation bitrots. Prefixes the headers in the repo rule to allow for globbing, which is not possible in a genrule.

The crates_vendor-provided wasmtime-c-api-impl provided build allows us to upgrade wasmtime solely by changing the version number in the repositories.bzl and Cargo.toml files.

Build off of #496

@leonm1
leonm1force-pushed the build/wasmtime branch 3 times, most recently from 6bcf94e to 144d005CompareMarch 2, 2026 15:19
Comment threadbazel/cargo/wasmtime/Cargo.toml Outdated

@PiotrSikoraPiotrSikora left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few high-level comments:

  1. Why? Looking at the changes, the benefits don't seem very obvious.
  2. Always using prefixed variant seems fine (although, I think there was a reason why it wasn't the default - perhaps something with Envoy build?), but is that something that's at all relevant with the move to Wasmtime C++ API in #503?
  3. Using wasmtime-c-api-impl and always using prefixed variant are pretty separate changes, so might be good to split them off (but if they are too intertwined and would result in a throwaway work, then we can keep this as-is).

Comment threadbazel/cargo/wasmtime/Cargo.toml Outdated
Comment threadbazel/repositories.bzl Outdated
Comment threadbazel/external/wasmtime.BUILD Outdated
Comment threadbazel/cargo/wasmtime/Cargo.Bazel.lock Outdated

@leonm1leonm1 left a comment

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why? Looking at the changes, the benefits don't seem very obvious.

Two things:

  1. Updating wasmtime resulted in our rust_static_library in wasmtime.BUILD failing to build due to missing dependencies. With this current approach, the dependency tree is resolved by Cargo and we simply wrap it in rust_static_library. Updates which pull in new dependencies are trivial after this change and (in theory) will never require hunting down missing dependencies.
  2. For prefixing itself, using parts of the wasmtime_c_api (as opposed to the raw wasm_c_api in wasm.h / required for limits) involves a whole tree of c header files in the c-api crate. The approach we used previously, prefixing individual files via genrule, doesn't work with globs for all the required files (as bazel requires declaring all genrule outputs), so the toil and complexity of the old build would be increased significantly to support limits.

Always using prefixed variant seems fine (although, I think there was a reason why it wasn't the default - perhaps something with Envoy build?), but is that something that's at all relevant with the move to Wasmtime C++ API in #503?

Envoy build itself ran the multi runtime tests, so I don't think it required the non-prefixed version.

Using wasmtime-c-api-impl and always using prefixed variant are pretty separate changes, so might be good to split them off (but if they are too intertwined and would result in a throwaway work, then we can keep this as-is).

Ack. I'm considering this a "change how we build wasmtime" PR, which makes sense semantically. While they are separable, due to higher priority tasks on my todo list, I simply don't have a couple hours to spare to split this.

Comment threadbazel/cargo/wasmtime/Cargo.Bazel.lock Outdated
Comment threadbazel/external/wasmtime.BUILD Outdated
Comment threadbazel/repositories.bzl Outdated
Comment threadbazel/cargo/wasmtime/Cargo.toml Outdated
@PiotrSikora

Copy link
Copy Markdown
Member

Envoy build itself ran the multi runtime tests, so I don't think it required the non-prefixed version.

I don't believe that was ever the case, and I cannot find a code that would support that.

Do you have a link? If not, could you open a draft PR against Envoy (you'll need to do that anyway at some point) and verify that it builds fine with Wasmtime - it can be either this PR or off the last PR in the stacked series.

@leonm1

leonm1 commented Mar 12, 2026

Copy link
Copy Markdown
ContributorAuthor

could you open a draft PR against Envoy (you'll need to do that anyway at some point) and verify that it builds fine with Wasmtime

envoyproxy/envoy#43920, made some additional minor changes to fix the build.

@leonm1
leonm1 requested a review from PiotrSikoraMarch 12, 2026 03:12
@leonm1
leonm1 marked this pull request as ready for review March 12, 2026 03:12

@PiotrSikoraPiotrSikora left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM (assuming that all Envoy tests pass), but could you shorten the commit subject? Perhaps drop the "crates_universe-provided" part?

Also, after taking another look at it, I'd probably remove the prefixed version altogether, since I don't think anybody is shipping with multiple engines (but maybe I'm wrong?).

@leonm1leonm1 changed the title Refactor wasmtime build to use crates_universe-provided wasmtime-c-api-impl crateBuild wasmtime with wasmtime-c-api-impl crateMar 12, 2026
@PiotrSikora

Copy link
Copy Markdown
Member

Circling back on the prefixed variant and use of multiengine in real products - it looks that ATS supports multiple Wasm engines, but it builds them using standard tools, and not our Bazel build process, so it doesn't get the prefixed version anyway (and it has a warning about conflict between Wasmtime & WAMR due to the same exported symbols).

@leonm1

Copy link
Copy Markdown
ContributorAuthor

The commits still exist, so I am okay if we drop the prefixed variant in this PR and can discuss adding it back in conjunction with supporting it in Envoy.

@PiotrSikora

Copy link
Copy Markdown
Member

The commits still exist, so I am okay if we drop the prefixed variant in this PR and can discuss adding it back in conjunction with supporting it in Envoy.

The only value from prefixed variant (assuming nobody is using it in production) is that we could do:

bazelisk test --define engine=multiengine //test/...

and it would run tests across all the Wasm engines, instead of requiring per-engine invocation.

@leonm1

Copy link
Copy Markdown
ContributorAuthor

I currently use this regularly:

bazelisk test --define engine=multi //test/...

However, in the interest of getting the wasmtime update merged, I'm happy to drop the prefixed variant for now, and reintroduce it "properly" later.

@PiotrSikora

Copy link
Copy Markdown
Member

I currently use this regularly:

bazelisk test --define engine=multi //test/...

However, in the interest of getting the wasmtime update merged, I'm happy to drop the prefixed variant for now, and reintroduce it "properly" later.

Oh, no... it's not a blocker or a requirement (I already approved this PR) - I was just wondering if it provides any value, since there is clearly some minimal maintenance overhead.

@leonm1
leonm1force-pushed the build/wasmtime branch 2 times, most recently from fc45c81 to 3433effCompareMarch 12, 2026 19:46
leonm1 added a commit to leonm1/proxy-wasm-cpp-host that referenced this pull request Mar 12, 2026
Required for proxy-wasm#501
Signed-off-by: Matt Leon <mattleon@google.com>
@leonm1leonm1 mentioned this pull request Mar 12, 2026
leonm1 added a commit to leonm1/proxy-wasm-cpp-host that referenced this pull request Mar 12, 2026
Required for proxy-wasm#501
Signed-off-by: Matt Leon <mattleon@google.com>
leonm1 added a commit that referenced this pull request Mar 12, 2026
Required for #501
Signed-off-by: Matt Leon <mattleon@google.com>
Always uses prefixed wasmtime-c-api-impl, otherwise the prefixed
implementation bitrots. Prefixes the headers in the repo rule to allow
for globbing, which is not possible in a genrule.
The crates_vendor-provided wasmtime-c-api-impl provided build allows us
to upgrade wasmtime solely by changing the version number in the
Cargo.toml file (and the corresponding repo in bazel/repositories.bzl
for the C headers).
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
proxy-wasm#523 demonstrated that source rewriting via patch_args is expensive.
Signed-off-by: Matt Leon <mattleon@google.com>
@leonm1
leonm1 enabled auto-merge (squash) March 12, 2026 22:04
@leonm1
leonm1 merged commit 0c955e8 into proxy-wasm:mainMar 12, 2026
30 checks passed
leonm1 added a commit that referenced this pull request Mar 13, 2026
Built off of #501.
---------
Signed-off-by: Matt Leon <mattleon@google.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@leonm1@PiotrSikora
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Build wasmtime with wasmtime-c-api-impl crate - #501

Merged
leonm1 merged 9 commits into
proxy-wasm:mainfrom
leonm1:build/wasmtime
Mar 12, 2026
Merged

Build wasmtime with wasmtime-c-api-impl crate#501
leonm1 merged 9 commits into
proxy-wasm:mainfrom
leonm1:build/wasmtime

Conversation

@leonm1

@leonm1leonm1 commented Mar 2, 2026

Copy link
Copy Markdown
Contributor

Always uses prefixed wasmtime-c-api-impl, otherwise the prefixed implementation bitrots. Prefixes the headers in the repo rule to allow for globbing, which is not possible in a genrule.

The crates_vendor-provided wasmtime-c-api-impl provided build allows us to upgrade wasmtime solely by changing the version number in the repositories.bzl and Cargo.toml files.

Build off of #496

@leonm1
leonm1force-pushed the build/wasmtime branch 3 times, most recently from 6bcf94e to 144d005CompareMarch 2, 2026 15:19
Comment threadbazel/cargo/wasmtime/Cargo.toml Outdated

@PiotrSikoraPiotrSikora left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few high-level comments:

  1. Why? Looking at the changes, the benefits don't seem very obvious.
  2. Always using prefixed variant seems fine (although, I think there was a reason why it wasn't the default - perhaps something with Envoy build?), but is that something that's at all relevant with the move to Wasmtime C++ API in #503?
  3. Using wasmtime-c-api-impl and always using prefixed variant are pretty separate changes, so might be good to split them off (but if they are too intertwined and would result in a throwaway work, then we can keep this as-is).

Comment threadbazel/cargo/wasmtime/Cargo.toml Outdated
Comment threadbazel/repositories.bzl Outdated
Comment threadbazel/external/wasmtime.BUILD Outdated
Comment threadbazel/cargo/wasmtime/Cargo.Bazel.lock Outdated

@leonm1leonm1 left a comment

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why? Looking at the changes, the benefits don't seem very obvious.

Two things:

  1. Updating wasmtime resulted in our rust_static_library in wasmtime.BUILD failing to build due to missing dependencies. With this current approach, the dependency tree is resolved by Cargo and we simply wrap it in rust_static_library. Updates which pull in new dependencies are trivial after this change and (in theory) will never require hunting down missing dependencies.
  2. For prefixing itself, using parts of the wasmtime_c_api (as opposed to the raw wasm_c_api in wasm.h / required for limits) involves a whole tree of c header files in the c-api crate. The approach we used previously, prefixing individual files via genrule, doesn't work with globs for all the required files (as bazel requires declaring all genrule outputs), so the toil and complexity of the old build would be increased significantly to support limits.

Always using prefixed variant seems fine (although, I think there was a reason why it wasn't the default - perhaps something with Envoy build?), but is that something that's at all relevant with the move to Wasmtime C++ API in #503?

Envoy build itself ran the multi runtime tests, so I don't think it required the non-prefixed version.

Using wasmtime-c-api-impl and always using prefixed variant are pretty separate changes, so might be good to split them off (but if they are too intertwined and would result in a throwaway work, then we can keep this as-is).

Ack. I'm considering this a "change how we build wasmtime" PR, which makes sense semantically. While they are separable, due to higher priority tasks on my todo list, I simply don't have a couple hours to spare to split this.

Comment threadbazel/cargo/wasmtime/Cargo.Bazel.lock Outdated
Comment threadbazel/external/wasmtime.BUILD Outdated
Comment threadbazel/repositories.bzl Outdated
Comment threadbazel/cargo/wasmtime/Cargo.toml Outdated
@PiotrSikora

Copy link
Copy Markdown
Member

Envoy build itself ran the multi runtime tests, so I don't think it required the non-prefixed version.

I don't believe that was ever the case, and I cannot find a code that would support that.

Do you have a link? If not, could you open a draft PR against Envoy (you'll need to do that anyway at some point) and verify that it builds fine with Wasmtime - it can be either this PR or off the last PR in the stacked series.

@leonm1

leonm1 commented Mar 12, 2026

Copy link
Copy Markdown
ContributorAuthor

could you open a draft PR against Envoy (you'll need to do that anyway at some point) and verify that it builds fine with Wasmtime

envoyproxy/envoy#43920, made some additional minor changes to fix the build.

@leonm1
leonm1 requested a review from PiotrSikoraMarch 12, 2026 03:12
@leonm1
leonm1 marked this pull request as ready for review March 12, 2026 03:12

@PiotrSikoraPiotrSikora left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM (assuming that all Envoy tests pass), but could you shorten the commit subject? Perhaps drop the "crates_universe-provided" part?

Also, after taking another look at it, I'd probably remove the prefixed version altogether, since I don't think anybody is shipping with multiple engines (but maybe I'm wrong?).

@leonm1leonm1 changed the title Refactor wasmtime build to use crates_universe-provided wasmtime-c-api-impl crateBuild wasmtime with wasmtime-c-api-impl crateMar 12, 2026
@PiotrSikora

Copy link
Copy Markdown
Member

Circling back on the prefixed variant and use of multiengine in real products - it looks that ATS supports multiple Wasm engines, but it builds them using standard tools, and not our Bazel build process, so it doesn't get the prefixed version anyway (and it has a warning about conflict between Wasmtime & WAMR due to the same exported symbols).

@leonm1

Copy link
Copy Markdown
ContributorAuthor

The commits still exist, so I am okay if we drop the prefixed variant in this PR and can discuss adding it back in conjunction with supporting it in Envoy.

@PiotrSikora

Copy link
Copy Markdown
Member

The commits still exist, so I am okay if we drop the prefixed variant in this PR and can discuss adding it back in conjunction with supporting it in Envoy.

The only value from prefixed variant (assuming nobody is using it in production) is that we could do:

bazelisk test --define engine=multiengine //test/...

and it would run tests across all the Wasm engines, instead of requiring per-engine invocation.

@leonm1

Copy link
Copy Markdown
ContributorAuthor

I currently use this regularly:

bazelisk test --define engine=multi //test/...

However, in the interest of getting the wasmtime update merged, I'm happy to drop the prefixed variant for now, and reintroduce it "properly" later.

@PiotrSikora

Copy link
Copy Markdown
Member

I currently use this regularly:

bazelisk test --define engine=multi //test/...

However, in the interest of getting the wasmtime update merged, I'm happy to drop the prefixed variant for now, and reintroduce it "properly" later.

Oh, no... it's not a blocker or a requirement (I already approved this PR) - I was just wondering if it provides any value, since there is clearly some minimal maintenance overhead.

@leonm1
leonm1force-pushed the build/wasmtime branch 2 times, most recently from fc45c81 to 3433effCompareMarch 12, 2026 19:46
leonm1 added a commit to leonm1/proxy-wasm-cpp-host that referenced this pull request Mar 12, 2026
Required for proxy-wasm#501
Signed-off-by: Matt Leon <mattleon@google.com>
@leonm1leonm1 mentioned this pull request Mar 12, 2026
leonm1 added a commit to leonm1/proxy-wasm-cpp-host that referenced this pull request Mar 12, 2026
Required for proxy-wasm#501
Signed-off-by: Matt Leon <mattleon@google.com>
leonm1 added a commit that referenced this pull request Mar 12, 2026
Required for #501
Signed-off-by: Matt Leon <mattleon@google.com>
Always uses prefixed wasmtime-c-api-impl, otherwise the prefixed
implementation bitrots. Prefixes the headers in the repo rule to allow
for globbing, which is not possible in a genrule.
The crates_vendor-provided wasmtime-c-api-impl provided build allows us
to upgrade wasmtime solely by changing the version number in the
Cargo.toml file (and the corresponding repo in bazel/repositories.bzl
for the C headers).
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
proxy-wasm#523 demonstrated that source rewriting via patch_args is expensive.
Signed-off-by: Matt Leon <mattleon@google.com>
@leonm1
leonm1 enabled auto-merge (squash) March 12, 2026 22:04
@leonm1
leonm1 merged commit 0c955e8 into proxy-wasm:mainMar 12, 2026
30 checks passed
leonm1 added a commit that referenced this pull request Mar 13, 2026
Built off of #501.
---------
Signed-off-by: Matt Leon <mattleon@google.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@leonm1@PiotrSikora
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Build wasmtime with wasmtime-c-api-impl crate - #501

Merged
leonm1 merged 9 commits into
proxy-wasm:mainfrom
leonm1:build/wasmtime
Mar 12, 2026
Merged

Build wasmtime with wasmtime-c-api-impl crate#501
leonm1 merged 9 commits into
proxy-wasm:mainfrom
leonm1:build/wasmtime

Conversation

@leonm1

@leonm1leonm1 commented Mar 2, 2026

Copy link
Copy Markdown
Contributor

Always uses prefixed wasmtime-c-api-impl, otherwise the prefixed implementation bitrots. Prefixes the headers in the repo rule to allow for globbing, which is not possible in a genrule.

The crates_vendor-provided wasmtime-c-api-impl provided build allows us to upgrade wasmtime solely by changing the version number in the repositories.bzl and Cargo.toml files.

Build off of #496

@leonm1
leonm1force-pushed the build/wasmtime branch 3 times, most recently from 6bcf94e to 144d005CompareMarch 2, 2026 15:19
Comment threadbazel/cargo/wasmtime/Cargo.toml Outdated

@PiotrSikoraPiotrSikora left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few high-level comments:

  1. Why? Looking at the changes, the benefits don't seem very obvious.
  2. Always using prefixed variant seems fine (although, I think there was a reason why it wasn't the default - perhaps something with Envoy build?), but is that something that's at all relevant with the move to Wasmtime C++ API in #503?
  3. Using wasmtime-c-api-impl and always using prefixed variant are pretty separate changes, so might be good to split them off (but if they are too intertwined and would result in a throwaway work, then we can keep this as-is).

Comment threadbazel/cargo/wasmtime/Cargo.toml Outdated
Comment threadbazel/repositories.bzl Outdated
Comment threadbazel/external/wasmtime.BUILD Outdated
Comment threadbazel/cargo/wasmtime/Cargo.Bazel.lock Outdated

@leonm1leonm1 left a comment

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why? Looking at the changes, the benefits don't seem very obvious.

Two things:

  1. Updating wasmtime resulted in our rust_static_library in wasmtime.BUILD failing to build due to missing dependencies. With this current approach, the dependency tree is resolved by Cargo and we simply wrap it in rust_static_library. Updates which pull in new dependencies are trivial after this change and (in theory) will never require hunting down missing dependencies.
  2. For prefixing itself, using parts of the wasmtime_c_api (as opposed to the raw wasm_c_api in wasm.h / required for limits) involves a whole tree of c header files in the c-api crate. The approach we used previously, prefixing individual files via genrule, doesn't work with globs for all the required files (as bazel requires declaring all genrule outputs), so the toil and complexity of the old build would be increased significantly to support limits.

Always using prefixed variant seems fine (although, I think there was a reason why it wasn't the default - perhaps something with Envoy build?), but is that something that's at all relevant with the move to Wasmtime C++ API in #503?

Envoy build itself ran the multi runtime tests, so I don't think it required the non-prefixed version.

Using wasmtime-c-api-impl and always using prefixed variant are pretty separate changes, so might be good to split them off (but if they are too intertwined and would result in a throwaway work, then we can keep this as-is).

Ack. I'm considering this a "change how we build wasmtime" PR, which makes sense semantically. While they are separable, due to higher priority tasks on my todo list, I simply don't have a couple hours to spare to split this.

Comment threadbazel/cargo/wasmtime/Cargo.Bazel.lock Outdated
Comment threadbazel/external/wasmtime.BUILD Outdated
Comment threadbazel/repositories.bzl Outdated
Comment threadbazel/cargo/wasmtime/Cargo.toml Outdated
@PiotrSikora

Copy link
Copy Markdown
Member

Envoy build itself ran the multi runtime tests, so I don't think it required the non-prefixed version.

I don't believe that was ever the case, and I cannot find a code that would support that.

Do you have a link? If not, could you open a draft PR against Envoy (you'll need to do that anyway at some point) and verify that it builds fine with Wasmtime - it can be either this PR or off the last PR in the stacked series.

@leonm1

leonm1 commented Mar 12, 2026

Copy link
Copy Markdown
ContributorAuthor

could you open a draft PR against Envoy (you'll need to do that anyway at some point) and verify that it builds fine with Wasmtime

envoyproxy/envoy#43920, made some additional minor changes to fix the build.

@leonm1
leonm1 requested a review from PiotrSikoraMarch 12, 2026 03:12
@leonm1
leonm1 marked this pull request as ready for review March 12, 2026 03:12

@PiotrSikoraPiotrSikora left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM (assuming that all Envoy tests pass), but could you shorten the commit subject? Perhaps drop the "crates_universe-provided" part?

Also, after taking another look at it, I'd probably remove the prefixed version altogether, since I don't think anybody is shipping with multiple engines (but maybe I'm wrong?).

@leonm1leonm1 changed the title Refactor wasmtime build to use crates_universe-provided wasmtime-c-api-impl crateBuild wasmtime with wasmtime-c-api-impl crateMar 12, 2026
@PiotrSikora

Copy link
Copy Markdown
Member

Circling back on the prefixed variant and use of multiengine in real products - it looks that ATS supports multiple Wasm engines, but it builds them using standard tools, and not our Bazel build process, so it doesn't get the prefixed version anyway (and it has a warning about conflict between Wasmtime & WAMR due to the same exported symbols).

@leonm1

Copy link
Copy Markdown
ContributorAuthor

The commits still exist, so I am okay if we drop the prefixed variant in this PR and can discuss adding it back in conjunction with supporting it in Envoy.

@PiotrSikora

Copy link
Copy Markdown
Member

The commits still exist, so I am okay if we drop the prefixed variant in this PR and can discuss adding it back in conjunction with supporting it in Envoy.

The only value from prefixed variant (assuming nobody is using it in production) is that we could do:

bazelisk test --define engine=multiengine //test/...

and it would run tests across all the Wasm engines, instead of requiring per-engine invocation.

@leonm1

Copy link
Copy Markdown
ContributorAuthor

I currently use this regularly:

bazelisk test --define engine=multi //test/...

However, in the interest of getting the wasmtime update merged, I'm happy to drop the prefixed variant for now, and reintroduce it "properly" later.

@PiotrSikora

Copy link
Copy Markdown
Member

I currently use this regularly:

bazelisk test --define engine=multi //test/...

However, in the interest of getting the wasmtime update merged, I'm happy to drop the prefixed variant for now, and reintroduce it "properly" later.

Oh, no... it's not a blocker or a requirement (I already approved this PR) - I was just wondering if it provides any value, since there is clearly some minimal maintenance overhead.

@leonm1
leonm1force-pushed the build/wasmtime branch 2 times, most recently from fc45c81 to 3433effCompareMarch 12, 2026 19:46
leonm1 added a commit to leonm1/proxy-wasm-cpp-host that referenced this pull request Mar 12, 2026
Required for proxy-wasm#501
Signed-off-by: Matt Leon <mattleon@google.com>
@leonm1leonm1 mentioned this pull request Mar 12, 2026
leonm1 added a commit to leonm1/proxy-wasm-cpp-host that referenced this pull request Mar 12, 2026
Required for proxy-wasm#501
Signed-off-by: Matt Leon <mattleon@google.com>
leonm1 added a commit that referenced this pull request Mar 12, 2026
Required for #501
Signed-off-by: Matt Leon <mattleon@google.com>
Always uses prefixed wasmtime-c-api-impl, otherwise the prefixed
implementation bitrots. Prefixes the headers in the repo rule to allow
for globbing, which is not possible in a genrule.
The crates_vendor-provided wasmtime-c-api-impl provided build allows us
to upgrade wasmtime solely by changing the version number in the
Cargo.toml file (and the corresponding repo in bazel/repositories.bzl
for the C headers).
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
proxy-wasm#523 demonstrated that source rewriting via patch_args is expensive.
Signed-off-by: Matt Leon <mattleon@google.com>
@leonm1
leonm1 enabled auto-merge (squash) March 12, 2026 22:04
@leonm1
leonm1 merged commit 0c955e8 into proxy-wasm:mainMar 12, 2026
30 checks passed
leonm1 added a commit that referenced this pull request Mar 13, 2026
Built off of #501.
---------
Signed-off-by: Matt Leon <mattleon@google.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@leonm1@PiotrSikora
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Build wasmtime with wasmtime-c-api-impl crate - #501

Merged
leonm1 merged 9 commits into
proxy-wasm:mainfrom
leonm1:build/wasmtime
Mar 12, 2026
Merged

Build wasmtime with wasmtime-c-api-impl crate#501
leonm1 merged 9 commits into
proxy-wasm:mainfrom
leonm1:build/wasmtime

Conversation

@leonm1

@leonm1leonm1 commented Mar 2, 2026

Copy link
Copy Markdown
Contributor

Always uses prefixed wasmtime-c-api-impl, otherwise the prefixed implementation bitrots. Prefixes the headers in the repo rule to allow for globbing, which is not possible in a genrule.

The crates_vendor-provided wasmtime-c-api-impl provided build allows us to upgrade wasmtime solely by changing the version number in the repositories.bzl and Cargo.toml files.

Build off of #496

@leonm1
leonm1force-pushed the build/wasmtime branch 3 times, most recently from 6bcf94e to 144d005CompareMarch 2, 2026 15:19
Comment threadbazel/cargo/wasmtime/Cargo.toml Outdated

@PiotrSikoraPiotrSikora left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few high-level comments:

  1. Why? Looking at the changes, the benefits don't seem very obvious.
  2. Always using prefixed variant seems fine (although, I think there was a reason why it wasn't the default - perhaps something with Envoy build?), but is that something that's at all relevant with the move to Wasmtime C++ API in #503?
  3. Using wasmtime-c-api-impl and always using prefixed variant are pretty separate changes, so might be good to split them off (but if they are too intertwined and would result in a throwaway work, then we can keep this as-is).

Comment threadbazel/cargo/wasmtime/Cargo.toml Outdated
Comment threadbazel/repositories.bzl Outdated
Comment threadbazel/external/wasmtime.BUILD Outdated
Comment threadbazel/cargo/wasmtime/Cargo.Bazel.lock Outdated

@leonm1leonm1 left a comment

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why? Looking at the changes, the benefits don't seem very obvious.

Two things:

  1. Updating wasmtime resulted in our rust_static_library in wasmtime.BUILD failing to build due to missing dependencies. With this current approach, the dependency tree is resolved by Cargo and we simply wrap it in rust_static_library. Updates which pull in new dependencies are trivial after this change and (in theory) will never require hunting down missing dependencies.
  2. For prefixing itself, using parts of the wasmtime_c_api (as opposed to the raw wasm_c_api in wasm.h / required for limits) involves a whole tree of c header files in the c-api crate. The approach we used previously, prefixing individual files via genrule, doesn't work with globs for all the required files (as bazel requires declaring all genrule outputs), so the toil and complexity of the old build would be increased significantly to support limits.

Always using prefixed variant seems fine (although, I think there was a reason why it wasn't the default - perhaps something with Envoy build?), but is that something that's at all relevant with the move to Wasmtime C++ API in #503?

Envoy build itself ran the multi runtime tests, so I don't think it required the non-prefixed version.

Using wasmtime-c-api-impl and always using prefixed variant are pretty separate changes, so might be good to split them off (but if they are too intertwined and would result in a throwaway work, then we can keep this as-is).

Ack. I'm considering this a "change how we build wasmtime" PR, which makes sense semantically. While they are separable, due to higher priority tasks on my todo list, I simply don't have a couple hours to spare to split this.

Comment threadbazel/cargo/wasmtime/Cargo.Bazel.lock Outdated
Comment threadbazel/external/wasmtime.BUILD Outdated
Comment threadbazel/repositories.bzl Outdated
Comment threadbazel/cargo/wasmtime/Cargo.toml Outdated
@PiotrSikora

Copy link
Copy Markdown
Member

Envoy build itself ran the multi runtime tests, so I don't think it required the non-prefixed version.

I don't believe that was ever the case, and I cannot find a code that would support that.

Do you have a link? If not, could you open a draft PR against Envoy (you'll need to do that anyway at some point) and verify that it builds fine with Wasmtime - it can be either this PR or off the last PR in the stacked series.

@leonm1

leonm1 commented Mar 12, 2026

Copy link
Copy Markdown
ContributorAuthor

could you open a draft PR against Envoy (you'll need to do that anyway at some point) and verify that it builds fine with Wasmtime

envoyproxy/envoy#43920, made some additional minor changes to fix the build.

@leonm1
leonm1 requested a review from PiotrSikoraMarch 12, 2026 03:12
@leonm1
leonm1 marked this pull request as ready for review March 12, 2026 03:12

@PiotrSikoraPiotrSikora left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM (assuming that all Envoy tests pass), but could you shorten the commit subject? Perhaps drop the "crates_universe-provided" part?

Also, after taking another look at it, I'd probably remove the prefixed version altogether, since I don't think anybody is shipping with multiple engines (but maybe I'm wrong?).

@leonm1leonm1 changed the title Refactor wasmtime build to use crates_universe-provided wasmtime-c-api-impl crateBuild wasmtime with wasmtime-c-api-impl crateMar 12, 2026
@PiotrSikora

Copy link
Copy Markdown
Member

Circling back on the prefixed variant and use of multiengine in real products - it looks that ATS supports multiple Wasm engines, but it builds them using standard tools, and not our Bazel build process, so it doesn't get the prefixed version anyway (and it has a warning about conflict between Wasmtime & WAMR due to the same exported symbols).

@leonm1

Copy link
Copy Markdown
ContributorAuthor

The commits still exist, so I am okay if we drop the prefixed variant in this PR and can discuss adding it back in conjunction with supporting it in Envoy.

@PiotrSikora

Copy link
Copy Markdown
Member

The commits still exist, so I am okay if we drop the prefixed variant in this PR and can discuss adding it back in conjunction with supporting it in Envoy.

The only value from prefixed variant (assuming nobody is using it in production) is that we could do:

bazelisk test --define engine=multiengine //test/...

and it would run tests across all the Wasm engines, instead of requiring per-engine invocation.

@leonm1

Copy link
Copy Markdown
ContributorAuthor

I currently use this regularly:

bazelisk test --define engine=multi //test/...

However, in the interest of getting the wasmtime update merged, I'm happy to drop the prefixed variant for now, and reintroduce it "properly" later.

@PiotrSikora

Copy link
Copy Markdown
Member

I currently use this regularly:

bazelisk test --define engine=multi //test/...

However, in the interest of getting the wasmtime update merged, I'm happy to drop the prefixed variant for now, and reintroduce it "properly" later.

Oh, no... it's not a blocker or a requirement (I already approved this PR) - I was just wondering if it provides any value, since there is clearly some minimal maintenance overhead.

@leonm1
leonm1force-pushed the build/wasmtime branch 2 times, most recently from fc45c81 to 3433effCompareMarch 12, 2026 19:46
leonm1 added a commit to leonm1/proxy-wasm-cpp-host that referenced this pull request Mar 12, 2026
Required for proxy-wasm#501
Signed-off-by: Matt Leon <mattleon@google.com>
@leonm1leonm1 mentioned this pull request Mar 12, 2026
leonm1 added a commit to leonm1/proxy-wasm-cpp-host that referenced this pull request Mar 12, 2026
Required for proxy-wasm#501
Signed-off-by: Matt Leon <mattleon@google.com>
leonm1 added a commit that referenced this pull request Mar 12, 2026
Required for #501
Signed-off-by: Matt Leon <mattleon@google.com>
Always uses prefixed wasmtime-c-api-impl, otherwise the prefixed
implementation bitrots. Prefixes the headers in the repo rule to allow
for globbing, which is not possible in a genrule.
The crates_vendor-provided wasmtime-c-api-impl provided build allows us
to upgrade wasmtime solely by changing the version number in the
Cargo.toml file (and the corresponding repo in bazel/repositories.bzl
for the C headers).
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
proxy-wasm#523 demonstrated that source rewriting via patch_args is expensive.
Signed-off-by: Matt Leon <mattleon@google.com>
@leonm1
leonm1 enabled auto-merge (squash) March 12, 2026 22:04
@leonm1
leonm1 merged commit 0c955e8 into proxy-wasm:mainMar 12, 2026
30 checks passed
leonm1 added a commit that referenced this pull request Mar 13, 2026
Built off of #501.
---------
Signed-off-by: Matt Leon <mattleon@google.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@leonm1@PiotrSikora
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Build wasmtime with wasmtime-c-api-impl crate - #501

Merged
leonm1 merged 9 commits into
proxy-wasm:mainfrom
leonm1:build/wasmtime
Mar 12, 2026
Merged

Build wasmtime with wasmtime-c-api-impl crate#501
leonm1 merged 9 commits into
proxy-wasm:mainfrom
leonm1:build/wasmtime

Conversation

@leonm1

@leonm1leonm1 commented Mar 2, 2026

Copy link
Copy Markdown
Contributor

Always uses prefixed wasmtime-c-api-impl, otherwise the prefixed implementation bitrots. Prefixes the headers in the repo rule to allow for globbing, which is not possible in a genrule.

The crates_vendor-provided wasmtime-c-api-impl provided build allows us to upgrade wasmtime solely by changing the version number in the repositories.bzl and Cargo.toml files.

Build off of #496

@leonm1
leonm1force-pushed the build/wasmtime branch 3 times, most recently from 6bcf94e to 144d005CompareMarch 2, 2026 15:19
Comment threadbazel/cargo/wasmtime/Cargo.toml Outdated

@PiotrSikoraPiotrSikora left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few high-level comments:

  1. Why? Looking at the changes, the benefits don't seem very obvious.
  2. Always using prefixed variant seems fine (although, I think there was a reason why it wasn't the default - perhaps something with Envoy build?), but is that something that's at all relevant with the move to Wasmtime C++ API in #503?
  3. Using wasmtime-c-api-impl and always using prefixed variant are pretty separate changes, so might be good to split them off (but if they are too intertwined and would result in a throwaway work, then we can keep this as-is).

Comment threadbazel/cargo/wasmtime/Cargo.toml Outdated
Comment threadbazel/repositories.bzl Outdated
Comment threadbazel/external/wasmtime.BUILD Outdated
Comment threadbazel/cargo/wasmtime/Cargo.Bazel.lock Outdated

@leonm1leonm1 left a comment

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why? Looking at the changes, the benefits don't seem very obvious.

Two things:

  1. Updating wasmtime resulted in our rust_static_library in wasmtime.BUILD failing to build due to missing dependencies. With this current approach, the dependency tree is resolved by Cargo and we simply wrap it in rust_static_library. Updates which pull in new dependencies are trivial after this change and (in theory) will never require hunting down missing dependencies.
  2. For prefixing itself, using parts of the wasmtime_c_api (as opposed to the raw wasm_c_api in wasm.h / required for limits) involves a whole tree of c header files in the c-api crate. The approach we used previously, prefixing individual files via genrule, doesn't work with globs for all the required files (as bazel requires declaring all genrule outputs), so the toil and complexity of the old build would be increased significantly to support limits.

Always using prefixed variant seems fine (although, I think there was a reason why it wasn't the default - perhaps something with Envoy build?), but is that something that's at all relevant with the move to Wasmtime C++ API in #503?

Envoy build itself ran the multi runtime tests, so I don't think it required the non-prefixed version.

Using wasmtime-c-api-impl and always using prefixed variant are pretty separate changes, so might be good to split them off (but if they are too intertwined and would result in a throwaway work, then we can keep this as-is).

Ack. I'm considering this a "change how we build wasmtime" PR, which makes sense semantically. While they are separable, due to higher priority tasks on my todo list, I simply don't have a couple hours to spare to split this.

Comment threadbazel/cargo/wasmtime/Cargo.Bazel.lock Outdated
Comment threadbazel/external/wasmtime.BUILD Outdated
Comment threadbazel/repositories.bzl Outdated
Comment threadbazel/cargo/wasmtime/Cargo.toml Outdated
@PiotrSikora

Copy link
Copy Markdown
Member

Envoy build itself ran the multi runtime tests, so I don't think it required the non-prefixed version.

I don't believe that was ever the case, and I cannot find a code that would support that.

Do you have a link? If not, could you open a draft PR against Envoy (you'll need to do that anyway at some point) and verify that it builds fine with Wasmtime - it can be either this PR or off the last PR in the stacked series.

@leonm1

leonm1 commented Mar 12, 2026

Copy link
Copy Markdown
ContributorAuthor

could you open a draft PR against Envoy (you'll need to do that anyway at some point) and verify that it builds fine with Wasmtime

envoyproxy/envoy#43920, made some additional minor changes to fix the build.

@leonm1
leonm1 requested a review from PiotrSikoraMarch 12, 2026 03:12
@leonm1
leonm1 marked this pull request as ready for review March 12, 2026 03:12

@PiotrSikoraPiotrSikora left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM (assuming that all Envoy tests pass), but could you shorten the commit subject? Perhaps drop the "crates_universe-provided" part?

Also, after taking another look at it, I'd probably remove the prefixed version altogether, since I don't think anybody is shipping with multiple engines (but maybe I'm wrong?).

@leonm1leonm1 changed the title Refactor wasmtime build to use crates_universe-provided wasmtime-c-api-impl crateBuild wasmtime with wasmtime-c-api-impl crateMar 12, 2026
@PiotrSikora

Copy link
Copy Markdown
Member

Circling back on the prefixed variant and use of multiengine in real products - it looks that ATS supports multiple Wasm engines, but it builds them using standard tools, and not our Bazel build process, so it doesn't get the prefixed version anyway (and it has a warning about conflict between Wasmtime & WAMR due to the same exported symbols).

@leonm1

Copy link
Copy Markdown
ContributorAuthor

The commits still exist, so I am okay if we drop the prefixed variant in this PR and can discuss adding it back in conjunction with supporting it in Envoy.

@PiotrSikora

Copy link
Copy Markdown
Member

The commits still exist, so I am okay if we drop the prefixed variant in this PR and can discuss adding it back in conjunction with supporting it in Envoy.

The only value from prefixed variant (assuming nobody is using it in production) is that we could do:

bazelisk test --define engine=multiengine //test/...

and it would run tests across all the Wasm engines, instead of requiring per-engine invocation.

@leonm1

Copy link
Copy Markdown
ContributorAuthor

I currently use this regularly:

bazelisk test --define engine=multi //test/...

However, in the interest of getting the wasmtime update merged, I'm happy to drop the prefixed variant for now, and reintroduce it "properly" later.

@PiotrSikora

Copy link
Copy Markdown
Member

I currently use this regularly:

bazelisk test --define engine=multi //test/...

However, in the interest of getting the wasmtime update merged, I'm happy to drop the prefixed variant for now, and reintroduce it "properly" later.

Oh, no... it's not a blocker or a requirement (I already approved this PR) - I was just wondering if it provides any value, since there is clearly some minimal maintenance overhead.

@leonm1
leonm1force-pushed the build/wasmtime branch 2 times, most recently from fc45c81 to 3433effCompareMarch 12, 2026 19:46
leonm1 added a commit to leonm1/proxy-wasm-cpp-host that referenced this pull request Mar 12, 2026
Required for proxy-wasm#501
Signed-off-by: Matt Leon <mattleon@google.com>
@leonm1leonm1 mentioned this pull request Mar 12, 2026
leonm1 added a commit to leonm1/proxy-wasm-cpp-host that referenced this pull request Mar 12, 2026
Required for proxy-wasm#501
Signed-off-by: Matt Leon <mattleon@google.com>
leonm1 added a commit that referenced this pull request Mar 12, 2026
Required for #501
Signed-off-by: Matt Leon <mattleon@google.com>
Always uses prefixed wasmtime-c-api-impl, otherwise the prefixed
implementation bitrots. Prefixes the headers in the repo rule to allow
for globbing, which is not possible in a genrule.
The crates_vendor-provided wasmtime-c-api-impl provided build allows us
to upgrade wasmtime solely by changing the version number in the
Cargo.toml file (and the corresponding repo in bazel/repositories.bzl
for the C headers).
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
proxy-wasm#523 demonstrated that source rewriting via patch_args is expensive.
Signed-off-by: Matt Leon <mattleon@google.com>
@leonm1
leonm1 enabled auto-merge (squash) March 12, 2026 22:04
@leonm1
leonm1 merged commit 0c955e8 into proxy-wasm:mainMar 12, 2026
30 checks passed
leonm1 added a commit that referenced this pull request Mar 13, 2026
Built off of #501.
---------
Signed-off-by: Matt Leon <mattleon@google.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@leonm1@PiotrSikora
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Build wasmtime with wasmtime-c-api-impl crate - #501

Merged
leonm1 merged 9 commits into
proxy-wasm:mainfrom
leonm1:build/wasmtime
Mar 12, 2026
Merged

Build wasmtime with wasmtime-c-api-impl crate#501
leonm1 merged 9 commits into
proxy-wasm:mainfrom
leonm1:build/wasmtime

Conversation

@leonm1

@leonm1leonm1 commented Mar 2, 2026

Copy link
Copy Markdown
Contributor

Always uses prefixed wasmtime-c-api-impl, otherwise the prefixed implementation bitrots. Prefixes the headers in the repo rule to allow for globbing, which is not possible in a genrule.

The crates_vendor-provided wasmtime-c-api-impl provided build allows us to upgrade wasmtime solely by changing the version number in the repositories.bzl and Cargo.toml files.

Build off of #496

@leonm1
leonm1force-pushed the build/wasmtime branch 3 times, most recently from 6bcf94e to 144d005CompareMarch 2, 2026 15:19
Comment threadbazel/cargo/wasmtime/Cargo.toml Outdated

@PiotrSikoraPiotrSikora left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few high-level comments:

  1. Why? Looking at the changes, the benefits don't seem very obvious.
  2. Always using prefixed variant seems fine (although, I think there was a reason why it wasn't the default - perhaps something with Envoy build?), but is that something that's at all relevant with the move to Wasmtime C++ API in #503?
  3. Using wasmtime-c-api-impl and always using prefixed variant are pretty separate changes, so might be good to split them off (but if they are too intertwined and would result in a throwaway work, then we can keep this as-is).

Comment threadbazel/cargo/wasmtime/Cargo.toml Outdated
Comment threadbazel/repositories.bzl Outdated
Comment threadbazel/external/wasmtime.BUILD Outdated
Comment threadbazel/cargo/wasmtime/Cargo.Bazel.lock Outdated

@leonm1leonm1 left a comment

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why? Looking at the changes, the benefits don't seem very obvious.

Two things:

  1. Updating wasmtime resulted in our rust_static_library in wasmtime.BUILD failing to build due to missing dependencies. With this current approach, the dependency tree is resolved by Cargo and we simply wrap it in rust_static_library. Updates which pull in new dependencies are trivial after this change and (in theory) will never require hunting down missing dependencies.
  2. For prefixing itself, using parts of the wasmtime_c_api (as opposed to the raw wasm_c_api in wasm.h / required for limits) involves a whole tree of c header files in the c-api crate. The approach we used previously, prefixing individual files via genrule, doesn't work with globs for all the required files (as bazel requires declaring all genrule outputs), so the toil and complexity of the old build would be increased significantly to support limits.

Always using prefixed variant seems fine (although, I think there was a reason why it wasn't the default - perhaps something with Envoy build?), but is that something that's at all relevant with the move to Wasmtime C++ API in #503?

Envoy build itself ran the multi runtime tests, so I don't think it required the non-prefixed version.

Using wasmtime-c-api-impl and always using prefixed variant are pretty separate changes, so might be good to split them off (but if they are too intertwined and would result in a throwaway work, then we can keep this as-is).

Ack. I'm considering this a "change how we build wasmtime" PR, which makes sense semantically. While they are separable, due to higher priority tasks on my todo list, I simply don't have a couple hours to spare to split this.

Comment threadbazel/cargo/wasmtime/Cargo.Bazel.lock Outdated
Comment threadbazel/external/wasmtime.BUILD Outdated
Comment threadbazel/repositories.bzl Outdated
Comment threadbazel/cargo/wasmtime/Cargo.toml Outdated
@PiotrSikora

Copy link
Copy Markdown
Member

Envoy build itself ran the multi runtime tests, so I don't think it required the non-prefixed version.

I don't believe that was ever the case, and I cannot find a code that would support that.

Do you have a link? If not, could you open a draft PR against Envoy (you'll need to do that anyway at some point) and verify that it builds fine with Wasmtime - it can be either this PR or off the last PR in the stacked series.

@leonm1

leonm1 commented Mar 12, 2026

Copy link
Copy Markdown
ContributorAuthor

could you open a draft PR against Envoy (you'll need to do that anyway at some point) and verify that it builds fine with Wasmtime

envoyproxy/envoy#43920, made some additional minor changes to fix the build.

@leonm1
leonm1 requested a review from PiotrSikoraMarch 12, 2026 03:12
@leonm1
leonm1 marked this pull request as ready for review March 12, 2026 03:12

@PiotrSikoraPiotrSikora left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM (assuming that all Envoy tests pass), but could you shorten the commit subject? Perhaps drop the "crates_universe-provided" part?

Also, after taking another look at it, I'd probably remove the prefixed version altogether, since I don't think anybody is shipping with multiple engines (but maybe I'm wrong?).

@leonm1leonm1 changed the title Refactor wasmtime build to use crates_universe-provided wasmtime-c-api-impl crateBuild wasmtime with wasmtime-c-api-impl crateMar 12, 2026
@PiotrSikora

Copy link
Copy Markdown
Member

Circling back on the prefixed variant and use of multiengine in real products - it looks that ATS supports multiple Wasm engines, but it builds them using standard tools, and not our Bazel build process, so it doesn't get the prefixed version anyway (and it has a warning about conflict between Wasmtime & WAMR due to the same exported symbols).

@leonm1

Copy link
Copy Markdown
ContributorAuthor

The commits still exist, so I am okay if we drop the prefixed variant in this PR and can discuss adding it back in conjunction with supporting it in Envoy.

@PiotrSikora

Copy link
Copy Markdown
Member

The commits still exist, so I am okay if we drop the prefixed variant in this PR and can discuss adding it back in conjunction with supporting it in Envoy.

The only value from prefixed variant (assuming nobody is using it in production) is that we could do:

bazelisk test --define engine=multiengine //test/...

and it would run tests across all the Wasm engines, instead of requiring per-engine invocation.

@leonm1

Copy link
Copy Markdown
ContributorAuthor

I currently use this regularly:

bazelisk test --define engine=multi //test/...

However, in the interest of getting the wasmtime update merged, I'm happy to drop the prefixed variant for now, and reintroduce it "properly" later.

@PiotrSikora

Copy link
Copy Markdown
Member

I currently use this regularly:

bazelisk test --define engine=multi //test/...

However, in the interest of getting the wasmtime update merged, I'm happy to drop the prefixed variant for now, and reintroduce it "properly" later.

Oh, no... it's not a blocker or a requirement (I already approved this PR) - I was just wondering if it provides any value, since there is clearly some minimal maintenance overhead.

@leonm1
leonm1force-pushed the build/wasmtime branch 2 times, most recently from fc45c81 to 3433effCompareMarch 12, 2026 19:46
leonm1 added a commit to leonm1/proxy-wasm-cpp-host that referenced this pull request Mar 12, 2026
Required for proxy-wasm#501
Signed-off-by: Matt Leon <mattleon@google.com>
@leonm1leonm1 mentioned this pull request Mar 12, 2026
leonm1 added a commit to leonm1/proxy-wasm-cpp-host that referenced this pull request Mar 12, 2026
Required for proxy-wasm#501
Signed-off-by: Matt Leon <mattleon@google.com>
leonm1 added a commit that referenced this pull request Mar 12, 2026
Required for #501
Signed-off-by: Matt Leon <mattleon@google.com>
Always uses prefixed wasmtime-c-api-impl, otherwise the prefixed
implementation bitrots. Prefixes the headers in the repo rule to allow
for globbing, which is not possible in a genrule.
The crates_vendor-provided wasmtime-c-api-impl provided build allows us
to upgrade wasmtime solely by changing the version number in the
Cargo.toml file (and the corresponding repo in bazel/repositories.bzl
for the C headers).
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
proxy-wasm#523 demonstrated that source rewriting via patch_args is expensive.
Signed-off-by: Matt Leon <mattleon@google.com>
@leonm1
leonm1 enabled auto-merge (squash) March 12, 2026 22:04
@leonm1
leonm1 merged commit 0c955e8 into proxy-wasm:mainMar 12, 2026
30 checks passed
leonm1 added a commit that referenced this pull request Mar 13, 2026
Built off of #501.
---------
Signed-off-by: Matt Leon <mattleon@google.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@leonm1@PiotrSikora
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Build wasmtime with wasmtime-c-api-impl crate - #501

Merged
leonm1 merged 9 commits into
proxy-wasm:mainfrom
leonm1:build/wasmtime
Mar 12, 2026
Merged

Build wasmtime with wasmtime-c-api-impl crate#501
leonm1 merged 9 commits into
proxy-wasm:mainfrom
leonm1:build/wasmtime

Conversation

@leonm1

@leonm1leonm1 commented Mar 2, 2026

Copy link
Copy Markdown
Contributor

Always uses prefixed wasmtime-c-api-impl, otherwise the prefixed implementation bitrots. Prefixes the headers in the repo rule to allow for globbing, which is not possible in a genrule.

The crates_vendor-provided wasmtime-c-api-impl provided build allows us to upgrade wasmtime solely by changing the version number in the repositories.bzl and Cargo.toml files.

Build off of #496

@leonm1
leonm1force-pushed the build/wasmtime branch 3 times, most recently from 6bcf94e to 144d005CompareMarch 2, 2026 15:19
Comment threadbazel/cargo/wasmtime/Cargo.toml Outdated

@PiotrSikoraPiotrSikora left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few high-level comments:

  1. Why? Looking at the changes, the benefits don't seem very obvious.
  2. Always using prefixed variant seems fine (although, I think there was a reason why it wasn't the default - perhaps something with Envoy build?), but is that something that's at all relevant with the move to Wasmtime C++ API in #503?
  3. Using wasmtime-c-api-impl and always using prefixed variant are pretty separate changes, so might be good to split them off (but if they are too intertwined and would result in a throwaway work, then we can keep this as-is).

Comment threadbazel/cargo/wasmtime/Cargo.toml Outdated
Comment threadbazel/repositories.bzl Outdated
Comment threadbazel/external/wasmtime.BUILD Outdated
Comment threadbazel/cargo/wasmtime/Cargo.Bazel.lock Outdated

@leonm1leonm1 left a comment

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why? Looking at the changes, the benefits don't seem very obvious.

Two things:

  1. Updating wasmtime resulted in our rust_static_library in wasmtime.BUILD failing to build due to missing dependencies. With this current approach, the dependency tree is resolved by Cargo and we simply wrap it in rust_static_library. Updates which pull in new dependencies are trivial after this change and (in theory) will never require hunting down missing dependencies.
  2. For prefixing itself, using parts of the wasmtime_c_api (as opposed to the raw wasm_c_api in wasm.h / required for limits) involves a whole tree of c header files in the c-api crate. The approach we used previously, prefixing individual files via genrule, doesn't work with globs for all the required files (as bazel requires declaring all genrule outputs), so the toil and complexity of the old build would be increased significantly to support limits.

Always using prefixed variant seems fine (although, I think there was a reason why it wasn't the default - perhaps something with Envoy build?), but is that something that's at all relevant with the move to Wasmtime C++ API in #503?

Envoy build itself ran the multi runtime tests, so I don't think it required the non-prefixed version.

Using wasmtime-c-api-impl and always using prefixed variant are pretty separate changes, so might be good to split them off (but if they are too intertwined and would result in a throwaway work, then we can keep this as-is).

Ack. I'm considering this a "change how we build wasmtime" PR, which makes sense semantically. While they are separable, due to higher priority tasks on my todo list, I simply don't have a couple hours to spare to split this.

Comment threadbazel/cargo/wasmtime/Cargo.Bazel.lock Outdated
Comment threadbazel/external/wasmtime.BUILD Outdated
Comment threadbazel/repositories.bzl Outdated
Comment threadbazel/cargo/wasmtime/Cargo.toml Outdated
@PiotrSikora

Copy link
Copy Markdown
Member

Envoy build itself ran the multi runtime tests, so I don't think it required the non-prefixed version.

I don't believe that was ever the case, and I cannot find a code that would support that.

Do you have a link? If not, could you open a draft PR against Envoy (you'll need to do that anyway at some point) and verify that it builds fine with Wasmtime - it can be either this PR or off the last PR in the stacked series.

@leonm1

leonm1 commented Mar 12, 2026

Copy link
Copy Markdown
ContributorAuthor

could you open a draft PR against Envoy (you'll need to do that anyway at some point) and verify that it builds fine with Wasmtime

envoyproxy/envoy#43920, made some additional minor changes to fix the build.

@leonm1
leonm1 requested a review from PiotrSikoraMarch 12, 2026 03:12
@leonm1
leonm1 marked this pull request as ready for review March 12, 2026 03:12

@PiotrSikoraPiotrSikora left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM (assuming that all Envoy tests pass), but could you shorten the commit subject? Perhaps drop the "crates_universe-provided" part?

Also, after taking another look at it, I'd probably remove the prefixed version altogether, since I don't think anybody is shipping with multiple engines (but maybe I'm wrong?).

@leonm1leonm1 changed the title Refactor wasmtime build to use crates_universe-provided wasmtime-c-api-impl crateBuild wasmtime with wasmtime-c-api-impl crateMar 12, 2026
@PiotrSikora

Copy link
Copy Markdown
Member

Circling back on the prefixed variant and use of multiengine in real products - it looks that ATS supports multiple Wasm engines, but it builds them using standard tools, and not our Bazel build process, so it doesn't get the prefixed version anyway (and it has a warning about conflict between Wasmtime & WAMR due to the same exported symbols).

@leonm1

Copy link
Copy Markdown
ContributorAuthor

The commits still exist, so I am okay if we drop the prefixed variant in this PR and can discuss adding it back in conjunction with supporting it in Envoy.

@PiotrSikora

Copy link
Copy Markdown
Member

The commits still exist, so I am okay if we drop the prefixed variant in this PR and can discuss adding it back in conjunction with supporting it in Envoy.

The only value from prefixed variant (assuming nobody is using it in production) is that we could do:

bazelisk test --define engine=multiengine //test/...

and it would run tests across all the Wasm engines, instead of requiring per-engine invocation.

@leonm1

Copy link
Copy Markdown
ContributorAuthor

I currently use this regularly:

bazelisk test --define engine=multi //test/...

However, in the interest of getting the wasmtime update merged, I'm happy to drop the prefixed variant for now, and reintroduce it "properly" later.

@PiotrSikora

Copy link
Copy Markdown
Member

I currently use this regularly:

bazelisk test --define engine=multi //test/...

However, in the interest of getting the wasmtime update merged, I'm happy to drop the prefixed variant for now, and reintroduce it "properly" later.

Oh, no... it's not a blocker or a requirement (I already approved this PR) - I was just wondering if it provides any value, since there is clearly some minimal maintenance overhead.

@leonm1
leonm1force-pushed the build/wasmtime branch 2 times, most recently from fc45c81 to 3433effCompareMarch 12, 2026 19:46
leonm1 added a commit to leonm1/proxy-wasm-cpp-host that referenced this pull request Mar 12, 2026
Required for proxy-wasm#501
Signed-off-by: Matt Leon <mattleon@google.com>
@leonm1leonm1 mentioned this pull request Mar 12, 2026
leonm1 added a commit to leonm1/proxy-wasm-cpp-host that referenced this pull request Mar 12, 2026
Required for proxy-wasm#501
Signed-off-by: Matt Leon <mattleon@google.com>
leonm1 added a commit that referenced this pull request Mar 12, 2026
Required for #501
Signed-off-by: Matt Leon <mattleon@google.com>
Always uses prefixed wasmtime-c-api-impl, otherwise the prefixed
implementation bitrots. Prefixes the headers in the repo rule to allow
for globbing, which is not possible in a genrule.
The crates_vendor-provided wasmtime-c-api-impl provided build allows us
to upgrade wasmtime solely by changing the version number in the
Cargo.toml file (and the corresponding repo in bazel/repositories.bzl
for the C headers).
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
proxy-wasm#523 demonstrated that source rewriting via patch_args is expensive.
Signed-off-by: Matt Leon <mattleon@google.com>
@leonm1
leonm1 enabled auto-merge (squash) March 12, 2026 22:04
@leonm1
leonm1 merged commit 0c955e8 into proxy-wasm:mainMar 12, 2026
30 checks passed
leonm1 added a commit that referenced this pull request Mar 13, 2026
Built off of #501.
---------
Signed-off-by: Matt Leon <mattleon@google.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@leonm1@PiotrSikora
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Build wasmtime with wasmtime-c-api-impl crate - #501

Merged
leonm1 merged 9 commits into
proxy-wasm:mainfrom
leonm1:build/wasmtime
Mar 12, 2026
Merged

Build wasmtime with wasmtime-c-api-impl crate#501
leonm1 merged 9 commits into
proxy-wasm:mainfrom
leonm1:build/wasmtime

Conversation

@leonm1

@leonm1leonm1 commented Mar 2, 2026

Copy link
Copy Markdown
Contributor

Always uses prefixed wasmtime-c-api-impl, otherwise the prefixed implementation bitrots. Prefixes the headers in the repo rule to allow for globbing, which is not possible in a genrule.

The crates_vendor-provided wasmtime-c-api-impl provided build allows us to upgrade wasmtime solely by changing the version number in the repositories.bzl and Cargo.toml files.

Build off of #496

@leonm1
leonm1force-pushed the build/wasmtime branch 3 times, most recently from 6bcf94e to 144d005CompareMarch 2, 2026 15:19
Comment threadbazel/cargo/wasmtime/Cargo.toml Outdated

@PiotrSikoraPiotrSikora left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A few high-level comments:

  1. Why? Looking at the changes, the benefits don't seem very obvious.
  2. Always using prefixed variant seems fine (although, I think there was a reason why it wasn't the default - perhaps something with Envoy build?), but is that something that's at all relevant with the move to Wasmtime C++ API in #503?
  3. Using wasmtime-c-api-impl and always using prefixed variant are pretty separate changes, so might be good to split them off (but if they are too intertwined and would result in a throwaway work, then we can keep this as-is).

Comment threadbazel/cargo/wasmtime/Cargo.toml Outdated
Comment threadbazel/repositories.bzl Outdated
Comment threadbazel/external/wasmtime.BUILD Outdated
Comment threadbazel/cargo/wasmtime/Cargo.Bazel.lock Outdated

@leonm1leonm1 left a comment

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why? Looking at the changes, the benefits don't seem very obvious.

Two things:

  1. Updating wasmtime resulted in our rust_static_library in wasmtime.BUILD failing to build due to missing dependencies. With this current approach, the dependency tree is resolved by Cargo and we simply wrap it in rust_static_library. Updates which pull in new dependencies are trivial after this change and (in theory) will never require hunting down missing dependencies.
  2. For prefixing itself, using parts of the wasmtime_c_api (as opposed to the raw wasm_c_api in wasm.h / required for limits) involves a whole tree of c header files in the c-api crate. The approach we used previously, prefixing individual files via genrule, doesn't work with globs for all the required files (as bazel requires declaring all genrule outputs), so the toil and complexity of the old build would be increased significantly to support limits.

Always using prefixed variant seems fine (although, I think there was a reason why it wasn't the default - perhaps something with Envoy build?), but is that something that's at all relevant with the move to Wasmtime C++ API in #503?

Envoy build itself ran the multi runtime tests, so I don't think it required the non-prefixed version.

Using wasmtime-c-api-impl and always using prefixed variant are pretty separate changes, so might be good to split them off (but if they are too intertwined and would result in a throwaway work, then we can keep this as-is).

Ack. I'm considering this a "change how we build wasmtime" PR, which makes sense semantically. While they are separable, due to higher priority tasks on my todo list, I simply don't have a couple hours to spare to split this.

Comment threadbazel/cargo/wasmtime/Cargo.Bazel.lock Outdated
Comment threadbazel/external/wasmtime.BUILD Outdated
Comment threadbazel/repositories.bzl Outdated
Comment threadbazel/cargo/wasmtime/Cargo.toml Outdated
@PiotrSikora

Copy link
Copy Markdown
Member

Envoy build itself ran the multi runtime tests, so I don't think it required the non-prefixed version.

I don't believe that was ever the case, and I cannot find a code that would support that.

Do you have a link? If not, could you open a draft PR against Envoy (you'll need to do that anyway at some point) and verify that it builds fine with Wasmtime - it can be either this PR or off the last PR in the stacked series.

@leonm1

leonm1 commented Mar 12, 2026

Copy link
Copy Markdown
ContributorAuthor

could you open a draft PR against Envoy (you'll need to do that anyway at some point) and verify that it builds fine with Wasmtime

envoyproxy/envoy#43920, made some additional minor changes to fix the build.

@leonm1
leonm1 requested a review from PiotrSikoraMarch 12, 2026 03:12
@leonm1
leonm1 marked this pull request as ready for review March 12, 2026 03:12

@PiotrSikoraPiotrSikora left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM (assuming that all Envoy tests pass), but could you shorten the commit subject? Perhaps drop the "crates_universe-provided" part?

Also, after taking another look at it, I'd probably remove the prefixed version altogether, since I don't think anybody is shipping with multiple engines (but maybe I'm wrong?).

@leonm1leonm1 changed the title Refactor wasmtime build to use crates_universe-provided wasmtime-c-api-impl crateBuild wasmtime with wasmtime-c-api-impl crateMar 12, 2026
@PiotrSikora

Copy link
Copy Markdown
Member

Circling back on the prefixed variant and use of multiengine in real products - it looks that ATS supports multiple Wasm engines, but it builds them using standard tools, and not our Bazel build process, so it doesn't get the prefixed version anyway (and it has a warning about conflict between Wasmtime & WAMR due to the same exported symbols).

@leonm1

Copy link
Copy Markdown
ContributorAuthor

The commits still exist, so I am okay if we drop the prefixed variant in this PR and can discuss adding it back in conjunction with supporting it in Envoy.

@PiotrSikora

Copy link
Copy Markdown
Member

The commits still exist, so I am okay if we drop the prefixed variant in this PR and can discuss adding it back in conjunction with supporting it in Envoy.

The only value from prefixed variant (assuming nobody is using it in production) is that we could do:

bazelisk test --define engine=multiengine //test/...

and it would run tests across all the Wasm engines, instead of requiring per-engine invocation.

@leonm1

Copy link
Copy Markdown
ContributorAuthor

I currently use this regularly:

bazelisk test --define engine=multi //test/...

However, in the interest of getting the wasmtime update merged, I'm happy to drop the prefixed variant for now, and reintroduce it "properly" later.

@PiotrSikora

Copy link
Copy Markdown
Member

I currently use this regularly:

bazelisk test --define engine=multi //test/...

However, in the interest of getting the wasmtime update merged, I'm happy to drop the prefixed variant for now, and reintroduce it "properly" later.

Oh, no... it's not a blocker or a requirement (I already approved this PR) - I was just wondering if it provides any value, since there is clearly some minimal maintenance overhead.

@leonm1
leonm1force-pushed the build/wasmtime branch 2 times, most recently from fc45c81 to 3433effCompareMarch 12, 2026 19:46
leonm1 added a commit to leonm1/proxy-wasm-cpp-host that referenced this pull request Mar 12, 2026
Required for proxy-wasm#501
Signed-off-by: Matt Leon <mattleon@google.com>
@leonm1leonm1 mentioned this pull request Mar 12, 2026
leonm1 added a commit to leonm1/proxy-wasm-cpp-host that referenced this pull request Mar 12, 2026
Required for proxy-wasm#501
Signed-off-by: Matt Leon <mattleon@google.com>
leonm1 added a commit that referenced this pull request Mar 12, 2026
Required for #501
Signed-off-by: Matt Leon <mattleon@google.com>
Always uses prefixed wasmtime-c-api-impl, otherwise the prefixed
implementation bitrots. Prefixes the headers in the repo rule to allow
for globbing, which is not possible in a genrule.
The crates_vendor-provided wasmtime-c-api-impl provided build allows us
to upgrade wasmtime solely by changing the version number in the
Cargo.toml file (and the corresponding repo in bazel/repositories.bzl
for the C headers).
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
Signed-off-by: Matt Leon <mattleon@google.com>
proxy-wasm#523 demonstrated that source rewriting via patch_args is expensive.
Signed-off-by: Matt Leon <mattleon@google.com>
@leonm1
leonm1 enabled auto-merge (squash) March 12, 2026 22:04
@leonm1
leonm1 merged commit 0c955e8 into proxy-wasm:mainMar 12, 2026
30 checks passed
leonm1 added a commit that referenced this pull request Mar 13, 2026
Built off of #501.
---------
Signed-off-by: Matt Leon <mattleon@google.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@leonm1@PiotrSikora