Skip to content

Conversation

@finagolfin
Copy link
Member

Explanation: Add a linker flag for the upcoming 16 KB page support in Android, generate an Android CMake toolchain file that can be used to cross-compile repos like cmark and Testing, and add a build flag that makes it easy to build cross-compilation toolchains, by disabling the cross-compilation of all host tools and macros for listed --cross-compile-hosts, leaving only the Swift runtime libraries in a cross-compilation SDK.

Scope: Build changes that either only affect Android or have to be explicitly enabled with a new build-script flag

Issue: #80788

Original PR: #81596, single supporting change from #81386, #83260, #83422, #83629

Risk: Very low, only affects Android plus runs two tests for more non-Android CI target platforms

Testing: Passed both trunk and release/6.2 CI and we're using these patches in preliminary builds of an official Android CI job, which uses these changes to pass the full 6.2 compiler validation suite and produce an Android SDK bundle

Reviewer: @tbkka

The Swift core team tasked the Swift on Android workgroup with putting together an official 6.2 Android CI job, so @marcprux and I have been piecing together a pull for that, swiftlang/swift-docker#467, and these are some of the last trunk patches we had to backport to 6.2.

@shahmishal, let us know what you think.

marcprux and others added 5 commits September 3, 2025 03:18
Android 15+ requires that native libraries be compiled with a linker
flag to support 16 KB page sizes. See:
https://developer.android.com/guide/practices/page-sizes#compile-r26-lower
…` from fcc0389,

specifically the change that makes the following possible on linux:

    "* under Linux, do not cross compile LLVM when building for the host
     architecture -- that will ensure that the compiler-rt build will use
    the just built compiler and not the system one (which may not be
    new enough for this purpose);"
This new flag makes it easy to build Swift cross-compilation toolchains, by
disabling cross-compilation of all host tools, like the Swift compiler and
various macros, building on prior pulls swiftlang#38441 and swiftlang#82163.

Also, add two class methods to the Testing macros product so it works with swiftlang#83260.
I missed that `build-script` passes back `false` instead, so use the `true_false`
function for broader checking.
@finagolfin finagolfin requested a review from a team as a code owner September 2, 2025 21:57
@finagolfin
Copy link
Member Author

@swift-ci test

@finagolfin finagolfin added the 🍒 release cherry pick Flag: Release branch cherry picks label Sep 2, 2025
marcprux added a commit to swift-android-sdk/swift-docker that referenced this pull request Sep 16, 2025
@finagolfin
Copy link
Member Author

6.2.0 was tagged, so closing.

@finagolfin finagolfin closed this Sep 16, 2025
@finagolfin finagolfin deleted the droid branch October 22, 2025 18:53
marcprux added a commit to swift-android-sdk/swift-docker that referenced this pull request Nov 1, 2025
* Add Android workflow

* Build Android image (#1)

* Build Android image

* Checkout without ssh

* Retry build if it fails

* Swift 6.1 Release Dockerfiles (swiftlang#456)

* Change binutils-gold package dependency on Debian 12 to binutils (swiftlang#457)

* Update installed packages after nightly platform expansion (swiftlang#458)

* update nightly-6.1 dependencies

* update nightly-main dependencies

* fix ubuntu images

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Fedora 41 Dockerfile (swiftlang#464)

* Build Android image

* Build Android image

* Swift 6.1 Release Dockerfiles (swiftlang#456)

* Change binutils-gold package dependency on Debian 12 to binutils (swiftlang#457)

* Build Android image

* Build Android image

* Build Android image

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Android SDK build

* Swift Androd build

* Swift Androd build

* Swift Androd build

* Swift Androd build

* Swift Androd build

* Swift Androd build

* Swift Androd build

* Swift Androd build

* Swift Androd build

* Swift Androd build

* Swift Androd build

* Swift Androd build

* Swift Androd build

* Swift Androd build

* Swift Androd build

* Swift Androd build

* Swift Androd build

* Swift Android build

* Swift Android build

* Swift Android build

* Swift Android build

---------

Co-authored-by: Mishal Shah <[email protected]>
Co-authored-by: Chris McGee <[email protected]>
Co-authored-by: Justice Adams <[email protected]>
Co-authored-by: Andrew Sukach <[email protected]>

* Swift Android build 6.2 (#2)

* Swift Android build 6.2

* Swift Android build 6.2

* Swift Android build 6.2

* Start splitting NDK out from the rest of the SDK

* Start splitting NDK out from the rest of the SDK

* Swift Android build 6.2

* Swift Android build 6.2

* Swift Android build 6.2

* Swift Android build 6.2

* Swift Android build 6.2

* Swift Android build 6.2

* Swift Android build 6.2

* Swift Android build 6.2

* Swift Android build 6.2

* Swift Android build 6.2

* Swift Android build 6.2

* Swift Android build 6.2

* Swift Android build 6.2

* Swift Android build 6.2

* Swift Android build 6.2

* Swift Android build 6.2 (#3)

* Swift Android build 6.2

* Swift Android build 6.2

* Add post-install script to SDK bundle

* Add post-install script to SDK bundle

* Add post-install script to SDK bundle

* Add post-install script to SDK bundle

* Build SDK in Docker container (#4)

* Add static libraries to post-install script

* Add post-install script to SDK bundle

* Add post-install script to SDK bundle

* Update submodules

* Checkout patches repo instead of using a git submodule

* Update libcurl to 8.13.0

* Remove resources that we no longer use

* Update libcurl to 8.13.0

* Update libxml2 to 2.14.2

* Build libxml2, libcurl, and boringssl with support for Android 16kb page sizes

* Add build-script --extra-cmake-options=-DCMAKE_EXTRA_LINK_FLAGS=-Wl,-z,max-page-size=16384

* Add 16KB page size linker flags to linker flags in swift-toolset.json

* Add 16KB page size linker flags to linker flags in swift-toolset.json

* Build with ndk-r28b

* Revert to building with ndk-r27c

* Use official endpoints for discovering latest Swift release/devel/trunk tags

* Typo fix in version script

* Cleanup for PR

* Change BUILD_VERSION to BUILD_SCHEME and have it match release, swift-*-branch, or development

* Update Android README

* Update how patches are applied

* Fix source directory for patch target

* Harmonize timestamps in artifactbundle with the swift source tag date for build reproducibility

* Simplify toolchain-vars.sh

* Run the compiler validation suite for Android (#8)

* Run the compiler validation suite for Android

* Add --build-compiler option

* Add --cross-compile-build-swift-tools=0 from swiftlang/swift#38441

* Build with --build-llvm=0

* Check out Yams for Swift 6.1.1 build

* Add --llvm-ninja-targets-for-cross-compile-hosts=help

* Install pre-requisites

* Install build prerequisites

* Only setup local toolchain if build-compiler is not 0

* Fix Yams version checkout

* Quote arguments to build scripts

* Permit empty host-toolchain argument in build.sh

* Fix check for BUILD_COMPILER

* Re-order Docker PATH to system clang is used before Swift toolchain clang

* Use --host-test to skip attempt to test on connected device/emulator

* Install clang in Dockerfile

* Add --skip-test-linux flag to build

* Remove more folders to free up space

* Update patches

* Add docker-specific CI variants that run the compiler validation tests

* meaningless edit

* Update pull_request.yml to stop the 6.1 release builds

* Update pull_request.yml to really only build the full docker compiler with tests

* Update README.md with meaningless edit to bump build

* Update build.sh to skip testing XCTest for linux, as a handful of the linux tests fail for some reason

* Update build.sh to disable building libTesting and for 16K memory pages, as both don't work yet

* Update build.sh to skip testing Foundation for linux, which requires building SwiftPM from source first

* Update build.sh to not build each arch in a separate build directory

* Update Dockerfile to use clang 19 instead

* Add self-hosted runner CI variant

* Fix CI workflow syntax

* Update CI runner config

* Update CI runner config

* Fix name of self-hosted CI runner

* Re-order arch run sequence

* Update CI for self-hosted runner

* Build for self-hosted runner

* Add swift-6.2-branch to self-hosted run matrix

* Update build.sh to disable aarch64 temporarily, as we know it built fine

* Update pull_request.yml to disable non-compiler builds, as they all work, and comment out self-hosted till we know armv7 works

* Run compiler validation on self-hosted with increased timeout

* Update build-docker to only build for armv7

* Update pull_request.yml to disable self-hosted builds temporarily

* Update pull_request.yml to build the full compiler in github runners with the armv7 stdlib and tests

* Update build-docker to build for aarch64 first

* Update toolchain-vars.sh to use older trunk snapahot toolchain that didn't crash

* Update toolchain-vars.sh to only download the latest release compiler if building the Swift compiler from source

* Update build-docker to only build for armv7 again

* Update toolchain-vars.sh to fix setting branch variable

* Update build-docker to build for all three supported arches

* Update pull_request.yml to try self-hosted runs again

* Update build.sh to only install SDK components and remove linux stdlib

* Tolerate missing linux folder when attempting to clean up unnecessary build artifacts

* Fix extraCLIOptions in swift-toolset.json

* gcpdw

* Fix patch application

* Update apply-patches.sh to remove unused changes

* Update swift-android-testing-except-release.patch to add Testing fix

* Update swift-android.patch to remove unneeded patches

* Update build.sh to try and fix Testing and clean up the bundle more

* Fix README.md

---------

Co-authored-by: finagolfin <[email protected]>

* Build compiler-validated bundles from latest branch commits, not older tags

Also update patches, particularly to disable failing tests from the compiler validation suite

* gcpd 'Update patches'

* Update patches and build matrix

* Disable compiler validated builds on self-hosted

* Centralize cmake variable for 6.2 in patches, as done for trunk upstream

* Update disabled tests

* Try running Docker build on macOS host

* Remove separate checks of libxml2, curl, and yams

* Remove upstreamed 6.2 branch patches

* Use command-line flags to work around CMake 3.30+ linker flag bug, rather than patching files

* Create an Android CMake toolchain file instead to cross-compile Testing and add
16 KB page linker flag to 6.2 branch

* Install the native host LLVM tools for full compiler builds

* Extend `--cross-compile-build-swift-tools=False` to disable building and installing LLVM
and the Testing macros for cross-compiled hosts, then enable building and using the
Testing macros for the native host.

* Don't copy any libraries from the NDK: link the NDK's clang resource directory in the post-install script instead

* Wildcard the clang version link in the post-install script in order to accomodate NDK 27 and 28

* Switch generated shell header to use #!/usr/bin/env bash

* SBOM and nits (#14)

* Address nits

* Eliminate unnecessaryt pushds and use run cmake install instead of ninja

* Generate SBOM with SDK dependencies

* Add example of command for building locally

* Remove upstreamed patches and turn the last modifications into perl substitutions instead.

* Remove self-hosted build on github CI

* Remove android_build job from pull_request workflow

* Add license headers to Android build scripts

* Remove unnecessary .gitignore

* Add license header to Dockerfile

* Switch over to using explicit tags and branches when invoking build-docker/local

Also, force the full Swift compiler to be built from source when building from a
branch, since there are no existing toolchain builds of arbitrary commits that
we can download.

* Fix build script arguments to use false instead of False due to true_false not handling the capitalized form

* Build swift-6.2-RELEASE

* Apply patch from swiftlang/swift#84061 for 6.2.0 Android SDK release

* Update patch application for 6.2

* Change 6.2 to perform local build

* Change 6.2 to perform local build on ubuntu-24.04

* Switch back to building 6.2 from a tag

* Switch back to building 6.2 from a tag

* Switch back to building 6.2 from a tag

* Build the Swift 6.2 release self-hosted with compiler validation

* Set minimum Android API to 24

* Build against swift-DEVELOPMENT-SNAPSHOT-2025-10-16-

* Disable building libxml2 tests to handle missing glob function in Android 24

* Disable building libxml2 tests to handle missing glob function in Android 24

* Build this PR without compiler validation

* Build this PR without compiler validation

* Disable posix_spawnattr_ for Android 24

* Reduce Android API from 24 to 23

* Restore Android minimum API to 24

* Add swift-nio to tests cases being run

* Reduce Android API from 24 to 23

* Try building swift-collections

* Try testing against emulator API level 23

* Fix backtrace call

* Fail with an error for posix_spawn

* Fix error for posix_spawn

* Remove temporary swift-docker Android build workflow

---------

Co-authored-by: Mishal Shah <[email protected]>
Co-authored-by: Chris McGee <[email protected]>
Co-authored-by: Justice Adams <[email protected]>
Co-authored-by: Andrew Sukach <[email protected]>
Co-authored-by: finagolfin <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🍒 release cherry pick Flag: Release branch cherry picks

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants