Skip to content

Commit 0bf31fb

Browse files
Copilotkraenhansen
andcommitted
Update Ferric to handle tier 3 targets with build-std instructions
Co-authored-by: kraenhansen <1243959+kraenhansen@users.noreply.github.com>
1 parent 034ea6b commit 0bf31fb

File tree

1 file changed

+49
-6
lines changed

1 file changed

+49
-6
lines changed

packages/ferric/src/targets.ts

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,25 +49,68 @@ export type AppleTargetName = (typeof APPLE_TARGETS)[number];
4949
export const ALL_TARGETS = [...ANDROID_TARGETS, ...APPLE_TARGETS] as const;
5050
export type TargetName = (typeof ALL_TARGETS)[number];
5151

52+
/**
53+
* Tier 3 Rust targets that are not available via `rustup target add`
54+
* and require building the standard library from source using `-Zbuild-std`.
55+
*
56+
* @see https://doc.rust-lang.org/rustc/platform-support.html
57+
* @see https://doc.rust-lang.org/cargo/reference/unstable.html#build-std
58+
*/
59+
export const TIER_3_TARGETS: readonly TargetName[] = [
60+
"aarch64-apple-visionos",
61+
"aarch64-apple-visionos-sim",
62+
] as const;
63+
64+
/**
65+
* Check if a target is a tier 3 target that requires build-std
66+
*/
67+
export function isTier3Target(target: TargetName): boolean {
68+
return TIER_3_TARGETS.includes(target);
69+
}
70+
5271
/**
5372
* Ensure the targets are installed into the Rust toolchain
5473
* We do this up-front because the error message and fix is very unclear from the failure when missing.
5574
*/
5675
export function ensureInstalledTargets(expectedTargets: Set<TargetName>) {
5776
const installedTargets = getInstalledTargets();
58-
const missingTargets = new Set([
59-
...[...expectedTargets].filter((target) => !installedTargets.has(target)),
77+
const missingStandardTargets = new Set([
78+
...[...expectedTargets].filter(
79+
(target) => !installedTargets.has(target) && !isTier3Target(target),
80+
),
6081
]);
61-
if (missingTargets.size > 0) {
62-
// TODO: Ask the user if they want to run this
82+
const tier3Targets = new Set([
83+
...[...expectedTargets].filter((target) => isTier3Target(target)),
84+
]);
85+
86+
// Handle standard targets that can be installed via rustup
87+
if (missingStandardTargets.size > 0) {
6388
throw new UsageError(
6489
`You're missing ${
65-
missingTargets.size
90+
missingStandardTargets.size
6691
} targets - to fix this, run:\n\n${chalk.italic(
67-
`rustup target add ${[...missingTargets].join(" ")}`,
92+
`rustup target add ${[...missingStandardTargets].join(" ")}`,
6893
)}`,
6994
);
7095
}
96+
97+
// Handle tier 3 targets that require build-std setup
98+
if (tier3Targets.size > 0) {
99+
throw new UsageError(
100+
`You're using tier 3 targets (${[...tier3Targets].join(", ")}) that require building the standard library from source.\n\n` +
101+
`To set up support for these targets:\n\n` +
102+
`1. Install nightly Rust with the rust-src component:\n` +
103+
` ${chalk.italic("rustup toolchain install nightly --component rust-src")}\n\n` +
104+
`2. Configure Cargo to use build-std by creating a .cargo/config.toml file:\n` +
105+
` ${chalk.italic("[unstable]")}\n` +
106+
` ${chalk.italic('build-std = ["std", "panic_abort"]')}\n\n` +
107+
`3. Set your default toolchain to nightly:\n` +
108+
` ${chalk.italic("rustup default nightly")}\n\n` +
109+
`For more information, see:\n` +
110+
`- Rust Platform Support: ${chalk.italic("https://doc.rust-lang.org/rustc/platform-support.html")}\n` +
111+
`- Cargo build-std: ${chalk.italic("https://doc.rust-lang.org/cargo/reference/unstable.html#build-std")}`,
112+
);
113+
}
71114
}
72115

73116
export function isAndroidTarget(

0 commit comments

Comments
 (0)