From c2cafc7350ea3773bb255e9138bb69c080cbefe9 Mon Sep 17 00:00:00 2001 From: Eugene Hauptmann Date: Wed, 29 May 2024 21:07:41 -0400 Subject: [PATCH 1/5] wip: visionos --- src-rs/build.rs | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/src-rs/build.rs b/src-rs/build.rs index 394b9eb..7f00032 100644 --- a/src-rs/build.rs +++ b/src-rs/build.rs @@ -29,9 +29,9 @@ struct SwiftEnv { } impl SwiftEnv { - fn new(minimum_macos_version: &str, minimum_ios_version: Option<&str>) -> Self { + fn new(minimum_macos_version: &str, minimum_ios_version: Option<&str>, minimum_visionos_version: Option<&str>) -> Self { let rust_target = RustTarget::from_env(); - let target = rust_target.swift_target_triple(minimum_macos_version, minimum_ios_version); + let target = rust_target.swift_target_triple(minimum_macos_version, minimum_ios_version, minimum_visionos_version); let swift_target_info_str = Command::new("swift") .args(["-target", &target, "-print-target-info"]) @@ -47,6 +47,7 @@ impl SwiftEnv { enum RustTargetOS { MacOS, IOS, + VisionOS, } impl RustTargetOS { @@ -54,6 +55,7 @@ impl RustTargetOS { match env::var("CARGO_CFG_TARGET_OS").unwrap().as_str() { "macos" => RustTargetOS::MacOS, "ios" => RustTargetOS::IOS, + "visionos" => RustTargetOS::VisionOS, _ => panic!("unexpected target operating system"), } } @@ -62,6 +64,7 @@ impl RustTargetOS { match self { Self::MacOS => "macosx", Self::IOS => "ios", + Self::VisionOS => "visionos", } } } @@ -71,6 +74,7 @@ impl Display for RustTargetOS { match self { Self::MacOS => write!(f, "macos"), Self::IOS => write!(f, "ios"), + Self::VisionOS => write!(f, "visionos"), } } } @@ -80,18 +84,22 @@ enum SwiftSDK { MacOS, IOS, IOSSimulator, + VisionOS, + VisionOSSimulator, } impl SwiftSDK { fn from_os(os: &RustTargetOS) -> Self { let target = env::var("TARGET").unwrap(); - let simulator = target.ends_with("ios-sim") + let simulator = target.ends_with("ios-sim") || target.ends_with("visionos-sim") || (target.starts_with("x86_64") && target.ends_with("ios")); match os { RustTargetOS::MacOS => Self::MacOS, RustTargetOS::IOS if simulator => Self::IOSSimulator, RustTargetOS::IOS => Self::IOS, + RustTargetOS::VisionOS if simulator => Self::VisionOSSimulator, + RustTargetOS::VisionOS => Self::VisionOS, } } @@ -100,6 +108,8 @@ impl SwiftSDK { Self::MacOS => "osx", Self::IOS => "ios", Self::IOSSimulator => "iossim", + Self::VisionOS => "visionos", + Self::VisionOSSimulator => "visionossim", } } } @@ -110,6 +120,8 @@ impl Display for SwiftSDK { Self::MacOS => write!(f, "macosx"), Self::IOSSimulator => write!(f, "iphonesimulator"), Self::IOS => write!(f, "iphoneos"), + Self::VisionOSSimulator => write!(f, "visionsimulator"), + Self::VisionOS => write!(f, "visionos"), } } } @@ -133,6 +145,7 @@ impl RustTarget { &self, minimum_macos_version: &str, minimum_ios_version: Option<&str>, + minimum_visionos_version: Option<&str>, ) -> String { let unversioned = self.unversioned_swift_target_triple(); format!( @@ -140,10 +153,11 @@ impl RustTarget { match (&self.os, minimum_ios_version) { (RustTargetOS::MacOS, _) => minimum_macos_version, (RustTargetOS::IOS, Some(version)) => version, + (RustTargetOS::VisionOS, Some(version)) => version, _ => "", }, // simulator suffix - matches!(self.sdk, SwiftSDK::IOSSimulator) + matches!(self.sdk, SwiftSDK::IOSSimulator | SwiftSDK::VisionOSSimulator) .then(|| "-simulator".to_string()) .unwrap_or_default() ) @@ -172,6 +186,7 @@ pub struct SwiftLinker { packages: Vec, macos_min_version: String, ios_min_version: Option, + visionos_min_version: Option, } impl SwiftLinker { @@ -183,6 +198,7 @@ impl SwiftLinker { packages: vec![], macos_min_version: macos_min_version.to_string(), ios_min_version: None, + visionos_min_version: None, } } @@ -194,6 +210,15 @@ impl SwiftLinker { self.ios_min_version = Some(min_version.to_string()); self } + + /// Instructs the [`SwiftLinker`] to also compile for visionOS + /// using the specified minimum visionOS version. + /// + /// Minimum visionOS version must be at least 11. + pub fn with_visionOS(mut self, min_version: &str) -> Self { + self.visionos_min_version = Some(min_version.to_string()); + self + } /// Adds a package to be linked against. /// `name` should match the `name` field in your `Package.swift`, @@ -212,7 +237,7 @@ impl SwiftLinker { /// This does not (yet) automatically rebuild your Swift files when they are modified, /// you'll need to modify/save your `build.rs` file for that. pub fn link(self) { - let swift_env = SwiftEnv::new(&self.macos_min_version, self.ios_min_version.as_deref()); + let swift_env = SwiftEnv::new(&self.macos_min_version, self.ios_min_version.as_deref(), self.visionos_min_version.as_deref()); #[allow(clippy::uninlined_format_args)] for path in swift_env.paths.runtime_library_paths { @@ -275,6 +300,7 @@ impl SwiftLinker { &rust_target.swift_target_triple( &self.macos_min_version, self.ios_min_version.as_deref(), + self.visionos_min_version.as_deref(), ), ]); From 9cf000292783b42d95847fa147085487950b21b3 Mon Sep 17 00:00:00 2001 From: Eugene Hauptmann Date: Wed, 29 May 2024 21:18:03 -0400 Subject: [PATCH 2/5] wip: visionos --- example/build.rs | 1 + src-rs/build.rs | 4 +++- src-rs/test-build.rs | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/example/build.rs b/example/build.rs index 913b415..16a7372 100644 --- a/example/build.rs +++ b/example/build.rs @@ -4,6 +4,7 @@ fn main() { // Ensure this matches the versions set in your `Package.swift` file. SwiftLinker::new("10.15") .with_ios("11") + .with_visionos("1") .with_package("swift-lib", "./swift-lib/") .link(); } diff --git a/src-rs/build.rs b/src-rs/build.rs index 7f00032..31a52eb 100644 --- a/src-rs/build.rs +++ b/src-rs/build.rs @@ -33,6 +33,8 @@ impl SwiftEnv { let rust_target = RustTarget::from_env(); let target = rust_target.swift_target_triple(minimum_macos_version, minimum_ios_version, minimum_visionos_version); + println!("============SwiftEnv {target:?}"); + let swift_target_info_str = Command::new("swift") .args(["-target", &target, "-print-target-info"]) .output() @@ -215,7 +217,7 @@ impl SwiftLinker { /// using the specified minimum visionOS version. /// /// Minimum visionOS version must be at least 11. - pub fn with_visionOS(mut self, min_version: &str) -> Self { + pub fn with_visionos(mut self, min_version: &str) -> Self { self.visionos_min_version = Some(min_version.to_string()); self } diff --git a/src-rs/test-build.rs b/src-rs/test-build.rs index da43c63..b8ca6c2 100644 --- a/src-rs/test-build.rs +++ b/src-rs/test-build.rs @@ -14,6 +14,7 @@ fn main() { SwiftLinker::new("10.15") .with_ios("11") + .with_visionos("1") .with_package("test-swift", "tests/swift-pkg") .link(); } From e440535a2a7355b4f813d98dbed2f82eee51ae1b Mon Sep 17 00:00:00 2001 From: Eugene Hauptmann Date: Wed, 29 May 2024 21:28:03 -0400 Subject: [PATCH 3/5] xros for llvm and clang --- src-rs/build.rs | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src-rs/build.rs b/src-rs/build.rs index 31a52eb..253ac56 100644 --- a/src-rs/build.rs +++ b/src-rs/build.rs @@ -33,8 +33,6 @@ impl SwiftEnv { let rust_target = RustTarget::from_env(); let target = rust_target.swift_target_triple(minimum_macos_version, minimum_ios_version, minimum_visionos_version); - println!("============SwiftEnv {target:?}"); - let swift_target_info_str = Command::new("swift") .args(["-target", &target, "-print-target-info"]) .output() @@ -66,7 +64,7 @@ impl RustTargetOS { match self { Self::MacOS => "macosx", Self::IOS => "ios", - Self::VisionOS => "visionos", + Self::VisionOS => "xros", } } } @@ -152,11 +150,10 @@ impl RustTarget { let unversioned = self.unversioned_swift_target_triple(); format!( "{unversioned}{}{}", - match (&self.os, minimum_ios_version) { - (RustTargetOS::MacOS, _) => minimum_macos_version, - (RustTargetOS::IOS, Some(version)) => version, - (RustTargetOS::VisionOS, Some(version)) => version, - _ => "", + match &self.os { + RustTargetOS::MacOS => minimum_macos_version, + RustTargetOS::IOS => minimum_ios_version.unwrap(), + RustTargetOS::VisionOS => minimum_visionos_version.unwrap(), }, // simulator suffix matches!(self.sdk, SwiftSDK::IOSSimulator | SwiftSDK::VisionOSSimulator) From 4875a3f81757ded1154f54970ec941eae3465393 Mon Sep 17 00:00:00 2001 From: Eugene Hauptmann Date: Wed, 29 May 2024 21:34:01 -0400 Subject: [PATCH 4/5] xros --- src-rs/build.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src-rs/build.rs b/src-rs/build.rs index 253ac56..1b8719a 100644 --- a/src-rs/build.rs +++ b/src-rs/build.rs @@ -120,8 +120,8 @@ impl Display for SwiftSDK { Self::MacOS => write!(f, "macosx"), Self::IOSSimulator => write!(f, "iphonesimulator"), Self::IOS => write!(f, "iphoneos"), - Self::VisionOSSimulator => write!(f, "visionsimulator"), - Self::VisionOS => write!(f, "visionos"), + Self::VisionOSSimulator => write!(f, "xrsimulator"), + Self::VisionOS => write!(f, "xros"), } } } From 1d75e6810235eb06492572661b2d72cd195b3bd4 Mon Sep 17 00:00:00 2001 From: Eugene Hauptmann Date: Wed, 29 May 2024 22:07:52 -0400 Subject: [PATCH 5/5] updated build --- src-rs/build.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src-rs/build.rs b/src-rs/build.rs index 1b8719a..b2b8240 100644 --- a/src-rs/build.rs +++ b/src-rs/build.rs @@ -108,8 +108,8 @@ impl SwiftSDK { Self::MacOS => "osx", Self::IOS => "ios", Self::IOSSimulator => "iossim", - Self::VisionOS => "visionos", - Self::VisionOSSimulator => "visionossim", + Self::VisionOS => "xros", + Self::VisionOSSimulator => "xrsimulator", } } } @@ -303,6 +303,8 @@ impl SwiftLinker { ), ]); + println!("Command `{command:?}`"); + if !command.status().unwrap().success() { panic!("Failed to compile swift package {}", package.name); }