Skip to content

Commit a9e0e6d

Browse files
authored
Merge pull request #63 from eugenehp/visionos
feat: Added visionOS support for Apple Vision Pro
2 parents f64a451 + 744d954 commit a9e0e6d

File tree

3 files changed

+59
-12
lines changed

3 files changed

+59
-12
lines changed

example/build.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ fn main() {
44
// Ensure this matches the versions set in your `Package.swift` file.
55
SwiftLinker::new("10.15")
66
.with_ios("11")
7+
.with_visionos("1")
78
.with_package("swift-lib", "./swift-lib/")
89
.link();
910
}

src-rs/build.rs

Lines changed: 57 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,17 @@ struct SwiftEnv {
2929
}
3030

3131
impl SwiftEnv {
32-
fn new(minimum_macos_version: &str, minimum_ios_version: Option<&str>) -> Self {
32+
fn new(
33+
minimum_macos_version: &str,
34+
minimum_ios_version: Option<&str>,
35+
minimum_visionos_version: Option<&str>,
36+
) -> Self {
3337
let rust_target = RustTarget::from_env();
34-
let target = rust_target.swift_target_triple(minimum_macos_version, minimum_ios_version);
38+
let target = rust_target.swift_target_triple(
39+
minimum_macos_version,
40+
minimum_ios_version,
41+
minimum_visionos_version,
42+
);
3543

3644
let swift_target_info_str = Command::new("swift")
3745
.args(["-target", &target, "-print-target-info"])
@@ -47,13 +55,15 @@ impl SwiftEnv {
4755
enum RustTargetOS {
4856
MacOS,
4957
IOS,
58+
VisionOS,
5059
}
5160

5261
impl RustTargetOS {
5362
fn from_env() -> Self {
5463
match env::var("CARGO_CFG_TARGET_OS").unwrap().as_str() {
5564
"macos" => RustTargetOS::MacOS,
5665
"ios" => RustTargetOS::IOS,
66+
"visionos" => RustTargetOS::VisionOS,
5767
_ => panic!("unexpected target operating system"),
5868
}
5969
}
@@ -62,6 +72,7 @@ impl RustTargetOS {
6272
match self {
6373
Self::MacOS => "macosx",
6474
Self::IOS => "ios",
75+
Self::VisionOS => "xros",
6576
}
6677
}
6778
}
@@ -71,6 +82,7 @@ impl Display for RustTargetOS {
7182
match self {
7283
Self::MacOS => write!(f, "macos"),
7384
Self::IOS => write!(f, "ios"),
85+
Self::VisionOS => write!(f, "visionos"),
7486
}
7587
}
7688
}
@@ -80,18 +92,23 @@ enum SwiftSDK {
8092
MacOS,
8193
IOS,
8294
IOSSimulator,
95+
VisionOS,
96+
VisionOSSimulator,
8397
}
8498

8599
impl SwiftSDK {
86100
fn from_os(os: &RustTargetOS) -> Self {
87101
let target = env::var("TARGET").unwrap();
88102
let simulator = target.ends_with("ios-sim")
103+
|| target.ends_with("visionos-sim")
89104
|| (target.starts_with("x86_64") && target.ends_with("ios"));
90105

91106
match os {
92107
RustTargetOS::MacOS => Self::MacOS,
93108
RustTargetOS::IOS if simulator => Self::IOSSimulator,
94109
RustTargetOS::IOS => Self::IOS,
110+
RustTargetOS::VisionOS if simulator => Self::VisionOSSimulator,
111+
RustTargetOS::VisionOS => Self::VisionOS,
95112
}
96113
}
97114

@@ -100,6 +117,8 @@ impl SwiftSDK {
100117
Self::MacOS => "osx",
101118
Self::IOS => "ios",
102119
Self::IOSSimulator => "iossim",
120+
Self::VisionOS => "xros",
121+
Self::VisionOSSimulator => "xrsimulator",
103122
}
104123
}
105124
}
@@ -110,6 +129,8 @@ impl Display for SwiftSDK {
110129
Self::MacOS => write!(f, "macosx"),
111130
Self::IOSSimulator => write!(f, "iphonesimulator"),
112131
Self::IOS => write!(f, "iphoneos"),
132+
Self::VisionOSSimulator => write!(f, "xrsimulator"),
133+
Self::VisionOS => write!(f, "xros"),
113134
}
114135
}
115136
}
@@ -133,19 +154,23 @@ impl RustTarget {
133154
&self,
134155
minimum_macos_version: &str,
135156
minimum_ios_version: Option<&str>,
157+
minimum_visionos_version: Option<&str>,
136158
) -> String {
137159
let unversioned = self.unversioned_swift_target_triple();
138160
format!(
139161
"{unversioned}{}{}",
140-
match (&self.os, minimum_ios_version) {
141-
(RustTargetOS::MacOS, _) => minimum_macos_version,
142-
(RustTargetOS::IOS, Some(version)) => version,
143-
_ => "",
162+
match &self.os {
163+
RustTargetOS::MacOS => minimum_macos_version,
164+
RustTargetOS::IOS => minimum_ios_version.unwrap(),
165+
RustTargetOS::VisionOS => minimum_visionos_version.unwrap(),
144166
},
145167
// simulator suffix
146-
matches!(self.sdk, SwiftSDK::IOSSimulator)
147-
.then(|| "-simulator".to_string())
148-
.unwrap_or_default()
168+
matches!(
169+
self.sdk,
170+
SwiftSDK::IOSSimulator | SwiftSDK::VisionOSSimulator
171+
)
172+
.then(|| "-simulator".to_string())
173+
.unwrap_or_default()
149174
)
150175
}
151176

@@ -172,6 +197,7 @@ pub struct SwiftLinker {
172197
packages: Vec<SwiftPackage>,
173198
macos_min_version: String,
174199
ios_min_version: Option<String>,
200+
visionos_min_version: Option<String>,
175201
}
176202

177203
impl SwiftLinker {
@@ -183,6 +209,7 @@ impl SwiftLinker {
183209
packages: vec![],
184210
macos_min_version: macos_min_version.to_string(),
185211
ios_min_version: None,
212+
visionos_min_version: None,
186213
}
187214
}
188215

@@ -195,6 +222,15 @@ impl SwiftLinker {
195222
self
196223
}
197224

225+
/// Instructs the [`SwiftLinker`] to also compile for visionOS
226+
/// using the specified minimum visionOS version.
227+
///
228+
/// Minimum visionOS version must be at least 11.
229+
pub fn with_visionos(mut self, min_version: &str) -> Self {
230+
self.visionos_min_version = Some(min_version.to_string());
231+
self
232+
}
233+
198234
/// Adds a package to be linked against.
199235
/// `name` should match the `name` field in your `Package.swift`,
200236
/// and `path` should point to the root of your Swift package relative
@@ -212,7 +248,11 @@ impl SwiftLinker {
212248
/// This does not (yet) automatically rebuild your Swift files when they are modified,
213249
/// you'll need to modify/save your `build.rs` file for that.
214250
pub fn link(self) {
215-
let swift_env = SwiftEnv::new(&self.macos_min_version, self.ios_min_version.as_deref());
251+
let swift_env = SwiftEnv::new(
252+
&self.macos_min_version,
253+
self.ios_min_version.as_deref(),
254+
self.visionos_min_version.as_deref(),
255+
);
216256

217257
#[allow(clippy::uninlined_format_args)]
218258
for path in swift_env.paths.runtime_library_paths {
@@ -253,8 +293,11 @@ impl SwiftLinker {
253293
arch => arch,
254294
};
255295

256-
let swift_target_triple = rust_target
257-
.swift_target_triple(&self.macos_min_version, self.ios_min_version.as_deref());
296+
let swift_target_triple = rust_target.swift_target_triple(
297+
&self.macos_min_version,
298+
self.ios_min_version.as_deref(),
299+
self.visionos_min_version.as_deref(),
300+
);
258301

259302
command
260303
// Build the package (duh)
@@ -277,6 +320,8 @@ impl SwiftLinker {
277320
.args(["-Xcc", &format!("--target={swift_target_triple}")])
278321
.args(["-Xcxx", &format!("--target={swift_target_triple}")]);
279322

323+
println!("Command `{command:?}`");
324+
280325
if !command.status().unwrap().success() {
281326
panic!("Failed to compile swift package {}", package.name);
282327
}

src-rs/test-build.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ fn main() {
1414

1515
SwiftLinker::new("10.15")
1616
.with_ios("11")
17+
.with_visionos("1")
1718
.with_package("test-swift", "tests/swift-pkg")
1819
.link();
1920
}

0 commit comments

Comments
 (0)