From 7ee119fa854c877a0ec53d9df458997a2843dcbd Mon Sep 17 00:00:00 2001 From: Dave Verwer Date: Tue, 27 May 2025 17:24:14 +0100 Subject: [PATCH 1/3] First draft of Wasm and Android compatibility blog post. --- ...-wasm-and-android-compatibility-testing.md | 24 +++++++++++++++++++ Resources/Blog/posts.yml | 5 ++++ 2 files changed, 29 insertions(+) create mode 100644 Resources/Blog/Posts/adding-wasm-and-android-compatibility-testing.md diff --git a/Resources/Blog/Posts/adding-wasm-and-android-compatibility-testing.md b/Resources/Blog/Posts/adding-wasm-and-android-compatibility-testing.md new file mode 100644 index 000000000..9868ba27e --- /dev/null +++ b/Resources/Blog/Posts/adding-wasm-and-android-compatibility-testing.md @@ -0,0 +1,24 @@ +We’re delighted to announce that we have added support for two new Swift platforms, Android and [Wasm](https://webassembly.org/), to our compatibility testing matrix. + + + + The Swift Package Index compatibility matrix showing columns for the Android and Wasm platforms. + + +Swift support for Wasm has been in development for [a long time](https://desiatov.com/swift-webassembly-2020/). Remarkably, [as of Swift 6.1](https://blog.swiftwasm.org/posts/6-1-released/) it requires no custom patches: + +> This is the first stable release we've built directly from the official swiftlang/swift source without any custom patches. This means all components (compiler, stdlib, Foundation, XCTest, swift-testing, etc.) have been fully upstreamed. + +There has also been plenty of community effort put into supporting Swift for Android. This includes the recent announcement of a [community working group](https://forums.swift.org/t/swift-on-android-working-group/77780) focused on the problem and the fact that [swift-everywhere.org](http://swift-everywhere.org) has been [tracking Android compatibility](https://skip.tools/blog/android-native-swift-packages/) for several months. + +The community has put a remarkable amount of effort into getting these platforms to this stage, and it seemed like a great time to add them to our compatibility testing system. So we did! + +As of today, all builds for both new platforms have finished and you can see compatibility on every package page. + +### Results + +After churning through X,XXX compatibility builds across both platforms for the past X days, we have some numbers to share! Of the ~9,000 currently indexed packages, **XX% build for Android** and **XX% build for Wasm**. + +TODO: Add commentary on the results. + +Is Windows compatibility testing next? We think so! diff --git a/Resources/Blog/posts.yml b/Resources/Blog/posts.yml index 3f7a36034..e60f0ee0f 100644 --- a/Resources/Blog/posts.yml +++ b/Resources/Blog/posts.yml @@ -198,3 +198,8 @@ summary: We've added support for custom package collections to allow well-known community efforts to present package collections. published_at: 2024-12-09 published: true +- slug: adding-wasm-and-android-compatibility-testing + title: Adding Wasm and Android compatibility testing + summary: You can now check the compatibility of every package in the Swift Package Index with Wasm and Android. + published_at: 2025-05-30 + published: true From 5ebf0bb441ec8f142867cbefa381c0eda3463582 Mon Sep 17 00:00:00 2001 From: Dave Verwer Date: Mon, 2 Jun 2025 18:33:27 +0100 Subject: [PATCH 2/3] Final draft of Wasm and Android blog post. --- ...-and-android-compatibility-matrix~dark.png | Bin 0 -> 26360 bytes ...and-android-compatibility-matrix~light.png | Bin 0 -> 26078 bytes ...-wasm-and-android-compatibility-testing.md | 18 +++++++----------- Resources/Blog/posts.yml | 2 +- 4 files changed, 8 insertions(+), 12 deletions(-) create mode 100644 Public/images/blog/wasm-and-android-compatibility-matrix~dark.png create mode 100644 Public/images/blog/wasm-and-android-compatibility-matrix~light.png diff --git a/Public/images/blog/wasm-and-android-compatibility-matrix~dark.png b/Public/images/blog/wasm-and-android-compatibility-matrix~dark.png new file mode 100644 index 0000000000000000000000000000000000000000..7c4c4f53406452407950851b76a1c5aa636a9f6a GIT binary patch literal 26360 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%0Dhwp?8UKpb*d$6 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 D<_CC1 literal 0 HcmV?d00001 diff --git a/Resources/Blog/Posts/adding-wasm-and-android-compatibility-testing.md b/Resources/Blog/Posts/adding-wasm-and-android-compatibility-testing.md index 9868ba27e..2dba0b4be 100644 --- a/Resources/Blog/Posts/adding-wasm-and-android-compatibility-testing.md +++ b/Resources/Blog/Posts/adding-wasm-and-android-compatibility-testing.md @@ -1,24 +1,20 @@ -We’re delighted to announce that we have added support for two new Swift platforms, Android and [Wasm](https://webassembly.org/), to our compatibility testing matrix. +We’re delighted to announce support for compatibility testing of packages on two new Swift platforms, Android and [Wasm](https://webassembly.org/). This brings the number of platforms we test every package with to 8! The Swift Package Index compatibility matrix showing columns for the Android and Wasm platforms. -Swift support for Wasm has been in development for [a long time](https://desiatov.com/swift-webassembly-2020/). Remarkably, [as of Swift 6.1](https://blog.swiftwasm.org/posts/6-1-released/) it requires no custom patches: +Swift support for Wasm has been in development for [a long time](https://desiatov.com/swift-webassembly-2020/), and [as of Swift 6.1](https://blog.swiftwasm.org/posts/6-1-released/), it now requires no custom patches: -> This is the first stable release we've built directly from the official swiftlang/swift source without any custom patches. This means all components (compiler, stdlib, Foundation, XCTest, swift-testing, etc.) have been fully upstreamed. +> This is the first stable release we’ve built directly from the official swiftlang/swift source without any custom patches. This means all components (compiler, stdlib, Foundation, XCTest, swift-testing, etc.) have been fully upstreamed. -There has also been plenty of community effort put into supporting Swift for Android. This includes the recent announcement of a [community working group](https://forums.swift.org/t/swift-on-android-working-group/77780) focused on the problem and the fact that [swift-everywhere.org](http://swift-everywhere.org) has been [tracking Android compatibility](https://skip.tools/blog/android-native-swift-packages/) for several months. +Swift on Android is also receiving plenty of community effort, including a recent announcement of a [community working group](https://forums.swift.org/t/swift-on-android-working-group/77780). The [swift-everywhere.org](http://swift-everywhere.org) site has also been [tracking Android compatibility](https://skip.tools/blog/android-native-swift-packages/) for several months. -The community has put a remarkable amount of effort into getting these platforms to this stage, and it seemed like a great time to add them to our compatibility testing system. So we did! - -As of today, all builds for both new platforms have finished and you can see compatibility on every package page. +Plenty of work went into making Swift work on these platforms, and it seemed like a great time to add them to our compatibility testing. So we did! For the past week, the Swift Package Index build system has processed 35,000 builds to test compatibility. As of today, all builds are complete, and you can see Wasm and Android compatibility on every package page. ### Results -After churning through X,XXX compatibility builds across both platforms for the past X days, we have some numbers to share! Of the ~9,000 currently indexed packages, **XX% build for Android** and **XX% build for Wasm**. - -TODO: Add commentary on the results. +Of ~9,000 indexed packages, **18.3% build for Wasm** and **27.2% build for Android**. We find that remarkable, given that reliance on Apple-specific frameworks automatically makes many packages incompatible. -Is Windows compatibility testing next? We think so! +It’s safe to say that Swift is expanding beyond its Apple-focused roots. Windows and Linux have been officially supported for years, and Wasm and Android are starting to make their way down that path. It’s great to see. diff --git a/Resources/Blog/posts.yml b/Resources/Blog/posts.yml index e60f0ee0f..eb9b3f632 100644 --- a/Resources/Blog/posts.yml +++ b/Resources/Blog/posts.yml @@ -201,5 +201,5 @@ - slug: adding-wasm-and-android-compatibility-testing title: Adding Wasm and Android compatibility testing summary: You can now check the compatibility of every package in the Swift Package Index with Wasm and Android. - published_at: 2025-05-30 + published_at: 2025-06-02 published: true From 7e9f617401086652e88d962c8cbee12477d18d3c Mon Sep 17 00:00:00 2001 From: Dave Verwer Date: Mon, 2 Jun 2025 18:52:20 +0100 Subject: [PATCH 3/3] Corrected percentages. --- .../Blog/Posts/adding-wasm-and-android-compatibility-testing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Blog/Posts/adding-wasm-and-android-compatibility-testing.md b/Resources/Blog/Posts/adding-wasm-and-android-compatibility-testing.md index 2dba0b4be..5a08c4fea 100644 --- a/Resources/Blog/Posts/adding-wasm-and-android-compatibility-testing.md +++ b/Resources/Blog/Posts/adding-wasm-and-android-compatibility-testing.md @@ -15,6 +15,6 @@ Plenty of work went into making Swift work on these platforms, and it seemed lik ### Results -Of ~9,000 indexed packages, **18.3% build for Wasm** and **27.2% build for Android**. We find that remarkable, given that reliance on Apple-specific frameworks automatically makes many packages incompatible. +Of ~9,000 indexed packages, **18.9% build for Wasm** and **27.9% build for Android**. We find that remarkable, given that reliance on Apple-specific frameworks automatically makes many packages incompatible. It’s safe to say that Swift is expanding beyond its Apple-focused roots. Windows and Linux have been officially supported for years, and Wasm and Android are starting to make their way down that path. It’s great to see.