From 2bf692d07b4d8b9101d43e4c53efc89b78379cf7 Mon Sep 17 00:00:00 2001 From: Bernd Schoolmann Date: Mon, 6 Oct 2025 09:32:00 +0200 Subject: [PATCH] Use swift in desktop native --- apps/desktop/desktop_native/Cargo.lock | 28 ++++++++++++++--- apps/desktop/desktop_native/core/Cargo.toml | 5 +++ apps/desktop/desktop_native/core/build.rs | 14 +++++++++ .../core/src/MacTest/Package.resolved | 14 +++++++++ .../core/src/MacTest/Package.swift | 31 +++++++++++++++++++ .../src/MacTest/Sources/MacTest/MacTest.swift | 6 ++++ apps/desktop/desktop_native/core/src/lib.rs | 11 +++++++ 7 files changed, 104 insertions(+), 5 deletions(-) create mode 100644 apps/desktop/desktop_native/core/build.rs create mode 100644 apps/desktop/desktop_native/core/src/MacTest/Package.resolved create mode 100644 apps/desktop/desktop_native/core/src/MacTest/Package.swift create mode 100644 apps/desktop/desktop_native/core/src/MacTest/Sources/MacTest/MacTest.swift diff --git a/apps/desktop/desktop_native/Cargo.lock b/apps/desktop/desktop_native/Cargo.lock index 55f474f2992..efc3401eeb7 100644 --- a/apps/desktop/desktop_native/Cargo.lock +++ b/apps/desktop/desktop_native/Cargo.lock @@ -368,6 +368,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + [[package]] name = "base64" version = "0.22.1" @@ -445,7 +451,7 @@ dependencies = [ "aes-gcm", "anyhow", "async-trait", - "base64", + "base64 0.22.1", "cbc", "hex", "homedir", @@ -889,7 +895,7 @@ dependencies = [ "anyhow", "arboard", "ashpd", - "base64", + "base64 0.22.1", "bitwarden-russh", "byteorder", "bytes", @@ -916,6 +922,7 @@ dependencies = [ "sha2", "ssh-encoding", "ssh-key", + "swift-rs", "sysinfo", "thiserror 2.0.12", "tokio", @@ -937,7 +944,7 @@ version = "0.0.0" dependencies = [ "anyhow", "autotype", - "base64", + "base64 0.22.1", "bitwarden_chromium_importer", "desktop_core", "hex", @@ -2897,9 +2904,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b369d18893388b345804dc0007963c99b7d665ae71d275812d828c6f089640" +checksum = "cc198e42d9b7510827939c9a15f5062a0c913f3371d765977e586d2fe6c16f4a" dependencies = [ "bitflags", "core-foundation", @@ -3162,6 +3169,17 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "swift-rs" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", +] + [[package]] name = "syn" version = "2.0.101" diff --git a/apps/desktop/desktop_native/core/Cargo.toml b/apps/desktop/desktop_native/core/Cargo.toml index 36e1a85abc0..c362e42570b 100644 --- a/apps/desktop/desktop_native/core/Cargo.toml +++ b/apps/desktop/desktop_native/core/Cargo.toml @@ -46,6 +46,7 @@ ssh-key = { workspace = true, features = [ "rsa", "getrandom", ] } +swift-rs = { version = "1.0.7", features = ["build"] } sysinfo = { workspace = true, features = ["windows"] } thiserror = { workspace = true } tokio = { workspace = true, features = ["io-util", "sync", "macros", "net"] } @@ -88,5 +89,9 @@ ashpd = { workspace = true } zbus = { workspace = true, optional = true } zbus_polkit = { workspace = true, optional = true } + +[build-dependencies] +swift-rs = { version = "1.0.5", features = ["build"] } + [lints] workspace = true diff --git a/apps/desktop/desktop_native/core/build.rs b/apps/desktop/desktop_native/core/build.rs new file mode 100644 index 00000000000..5ab06092836 --- /dev/null +++ b/apps/desktop/desktop_native/core/build.rs @@ -0,0 +1,14 @@ +use swift_rs::SwiftLinker; + +const PACKAGE_NAME: &str = "MacTest"; +const PACKAGE_PATH: &str = "./src/MacTest"; + +fn build() { + SwiftLinker::new("10.13") + .with_package(PACKAGE_NAME, PACKAGE_PATH) + .link(); +} + +fn main() { + build(); +} diff --git a/apps/desktop/desktop_native/core/src/MacTest/Package.resolved b/apps/desktop/desktop_native/core/src/MacTest/Package.resolved new file mode 100644 index 00000000000..e32718c299a --- /dev/null +++ b/apps/desktop/desktop_native/core/src/MacTest/Package.resolved @@ -0,0 +1,14 @@ +{ + "pins" : [ + { + "identity" : "swift-rs", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Brendonovich/swift-rs", + "state" : { + "revision" : "f64a4514de07f450ec5b6aa297624cd3479d9579", + "version" : "1.0.7" + } + } + ], + "version" : 2 +} diff --git a/apps/desktop/desktop_native/core/src/MacTest/Package.swift b/apps/desktop/desktop_native/core/src/MacTest/Package.swift new file mode 100644 index 00000000000..11541a472cf --- /dev/null +++ b/apps/desktop/desktop_native/core/src/MacTest/Package.swift @@ -0,0 +1,31 @@ + +// swift-tools-version: 5.8 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "MacTest", + platforms: [ + .macOS(.v12) + ], + products: [ + .library( + name: "MacTest", + type: .static, + targets: ["MacTest"]), + ], + dependencies: [ + .package(url: "https://github.com/Brendonovich/swift-rs", from: "1.0.5") + ], + targets: [ + .target( + name: "MacTest", + dependencies: [ + .product( + name: "SwiftRs", + package: "swift-rs" + ), + ]), + ] +) \ No newline at end of file diff --git a/apps/desktop/desktop_native/core/src/MacTest/Sources/MacTest/MacTest.swift b/apps/desktop/desktop_native/core/src/MacTest/Sources/MacTest/MacTest.swift new file mode 100644 index 00000000000..0ea1b069b38 --- /dev/null +++ b/apps/desktop/desktop_native/core/src/MacTest/Sources/MacTest/MacTest.swift @@ -0,0 +1,6 @@ +// hello world from swift + +@_cdecl("hello_world") +public func hello_world() { + print("Hello, world!") +} \ No newline at end of file diff --git a/apps/desktop/desktop_native/core/src/lib.rs b/apps/desktop/desktop_native/core/src/lib.rs index a72ec04e9c2..6f3ea36eccb 100644 --- a/apps/desktop/desktop_native/core/src/lib.rs +++ b/apps/desktop/desktop_native/core/src/lib.rs @@ -14,3 +14,14 @@ use zeroizing_alloc::ZeroAlloc; #[global_allocator] static ALLOC: ZeroAlloc = ZeroAlloc(std::alloc::System); + +#[cfg(test)] +mod tests { + use swift_rs::swift; + + #[test] + fn swift() { + swift!(fn hello_world()); + unsafe { hello_world() } + } +}