Skip to content

Commit 019091a

Browse files
audreytclaude
andcommitted
Add wasm64-unknown-unknown target support
- Parameterize target triple in cargo_build_wasm() and cargo_build_wasm_tests() - Extract --target from extra_options in build and test commands - Add --enable-memory64 to wasm-opt args for wasm64 targets - Construct CARGO_TARGET_*_RUNNER env var dynamically from target triple - Pass target triple through to cargo_test_wasm() Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 74c8aab commit 019091a

File tree

5 files changed

+94
-30
lines changed

5 files changed

+94
-30
lines changed

src/build/mod.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ pub fn cargo_build_wasm(
7979
path: &Path,
8080
profile: BuildProfile,
8181
extra_options: &[String],
82+
target_triple: &str,
8283
) -> Result<String> {
8384
let msg = format!("{}Compiling to Wasm...", emoji::CYCLONE);
8485
PBAR.info(&msg);
@@ -111,9 +112,7 @@ pub fn cargo_build_wasm(
111112
}
112113
}
113114

114-
// If user has specified a custom --target in Cargo options, we shouldn't override it.
115-
// Otherwise, default to wasm32-unknown-unknown.
116-
cmd.env("CARGO_BUILD_TARGET", "wasm32-unknown-unknown");
115+
cmd.env("CARGO_BUILD_TARGET", target_triple);
117116

118117
// The `cargo` command is executed inside the directory at `path`, so relative paths set via extra options won't work.
119118
// To remedy the situation, all detected paths are converted to absolute paths.
@@ -192,7 +191,12 @@ pub fn cargo_build_wasm(
192191
/// * `path`: Path to the crate directory to build tests.
193192
/// * `debug`: Whether to build tests in `debug` mode.
194193
/// * `extra_options`: Additional parameters to pass to `cargo` when building tests.
195-
pub fn cargo_build_wasm_tests(path: &Path, debug: bool, extra_options: &[String]) -> Result<()> {
194+
pub fn cargo_build_wasm_tests(
195+
path: &Path,
196+
debug: bool,
197+
extra_options: &[String],
198+
target_triple: &str,
199+
) -> Result<()> {
196200
let mut cmd = Command::new("cargo");
197201

198202
cmd.current_dir(path).arg("build").arg("--tests");
@@ -205,7 +209,7 @@ pub fn cargo_build_wasm_tests(path: &Path, debug: bool, extra_options: &[String]
205209
cmd.arg("--release");
206210
}
207211

208-
cmd.env("CARGO_BUILD_TARGET", "wasm32-unknown-unknown");
212+
cmd.env("CARGO_BUILD_TARGET", target_triple);
209213

210214
cmd.args(extra_options);
211215

src/command/build.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -387,8 +387,12 @@ impl Build {
387387

388388
fn step_build_wasm(&mut self) -> Result<()> {
389389
info!("Building wasm...");
390-
let wasm_path =
391-
build::cargo_build_wasm(&self.crate_path, self.profile.clone(), &self.extra_options)?;
390+
let wasm_path = build::cargo_build_wasm(
391+
&self.crate_path,
392+
self.profile.clone(),
393+
&self.extra_options,
394+
&self.target_triple,
395+
)?;
392396
info!("wasm built at {wasm_path:#?}.");
393397
self.wasm_path = Some(wasm_path);
394398
Ok(())
@@ -475,6 +479,9 @@ impl Build {
475479
if self.reference_types {
476480
args.push("--enable-reference-types".into());
477481
}
482+
if self.target_triple.starts_with("wasm64") {
483+
args.push("--enable-memory64".into());
484+
}
478485
info!("executing wasm-opt with {:?}", args);
479486
wasm_opt::run(
480487
&self.cache,

src/command/test.rs

Lines changed: 73 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ pub struct Test {
9999
release: bool,
100100
test_runner_path: Option<PathBuf>,
101101
extra_options: Vec<String>,
102+
target_triple: String,
102103
}
103104

104105
type TestStep = fn(&mut Test) -> Result<()>;
@@ -138,6 +139,17 @@ impl Test {
138139
let crate_data = manifest::CrateData::new(&crate_path, None)?;
139140
let any_browser = chrome || firefox || safari;
140141

142+
let target_triple = {
143+
let mut iter = extra_options.iter();
144+
if iter.by_ref().any(|option| option == "--target") {
145+
iter.next().map(|s| s.as_str())
146+
} else {
147+
None
148+
}
149+
.unwrap_or("wasm32-unknown-unknown")
150+
.to_owned()
151+
};
152+
141153
if !node && !any_browser {
142154
bail!("Must specify at least one of `--node`, `--chrome`, `--firefox`, or `--safari`")
143155
}
@@ -164,6 +176,7 @@ impl Test {
164176
headless,
165177
release,
166178
test_runner_path: None,
179+
target_triple,
167180
extra_options,
168181
})
169182
}
@@ -251,7 +264,7 @@ impl Test {
251264

252265
fn step_check_for_wasm_target(&mut self) -> Result<()> {
253266
info!("Adding wasm-target...");
254-
build::wasm_target::check_for_wasm_target("wasm32-unknown-unknown")?;
267+
build::wasm_target::check_for_wasm_target(&self.target_triple)?;
255268
info!("Adding wasm-target was successful.");
256269
Ok(())
257270
}
@@ -267,7 +280,12 @@ impl Test {
267280
} else {
268281
&self.extra_options
269282
};
270-
build::cargo_build_wasm_tests(&self.crate_path, !self.release, extra_options)?;
283+
build::cargo_build_wasm_tests(
284+
&self.crate_path,
285+
!self.release,
286+
extra_options,
287+
&self.target_triple,
288+
)?;
271289

272290
info!("Finished compiling tests to wasm.");
273291
Ok(())
@@ -311,17 +329,26 @@ impl Test {
311329
fn step_test_node(&mut self) -> Result<()> {
312330
assert!(self.node);
313331
info!("Running tests in node...");
332+
let runner_env = format!(
333+
"CARGO_TARGET_{}_RUNNER",
334+
self.target_triple.replace('-', "_").to_uppercase()
335+
);
336+
let runner_path = self
337+
.test_runner_path
338+
.as_ref()
339+
.unwrap()
340+
.to_str()
341+
.unwrap()
342+
.to_string();
314343
test::cargo_test_wasm(
315344
&self.crate_path,
316345
self.release,
317346
vec![
318-
(
319-
"CARGO_TARGET_WASM32_UNKNOWN_UNKNOWN_RUNNER",
320-
&**self.test_runner_path.as_ref().unwrap(),
321-
),
322-
("WASM_BINDGEN_TEST_ONLY_NODE", "1".as_ref()),
347+
(runner_env, runner_path),
348+
("WASM_BINDGEN_TEST_ONLY_NODE".to_string(), "1".to_string()),
323349
],
324350
&self.extra_options,
351+
&self.target_triple,
325352
)?;
326353
info!("Finished running tests in node.");
327354
Ok(())
@@ -339,16 +366,21 @@ impl Test {
339366

340367
fn step_test_chrome(&mut self) -> Result<()> {
341368
let chromedriver = self.chromedriver.as_ref().unwrap().display().to_string();
342-
let chromedriver = chromedriver.as_str();
343369
info!(
344370
"Running tests in Chrome with chromedriver at {}",
345371
chromedriver
346372
);
347373

348374
let mut envs = self.webdriver_env();
349-
envs.push(("CHROMEDRIVER", chromedriver));
375+
envs.push(("CHROMEDRIVER".to_string(), chromedriver));
350376

351-
test::cargo_test_wasm(&self.crate_path, self.release, envs, &self.extra_options)?;
377+
test::cargo_test_wasm(
378+
&self.crate_path,
379+
self.release,
380+
envs,
381+
&self.extra_options,
382+
&self.target_triple,
383+
)?;
352384
Ok(())
353385
}
354386

@@ -364,16 +396,21 @@ impl Test {
364396

365397
fn step_test_firefox(&mut self) -> Result<()> {
366398
let geckodriver = self.geckodriver.as_ref().unwrap().display().to_string();
367-
let geckodriver = geckodriver.as_str();
368399
info!(
369400
"Running tests in Firefox with geckodriver at {}",
370401
geckodriver
371402
);
372403

373404
let mut envs = self.webdriver_env();
374-
envs.push(("GECKODRIVER", geckodriver));
405+
envs.push(("GECKODRIVER".to_string(), geckodriver));
375406

376-
test::cargo_test_wasm(&self.crate_path, self.release, envs, &self.extra_options)?;
407+
test::cargo_test_wasm(
408+
&self.crate_path,
409+
self.release,
410+
envs,
411+
&self.extra_options,
412+
&self.target_triple,
413+
)?;
377414
Ok(())
378415
}
379416

@@ -386,28 +423,43 @@ impl Test {
386423

387424
fn step_test_safari(&mut self) -> Result<()> {
388425
let safaridriver = self.safaridriver.as_ref().unwrap().display().to_string();
389-
let safaridriver = safaridriver.as_str();
390426
info!(
391427
"Running tests in Safari with safaridriver at {}",
392428
safaridriver
393429
);
394430

395431
let mut envs = self.webdriver_env();
396-
envs.push(("SAFARIDRIVER", safaridriver));
432+
envs.push(("SAFARIDRIVER".to_string(), safaridriver));
397433

398-
test::cargo_test_wasm(&self.crate_path, self.release, envs, &self.extra_options)?;
434+
test::cargo_test_wasm(
435+
&self.crate_path,
436+
self.release,
437+
envs,
438+
&self.extra_options,
439+
&self.target_triple,
440+
)?;
399441
Ok(())
400442
}
401443

402-
fn webdriver_env(&self) -> Vec<(&'static str, &str)> {
403-
let test_runner = self.test_runner_path.as_ref().unwrap().to_str().unwrap();
444+
fn webdriver_env(&self) -> Vec<(String, String)> {
445+
let test_runner = self
446+
.test_runner_path
447+
.as_ref()
448+
.unwrap()
449+
.to_str()
450+
.unwrap()
451+
.to_string();
404452
info!("Using wasm-bindgen test runner at {}", test_runner);
453+
let runner_env = format!(
454+
"CARGO_TARGET_{}_RUNNER",
455+
self.target_triple.replace('-', "_").to_uppercase()
456+
);
405457
let mut envs = vec![
406-
("CARGO_TARGET_WASM32_UNKNOWN_UNKNOWN_RUNNER", test_runner),
407-
("WASM_BINDGEN_TEST_ONLY_WEB", "1"),
458+
(runner_env, test_runner),
459+
("WASM_BINDGEN_TEST_ONLY_WEB".to_string(), "1".to_string()),
408460
];
409461
if !self.headless {
410-
envs.push(("NO_HEADLESS", "1"));
462+
envs.push(("NO_HEADLESS".to_string(), "1".to_string()));
411463
}
412464
envs
413465
}

src/manifest/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -557,7 +557,7 @@ impl CrateData {
557557
return Ok(());
558558
}
559559
bail!(
560-
"crate-type must be cdylib to compile to wasm32-unknown-unknown. Add the following to your \
560+
"crate-type must be cdylib to compile to WebAssembly. Add the following to your \
561561
Cargo.toml file:\n\n\
562562
[lib]\n\
563563
crate-type = [\"cdylib\", \"rlib\"]"

src/test/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ pub fn cargo_test_wasm<I, K, V>(
1616
release: bool,
1717
envs: I,
1818
extra_options: &[String],
19+
target_triple: &str,
1920
) -> Result<()>
2021
where
2122
I: IntoIterator<Item = (K, V)>,
@@ -35,7 +36,7 @@ where
3536
cmd.arg("--release");
3637
}
3738

38-
cmd.arg("--target").arg("wasm32-unknown-unknown");
39+
cmd.arg("--target").arg(target_triple);
3940

4041
cmd.args(extra_options);
4142

0 commit comments

Comments
 (0)