From 2aee293380116070a2bdd417a819bc099dbe6b75 Mon Sep 17 00:00:00 2001 From: Finagolfin Date: Fri, 24 May 2024 21:40:00 +0530 Subject: [PATCH] Test new Android overlay on the CI --- .github/workflows/sdks.yml | 62 +- android-overlay/foundation-fixes.patch | 481 +++++++++++ android-overlay/import-android.patch | 434 ++++++++++ android-overlay/modulemap.patch | 900 ++++++++++++++++++++ android-overlay/overlay.patch | 701 +++++++++++++++ android-overlay/swift-argument-parser.patch | 31 + android-overlay/swift-system.patch | 66 ++ android-overlay/yams.patch | 15 + 8 files changed, 2672 insertions(+), 18 deletions(-) create mode 100644 android-overlay/foundation-fixes.patch create mode 100644 android-overlay/import-android.patch create mode 100644 android-overlay/modulemap.patch create mode 100644 android-overlay/overlay.patch create mode 100644 android-overlay/swift-argument-parser.patch create mode 100644 android-overlay/swift-system.patch create mode 100644 android-overlay/yams.patch diff --git a/.github/workflows/sdks.yml b/.github/workflows/sdks.yml index 0e8cb474..5d74ca85 100644 --- a/.github/workflows/sdks.yml +++ b/.github/workflows/sdks.yml @@ -94,7 +94,7 @@ jobs: with: path: sdk-config - name: Build Swift ${{ matrix.version }} Android SDK if not the latest - if: ${{ steps.cache-sdk.outputs.cache-hit != 'true' }} + if: ${{ steps.cache-sdk.outputs.cache-hit != 'true' || (matrix.version == 'trunk' && matrix.ndk == '26d') }} env: SWIFT_TAG: ${{ steps.version.outputs.tag }} ANDROID_ARCH: ${{ matrix.arch }} @@ -107,6 +107,7 @@ jobs: SDK=`pwd`/$SDK_NAME tar xf ~/$SWIFT_TAG-ubuntu22.04.tar.gz + ./$SWIFT_TAG-ubuntu22.04/usr/bin/swift --version git apply swift-android-ci.patch git apply -C1 swift-android.patch swift-android-both-ndks.patch if [ ${{ matrix.version }} = 'release' ]; then @@ -124,6 +125,13 @@ jobs: git apply -C0 swift-android-foundation-ndk26.patch if [ ${{ matrix.version }} = 'release' ]; then git apply swift-android-stdlib-ndk26.patch + elif [ ${{ matrix.version }} = 'trunk' ]; then + git apply android-overlay/modulemap.patch android-overlay/overlay.patch android-overlay/foundation-fixes.patch android-overlay/import-android.patch android-overlay/swift-argument-parser.patch android-overlay/yams.patch + wget -q https://download.swift.org/tmp/pull-request/73127/813/ubuntu2004/PR-ubuntu2004.tar.gz + tar xf PR-ubuntu2004.tar.gz + rm -rf $SWIFT_TAG-ubuntu22.04/usr/ + mv usr/ $SWIFT_TAG-ubuntu22.04/ + rm ~/swift-${{ matrix.version }}-android-${{ matrix.arch }}*-sdk.tar.xz fi else NDK=$ANDROID_NDK @@ -161,6 +169,12 @@ jobs: if [ ! -d ${{ steps.version.outputs.tag }}-ubuntu22.04 ]; then tar xf ~/${{ steps.version.outputs.tag }}-ubuntu22.04.tar.gz fi + if [[ ${{ matrix.version }} = 'trunk' && ${{ matrix.ndk }} = '26d' ]]; then + sed -i "s%canImport(Glibc%canImport(Android%" ${{ steps.version.outputs.tag }}-ubuntu22.04/usr/bin/swift-package + sed -i "s%import Glibc%import Android%" ${{ steps.version.outputs.tag }}-ubuntu22.04/usr/bin/swift-package + sed -i "s%TSCBasic, would be nice%TSCBasic, would be %" ${{ steps.version.outputs.tag }}-ubuntu22.04/usr/bin/swift-package + fi + ./${{ steps.version.outputs.tag }}-ubuntu22.04/usr/bin/swift --version tar xf ~/swift-${{ matrix.version }}-android-${{ matrix.arch }}*-sdk.tar.xz - name: Get Swift Argument Parser package @@ -170,6 +184,9 @@ jobs: path: swift-argument-parser - name: Build Swift Argument Parser package run: | + if [[ ${{ matrix.version }} = 'trunk' && ${{ matrix.ndk }} = '26d' ]]; then + git apply sdk-config/android-overlay/swift-argument-parser.patch + fi cd swift-argument-parser ../sdk-config/${{ steps.version.outputs.tag }}-ubuntu22.04/usr/bin/swift build --build-tests --destination ../sdk-config/swift-${{ matrix.version }}-*-sdk/usr/swiftpm-android-${{ matrix.arch }}.json -Xlinker -rpath -Xlinker \$ORIGIN/lib/swift/android - name: Get Swift crypto package @@ -191,6 +208,7 @@ jobs: repository: apple/swift-nio path: swift-nio - name: Build Swift NIO package + if: ${{ matrix.version != 'trunk' || matrix.ndk != '26d' }} run: | cd swift-nio git apply ../sdk-config/swift-nio-disable-ecn-tests.patch ../sdk-config/swift-nio-filesystem-both-ndks.patch @@ -215,6 +233,9 @@ jobs: - name: Build Swift System package run: | cd swift-system + if [[ ${{ matrix.version }} = 'trunk' && ${{ matrix.ndk }} = '26d' ]]; then + git apply ../sdk-config/android-overlay/swift-system.patch + fi ../sdk-config/${{ steps.version.outputs.tag }}-ubuntu22.04/usr/bin/swift build --build-tests --destination ../sdk-config/swift-${{ matrix.version }}-*-sdk/usr/swiftpm-android-${{ matrix.arch }}.json -Xlinker -rpath -Xlinker \$ORIGIN/lib/swift/android - name: Get Swift Collections package uses: actions/checkout@v4 @@ -237,6 +258,7 @@ jobs: repository: apple/swift-nio-ssh path: sns - name: Build Swift NIO SSH package + if: ${{ matrix.version != 'trunk' || matrix.ndk != '26d' }} run: | cd sns sed -i "s%url: .*swift-\(\w\+\)\.git.*$%path: \"../swift-\1\"),%g" Package.swift @@ -247,6 +269,7 @@ jobs: repository: apple/swift-nio-ssl path: snl - name: Build Swift NIO SSL package + if: ${{ matrix.version != 'trunk' || matrix.ndk != '26d' }} run: | cd snl if [ ${{ matrix.ndk }} = '25c' ]; then @@ -260,6 +283,9 @@ jobs: path: yams - name: Build Yams package run: | + if [[ ${{ matrix.version }} = 'trunk' && ${{ matrix.ndk }} = '26d' ]]; then + git apply sdk-config/android-overlay/yams.patch + fi cd yams sed -i "s% fixturesDirectory + \"/SourceKitten#289% \"/data/local/tmp/pack%" Tests/YamsTests/PerformanceTests.swift ../sdk-config/${{ steps.version.outputs.tag }}-ubuntu22.04/usr/bin/swift build --build-tests --destination ../sdk-config/swift-${{ matrix.version }}-*-sdk/usr/swiftpm-android-${{ matrix.arch }}.json -Xlinker -rpath -Xlinker \$ORIGIN/lib/swift/android @@ -269,7 +295,7 @@ jobs: repository: apple/swift-nio-http2 path: snh - name: Build Swift NIO HTTP/2 package - if: ${{ matrix.arch != 'armv7' }} + if: ${{ matrix.arch != 'armv7' && (matrix.version != 'trunk' || matrix.ndk != '26d') }} run: | cd snh sed -i "s%url: .*swift-\(\w\+\)\.git.*$%path: \"../swift-\1\"),%g" Package.swift @@ -307,21 +333,21 @@ jobs: ./elf-cleaner pack/{generate-manual,math,repeat,roll} || true cp swift-crypto/.build/$TARGET/debug/swift-cryptoPackageTests.xctest pack - cp swift-nio/.build/$TARGET/debug/swift-nioPackageTests.xctest pack + # cp swift-nio/.build/$TARGET/debug/swift-nioPackageTests.xctest pack cp swift-numerics/.build/$TARGET/debug/swift-numericsPackageTests.xctest pack cp swift-system/.build/$TARGET/debug/swift-systemPackageTests.xctest pack cp swift-collections/.build/$TARGET/debug/swift-collectionsPackageTests.xctest pack - cp sns/.build/$TARGET/debug/swift-nio-sshPackageTests.xctest pack - cp snl/.build/$TARGET/debug/swift-nio-sslPackageTests.xctest pack + # cp sns/.build/$TARGET/debug/swift-nio-sshPackageTests.xctest pack + # cp snl/.build/$TARGET/debug/swift-nio-sslPackageTests.xctest pack cp yams/.build/$TARGET/debug/YamsPackageTests.xctest pack - cp snh/.build/$TARGET/debug/swift-nio-http2PackageTests.xctest pack + # cp snh/.build/$TARGET/debug/swift-nio-http2PackageTests.xctest pack cp sa/.build/$TARGET/debug/swift-algorithmsPackageTests.xctest pack mkdir pack/crypto-vectors pack/swift-crypto_CryptoTests.resources cp swift-crypto/Tests/Test\ Vectors/* swift-crypto/Tests/_CryptoExtrasVectors/* pack/crypto-vectors cp swift-crypto/Tests/CryptoTests/HPKE/hpke-test-vectors.json pack/swift-crypto_CryptoTests.resources - rm swift-nio/Tests/NIOFileSystemIntegrationTests/Test\ Data/*symlink - cp -r swift-nio/Tests/NIOFileSystemIntegrationTests/Test\ Data/ swift-nio/Tests/NIOFileSystemIntegrationTests/FileHandleTests.swift pack + # rm swift-nio/Tests/NIOFileSystemIntegrationTests/Test\ Data/*symlink + # cp -r swift-nio/Tests/NIOFileSystemIntegrationTests/Test\ Data/ swift-nio/Tests/NIOFileSystemIntegrationTests/FileHandleTests.swift pack cp yams/Tests/YamsTests/Fixtures/SourceKitten#289/debug.yaml pack cp sdk-config/swift-${{ matrix.version }}*-android-x86_64-*${ANDROID_API_LEVEL}-sdk/usr/lib/lib*so pack/lib cp sdk-config/swift-${{ matrix.version }}*-android-x86_64-*${ANDROID_API_LEVEL}-sdk/usr/lib/swift/android/lib*so pack/lib/swift/android @@ -342,18 +368,18 @@ jobs: adb shell /data/local/tmp/pack/swift-argument-parserPackageTests.xctest adb shell /data/local/tmp/pack/swift-cryptoPackageTests.xctest - adb shell "run-as com.termux mkdir /data/data/com.termux/pack" - adb shell "run-as com.termux cp /data/local/tmp/pack/{swift-nioPackageTests.xctest,FileHandleTests.swift} /data/data/com.termux/pack" - adb shell "run-as com.termux cp -r /data/local/tmp/pack/lib /data/data/com.termux/pack" - adb shell "run-as com.termux cp -r /data/local/tmp/pack/Test\ Data /data/data/com.termux/pack" - adb shell "run-as com.termux ln -s README.md /data/data/com.termux/pack/Test\ Data/README.md.symlink" - adb shell "run-as com.termux ln -s Foo /data/data/com.termux/pack/Test\ Data/Foo.symlink" - adb shell "run-as com.termux sh -c 'TMPDIR=/data/data/com.termux /data/data/com.termux/pack/swift-nioPackageTests.xctest'" + # adb shell "run-as com.termux mkdir /data/data/com.termux/pack" + # adb shell "run-as com.termux cp /data/local/tmp/pack/{swift-nioPackageTests.xctest,FileHandleTests.swift} /data/data/com.termux/pack" + # adb shell "run-as com.termux cp -r /data/local/tmp/pack/lib /data/data/com.termux/pack" + # adb shell "run-as com.termux cp -r /data/local/tmp/pack/Test\ Data /data/data/com.termux/pack" + # adb shell "run-as com.termux ln -s README.md /data/data/com.termux/pack/Test\ Data/README.md.symlink" + # adb shell "run-as com.termux ln -s Foo /data/data/com.termux/pack/Test\ Data/Foo.symlink" + # adb shell "run-as com.termux sh -c 'TMPDIR=/data/data/com.termux /data/data/com.termux/pack/swift-nioPackageTests.xctest'" adb shell /data/local/tmp/pack/swift-numericsPackageTests.xctest adb shell "TMPDIR=/data/local/tmp /data/local/tmp/pack/swift-systemPackageTests.xctest" adb shell /data/local/tmp/pack/swift-collectionsPackageTests.xctest - adb shell /data/local/tmp/pack/swift-nio-sshPackageTests.xctest - adb shell /data/local/tmp/pack/swift-nio-sslPackageTests.xctest - adb shell /data/local/tmp/pack/swift-nio-http2PackageTests.xctest + # adb shell /data/local/tmp/pack/swift-nio-sshPackageTests.xctest + # adb shell /data/local/tmp/pack/swift-nio-sslPackageTests.xctest + # adb shell /data/local/tmp/pack/swift-nio-http2PackageTests.xctest adb shell /data/local/tmp/pack/swift-algorithmsPackageTests.xctest adb shell /data/local/tmp/pack/YamsPackageTests.xctest diff --git a/android-overlay/foundation-fixes.patch b/android-overlay/foundation-fixes.patch new file mode 100644 index 00000000..c9944ab7 --- /dev/null +++ b/android-overlay/foundation-fixes.patch @@ -0,0 +1,481 @@ +diff --git a/swift-corelibs-foundation/CMakeLists.txt b/swift-corelibs-foundation/CMakeLists.txt +index 4dac9a46..a929bec0 100644 +--- a/swift-corelibs-foundation/CMakeLists.txt ++++ b/swift-corelibs-foundation/CMakeLists.txt +@@ -76,6 +76,14 @@ if(HAS_LIBDISPATCH_API) + find_package(Threads REQUIRED) + endif() + ++# CMake's Threads adds '-pthread' flag to the interface link ++# libraries, which isn't supported by Swift. This is not enabled ++# when building with MSVC, but it trips up the Android build, so ++# we need to clear out the threads INTERFACE_LINK_LIBRARIES. ++if (CMAKE_SYSTEM_NAME STREQUAL "Android") ++ set_property(TARGET Threads::Threads PROPERTY INTERFACE_LINK_LIBRARIES "") ++endif() ++ + set(SAVED_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS}) + set(BUILD_SHARED_LIBS NO) + add_subdirectory(CoreFoundation EXCLUDE_FROM_ALL) +diff --git a/swift-corelibs-foundation/Sources/Foundation/Data.swift b/swift-corelibs-foundation/Sources/Foundation/Data.swift +index 9e5c9faf..bcd762fc 100644 +--- a/swift-corelibs-foundation/Sources/Foundation/Data.swift ++++ b/swift-corelibs-foundation/Sources/Foundation/Data.swift +@@ -42,6 +42,13 @@ + @usableFromInline let memset = WASILibc.memset + @usableFromInline let memcpy = WASILibc.memcpy + @usableFromInline let memcmp = WASILibc.memcmp ++#elseif canImport(Android) ++@usableFromInline let calloc = Android.calloc ++@usableFromInline let malloc = Android.malloc ++@usableFromInline let free = Android.free ++@usableFromInline let memset = Android.memset ++@usableFromInline let memcpy = Android.memcpy ++@usableFromInline let memcmp = Android.memcmp + #endif + + #if !canImport(Darwin) +@@ -59,6 +66,8 @@ import Glibc + import Musl + #elseif canImport(WASILibc) + import WASILibc ++#elseif canImport(Android) ++import Android + #endif + + internal func __NSDataInvokeDeallocatorUnmap(_ mem: UnsafeMutableRawPointer, _ length: Int) { +diff --git a/swift-corelibs-foundation/Sources/Foundation/FileHandle.swift b/swift-corelibs-foundation/Sources/Foundation/FileHandle.swift +index 72ab09a3..e982edee 100644 +--- a/swift-corelibs-foundation/Sources/Foundation/FileHandle.swift ++++ b/swift-corelibs-foundation/Sources/Foundation/FileHandle.swift +@@ -34,6 +34,11 @@ import WASILibc + fileprivate let _read = WASILibc.read(_:_:_:) + fileprivate let _write = WASILibc.write(_:_:_:) + fileprivate let _close = WASILibc.close(_:) ++#elseif canImport(Android) ++import Android ++fileprivate let _read = Android.read(_:_:_:) ++fileprivate let _write = Android.write(_:_:_:) ++fileprivate let _close = Android.close(_:) + #endif + + #if canImport(WinSDK) +@@ -316,7 +321,7 @@ open class FileHandle : NSObject { + } + + let readBlockSize: Int +- if statbuf.st_mode & S_IFMT == S_IFREG { ++ if Int(statbuf.st_mode) & Int(S_IFMT) == Int(S_IFREG) { + // TODO: Should files over a certain size always be mmap()'d? + if options.contains(.alwaysMapped) { + // Filesizes are often 64bit even on 32bit systems +diff --git a/swift-corelibs-foundation/Sources/Foundation/FileManager+POSIX.swift b/swift-corelibs-foundation/Sources/Foundation/FileManager+POSIX.swift +index 73d81718..410dea09 100644 +--- a/swift-corelibs-foundation/Sources/Foundation/FileManager+POSIX.swift ++++ b/swift-corelibs-foundation/Sources/Foundation/FileManager+POSIX.swift +@@ -11,6 +11,10 @@ + internal func &(left: UInt32, right: mode_t) -> mode_t { + return mode_t(left) & right + } ++#elseif os(Android) ++internal func &(left: mode_t, right: Int32) -> mode_t { ++ return left & mode_t(right) ++} + #endif + + #if os(WASI) +@@ -409,7 +413,7 @@ extension FileManager { + if !parent.isEmpty && !fileExists(atPath: parent, isDirectory: &isDir) { + try createDirectory(atPath: parent, withIntermediateDirectories: true, attributes: attributes) + } +- if mkdir(pathFsRep, S_IRWXU | S_IRWXG | S_IRWXO) != 0 { ++ if mkdir(pathFsRep, mode_t(S_IRWXU) | mode_t(S_IRWXG) | mode_t(S_IRWXO)) != 0 { + let posixError = errno + if posixError == EEXIST && fileExists(atPath: path, isDirectory: &isDir) && isDir.boolValue { + // Continue; if there is an existing file and it is a directory, that is still a success. +@@ -428,7 +432,7 @@ extension FileManager { + throw _NSErrorWithErrno(EEXIST, reading: false, path: path) + } + } else { +- if mkdir(pathFsRep, S_IRWXU | S_IRWXG | S_IRWXO) != 0 { ++ if mkdir(pathFsRep, mode_t(S_IRWXU) | mode_t(S_IRWXG) | mode_t(S_IRWXO)) != 0 { + throw _NSErrorWithErrno(errno, reading: false, path: path) + } else if let attr = attributes { + try self.setAttributes(attr, ofItemAtPath: path) +@@ -646,7 +650,7 @@ extension FileManager { + + #if !os(WASI) // WASI doesn't have ownership concept + // Set the file permissions using fchmod() instead of when open()ing to avoid umask() issues +- let permissions = fileInfo.st_mode & ~S_IFMT ++ let permissions = fileInfo.st_mode & ~mode_t(S_IFMT) + guard fchmod(dstfd, permissions) == 0 else { + throw _NSErrorWithErrno(errno, reading: false, path: dstPath, + extraUserInfo: extraErrorInfo(srcPath: srcPath, dstPath: dstPath, userVariant: variant)) +@@ -873,10 +877,10 @@ extension FileManager { + do { + return try _fileSystemRepresentation(withPath: path, { fsRep in + var s = try _lstatFile(atPath: path, withFileSystemRepresentation: fsRep) +- if (s.st_mode & S_IFMT) == S_IFLNK { ++ if (s.st_mode & mode_t(S_IFMT)) == mode_t(S_IFLNK) { + // don't chase the link for this magic case -- we might be /Net/foo + // which is a symlink to /private/Net/foo which is not yet mounted... +- if isDirectory == nil && (s.st_mode & S_ISVTX) == S_ISVTX { ++ if isDirectory == nil && (s.st_mode & mode_t(S_ISVTX)) == mode_t(S_ISVTX) { + return true + } + // chase the link; too bad if it is a slink to /Net/foo +@@ -886,7 +890,7 @@ extension FileManager { + } + + if let isDirectory = isDirectory { +- isDirectory.pointee = ObjCBool((s.st_mode & S_IFMT) == S_IFDIR) ++ isDirectory.pointee = ObjCBool((s.st_mode & mode_t(S_IFMT)) == S_IFDIR) + } + + return true +@@ -950,7 +954,7 @@ extension FileManager { + let parentS = try _lstatFile(atPath: path, withFileSystemRepresentation: parentFsRep) + + // Check if the parent is 'sticky' if it exists. +- if (parentS.st_mode & S_ISVTX) == S_ISVTX { ++ if (parentS.st_mode & mode_t(S_ISVTX)) == S_ISVTX { + let s = try _lstatFile(atPath: path, withFileSystemRepresentation: fsRep) + + // If the current user owns the file, return true. +@@ -1064,7 +1068,7 @@ extension FileManager { + defer { fsRep1.deallocate() } + + let file1 = try _lstatFile(atPath: path1, withFileSystemRepresentation: fsRep1) +- let file1Type = file1.st_mode & S_IFMT ++ let file1Type = file1.st_mode & mode_t(S_IFMT) + + // Don't use access() for symlinks as only the contents should be checked even + // if the symlink doesnt point to an actual file, but access() will always try +@@ -1076,7 +1080,7 @@ extension FileManager { + let fsRep2 = try __fileSystemRepresentation(withPath: path2) + defer { fsRep2.deallocate() } + let file2 = try _lstatFile(atPath: path2, withFileSystemRepresentation: fsRep2) +- let file2Type = file2.st_mode & S_IFMT ++ let file2Type = file2.st_mode & mode_t(S_IFMT) + + // Are paths the same type: file, directory, symbolic link etc. + guard file1Type == file2Type else { +diff --git a/swift-corelibs-foundation/Sources/Foundation/FileManager.swift b/swift-corelibs-foundation/Sources/Foundation/FileManager.swift +index fdd84115..a49c2bf8 100644 +--- a/swift-corelibs-foundation/Sources/Foundation/FileManager.swift ++++ b/swift-corelibs-foundation/Sources/Foundation/FileManager.swift +@@ -25,6 +25,10 @@ import WinSDK + import WASILibc + #endif + ++#if os(Android) ++import Android ++#endif ++ + #if os(Windows) + internal typealias NativeFSRCharType = WCHAR + internal let NativeFSREncoding = String.Encoding.utf16LittleEndian.rawValue +@@ -882,6 +886,8 @@ open class FileManager : NSObject { + return Int(mode & ~UInt32(ucrt.S_IFMT)) + #elseif canImport(Darwin) + return Int(mode & ~UInt32(S_IFMT)) ++#elseif canImport(Android) ++ return Int(mode & ~mode_t(S_IFMT)) + #else + return Int(mode & ~S_IFMT) + #endif +@@ -1341,13 +1347,13 @@ public struct FileAttributeType : RawRepresentable, Equatable, Hashable { + } + #else + internal init(statMode: mode_t) { +- switch statMode & S_IFMT { +- case S_IFCHR: self = .typeCharacterSpecial +- case S_IFDIR: self = .typeDirectory +- case S_IFBLK: self = .typeBlockSpecial +- case S_IFREG: self = .typeRegular +- case S_IFLNK: self = .typeSymbolicLink +- case S_IFSOCK: self = .typeSocket ++ switch statMode & mode_t(S_IFMT) { ++ case mode_t(S_IFCHR): self = .typeCharacterSpecial ++ case mode_t(S_IFDIR): self = .typeDirectory ++ case mode_t(S_IFBLK): self = .typeBlockSpecial ++ case mode_t(S_IFREG): self = .typeRegular ++ case mode_t(S_IFLNK): self = .typeSymbolicLink ++ case mode_t(S_IFSOCK): self = .typeSocket + default: self = .typeUnknown + } + } +diff --git a/swift-corelibs-foundation/Sources/Foundation/Host.swift b/swift-corelibs-foundation/Sources/Foundation/Host.swift +index a8538ff0..86677a18 100644 +--- a/swift-corelibs-foundation/Sources/Foundation/Host.swift ++++ b/swift-corelibs-foundation/Sources/Foundation/Host.swift +@@ -13,6 +13,7 @@ import WinSDK + #endif + + #if os(Android) ++ import Android + // Android Glibc differs a little with respect to the Linux Glibc. + + // IFF_LOOPBACK is part of the enumeration net_device_flags, which needs to +@@ -26,7 +27,7 @@ import WinSDK + // getnameinfo uses size_t for its 4th and 6th arguments. + private func getnameinfo(_ addr: UnsafePointer?, _ addrlen: socklen_t, _ host: UnsafeMutablePointer?, _ hostlen: socklen_t, _ serv: UnsafeMutablePointer?, _ servlen: socklen_t, _ flags: Int32) -> Int32 { + guard let saddr = addr else { return -1 } +- return Glibc.getnameinfo(saddr, addrlen, host, Int(hostlen), serv, Int(servlen), flags) ++ return Android.getnameinfo(saddr, addrlen, host, Int(hostlen), serv, Int(servlen), flags) + } + + // getifaddrs and freeifaddrs are not available in Android 6.0 or earlier, so call these functions dynamically. +diff --git a/swift-corelibs-foundation/Sources/Foundation/NSData.swift b/swift-corelibs-foundation/Sources/Foundation/NSData.swift +index aaeeb9ae..83a5b2b2 100644 +--- a/swift-corelibs-foundation/Sources/Foundation/NSData.swift ++++ b/swift-corelibs-foundation/Sources/Foundation/NSData.swift +@@ -495,6 +495,8 @@ open class NSData : NSObject, NSCopying, NSMutableCopying, NSSecureCoding { + let createMode = Int(Musl.S_IRUSR) | Int(Musl.S_IWUSR) | Int(Musl.S_IRGRP) | Int(Musl.S_IWGRP) | Int(Musl.S_IROTH) | Int(Musl.S_IWOTH) + #elseif canImport(WASILibc) + let createMode = Int(WASILibc.S_IRUSR) | Int(WASILibc.S_IWUSR) | Int(WASILibc.S_IRGRP) | Int(WASILibc.S_IWGRP) | Int(WASILibc.S_IROTH) | Int(WASILibc.S_IWOTH) ++#elseif canImport(Android) ++ let createMode = Int(Android.S_IRUSR) | Int(Android.S_IWUSR) | Int(Android.S_IRGRP) | Int(Android.S_IWGRP) | Int(Android.S_IROTH) | Int(Android.S_IWOTH) + #endif + guard let fh = FileHandle(path: path, flags: flags, createMode: createMode) else { + throw _NSErrorWithErrno(errno, reading: false, path: path) +diff --git a/swift-corelibs-foundation/Sources/Foundation/NSError.swift b/swift-corelibs-foundation/Sources/Foundation/NSError.swift +index fc87a4d6..f05b503a 100644 +--- a/swift-corelibs-foundation/Sources/Foundation/NSError.swift ++++ b/swift-corelibs-foundation/Sources/Foundation/NSError.swift +@@ -16,6 +16,8 @@ import Darwin + import Glibc + #elseif canImport(CRT) + import CRT ++#elseif canImport(Android) ++import Android + #endif + + @_implementationOnly import CoreFoundation +diff --git a/swift-corelibs-foundation/Sources/Foundation/NSLock.swift b/swift-corelibs-foundation/Sources/Foundation/NSLock.swift +index fa56161c..aa8fe7ef 100644 +--- a/swift-corelibs-foundation/Sources/Foundation/NSLock.swift ++++ b/swift-corelibs-foundation/Sources/Foundation/NSLock.swift +@@ -11,6 +11,8 @@ + + #if canImport(Glibc) + import Glibc ++#elseif canImport(Android) ++import Android + #endif + + #if os(Windows) +diff --git a/swift-corelibs-foundation/Sources/Foundation/NSPathUtilities.swift b/swift-corelibs-foundation/Sources/Foundation/NSPathUtilities.swift +index 91e7ccba..532d4510 100644 +--- a/swift-corelibs-foundation/Sources/Foundation/NSPathUtilities.swift ++++ b/swift-corelibs-foundation/Sources/Foundation/NSPathUtilities.swift +@@ -803,7 +803,7 @@ internal func _NSCreateTemporaryFile(_ filePath: String) throws -> (Int32, Strin + } + + // Set the file mode to match macOS +- guard fchmod(fd, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH) != -1 else { ++ guard fchmod(fd, mode_t(S_IRUSR) | mode_t(S_IWUSR) | mode_t(S_IRGRP) | mode_t(S_IWGRP) | mode_t(S_IROTH) | mode_t(S_IWOTH)) != -1 else { + let _errno = errno + close(fd) + throw _NSErrorWithErrno(_errno, reading: false, path: pathResult) +diff --git a/swift-corelibs-foundation/Sources/Foundation/NSSwiftRuntime.swift b/swift-corelibs-foundation/Sources/Foundation/NSSwiftRuntime.swift +index c079ed62..c15217ab 100644 +--- a/swift-corelibs-foundation/Sources/Foundation/NSSwiftRuntime.swift ++++ b/swift-corelibs-foundation/Sources/Foundation/NSSwiftRuntime.swift +@@ -18,6 +18,8 @@ + @_exported import Glibc + #elseif canImport(Musl) + @_exported import Musl ++#elseif canImport(Android) ++@_exported import Android + #elseif os(WASI) + @_exported import WASILibc + #elseif os(Windows) +diff --git a/swift-corelibs-foundation/Sources/Foundation/NSURL.swift b/swift-corelibs-foundation/Sources/Foundation/NSURL.swift +index 4d31e2ba..6169613b 100644 +--- a/swift-corelibs-foundation/Sources/Foundation/NSURL.swift ++++ b/swift-corelibs-foundation/Sources/Foundation/NSURL.swift +@@ -22,6 +22,8 @@ import Darwin + import Glibc + #elseif canImport(Musl) + import Musl ++#elseif canImport(Android) ++import Android + #endif + + // NOTE: this represents PLATFORM_PATH_STYLE +diff --git a/swift-corelibs-foundation/Sources/Foundation/Port.swift b/swift-corelibs-foundation/Sources/Foundation/Port.swift +index c53263f0..9f1823fe 100644 +--- a/swift-corelibs-foundation/Sources/Foundation/Port.swift ++++ b/swift-corelibs-foundation/Sources/Foundation/Port.swift +@@ -90,22 +90,28 @@ open class SocketPort: Port {} + + #else + +-#if canImport(Glibc) && !os(Android) && !os(OpenBSD) ++#if canImport(Glibc) && !os(OpenBSD) + import Glibc + fileprivate let SOCK_STREAM = Int32(Glibc.SOCK_STREAM.rawValue) + fileprivate let SOCK_DGRAM = Int32(Glibc.SOCK_DGRAM.rawValue) + fileprivate let IPPROTO_TCP = Int32(Glibc.IPPROTO_TCP) + #endif + +-#if canImport(Glibc) && os(Android) || os(OpenBSD) ++#if canImport(Glibc) && os(OpenBSD) + import Glibc + fileprivate let SOCK_STREAM = Int32(Glibc.SOCK_STREAM) + fileprivate let SOCK_DGRAM = Int32(Glibc.SOCK_DGRAM) + fileprivate let IPPROTO_TCP = Int32(Glibc.IPPROTO_TCP) + fileprivate let INADDR_ANY: in_addr_t = 0 +-#if os(OpenBSD) + fileprivate let INADDR_LOOPBACK = 0x7f000001 + #endif ++ ++#if canImport(Android) ++import Android ++fileprivate let SOCK_STREAM = Int32(Android.SOCK_STREAM) ++fileprivate let SOCK_DGRAM = Int32(Android.SOCK_DGRAM) ++fileprivate let IPPROTO_TCP = Int32(Android.IPPROTO_TCP) ++fileprivate let INADDR_ANY: in_addr_t = 0 + #endif + + +diff --git a/swift-corelibs-foundation/Sources/Foundation/Process.swift b/swift-corelibs-foundation/Sources/Foundation/Process.swift +index 0f32045e..c1d593a7 100644 +--- a/swift-corelibs-foundation/Sources/Foundation/Process.swift ++++ b/swift-corelibs-foundation/Sources/Foundation/Process.swift +@@ -726,7 +726,7 @@ open class Process: NSObject { + throw _NSErrorWithErrno(errno, reading: true, path: launchPath) + } + +- let isRegularFile: Bool = statInfo.st_mode & S_IFMT == S_IFREG ++ let isRegularFile: Bool = statInfo.st_mode & mode_t(S_IFMT) == S_IFREG + guard isRegularFile == true else { + throw NSError(domain: NSCocoaErrorDomain, code: NSFileNoSuchFileError) + } +diff --git a/swift-corelibs-foundation/Sources/Foundation/Thread.swift b/swift-corelibs-foundation/Sources/Foundation/Thread.swift +index 166a5d3f..4f401987 100644 +--- a/swift-corelibs-foundation/Sources/Foundation/Thread.swift ++++ b/swift-corelibs-foundation/Sources/Foundation/Thread.swift +@@ -17,6 +17,8 @@ import WinSDK + import Glibc + #elseif canImport(Musl) + import Musl ++#elseif canImport(Android) ++import Android + #endif + + // WORKAROUND_SR9811 +diff --git a/swift-corelibs-foundation/Sources/Tools/plutil/main.swift b/swift-corelibs-foundation/Sources/Tools/plutil/main.swift +index d71d9ba9..bc35a172 100644 +--- a/swift-corelibs-foundation/Sources/Tools/plutil/main.swift ++++ b/swift-corelibs-foundation/Sources/Tools/plutil/main.swift +@@ -15,6 +15,9 @@ import Glibc + #elseif canImport(Musl) + import Foundation + import Musl ++#elseif canImport(Android) ++import Foundation ++import Android + #elseif canImport(CRT) + import Foundation + import CRT +diff --git a/swift-corelibs-foundation/Tests/Foundation/FTPServer.swift b/swift-corelibs-foundation/Tests/Foundation/FTPServer.swift +index 8bb4a9d7..a09fcae5 100644 +--- a/swift-corelibs-foundation/Tests/Foundation/FTPServer.swift ++++ b/swift-corelibs-foundation/Tests/Foundation/FTPServer.swift +@@ -15,6 +15,8 @@ import Dispatch + import Glibc + #elseif canImport(Darwin) + import Darwin ++#elseif canImport(Android) ++ import Android + #endif + + public class ServerSemaphore { +diff --git a/swift-corelibs-foundation/Tests/Foundation/HTTPServer.swift b/swift-corelibs-foundation/Tests/Foundation/HTTPServer.swift +index 5af9fb9c..4616a3f6 100644 +--- a/swift-corelibs-foundation/Tests/Foundation/HTTPServer.swift ++++ b/swift-corelibs-foundation/Tests/Foundation/HTTPServer.swift +@@ -21,6 +21,8 @@ import Dispatch + import Darwin + #elseif canImport(Glibc) + import Glibc ++#elseif canImport(Android) ++ import Android + #endif + + #if !os(Windows) +diff --git a/swift-corelibs-foundation/Tests/Foundation/Tests/TestFileHandle.swift b/swift-corelibs-foundation/Tests/Foundation/Tests/TestFileHandle.swift +index 5416c41c..82655a29 100644 +--- a/swift-corelibs-foundation/Tests/Foundation/Tests/TestFileHandle.swift ++++ b/swift-corelibs-foundation/Tests/Foundation/Tests/TestFileHandle.swift +@@ -111,7 +111,14 @@ class TestFileHandle : XCTestCase { + #else + var fds: [Int32] = [-1, -1] + fds.withUnsafeMutableBufferPointer { (pointer) -> Void in +- pipe(pointer.baseAddress) ++ let baseAddress = pointer.baseAddress ++#if canImport(Android) ++ // pipe takes in a non-nullable pointer in the Android NDK only. ++ guard let baseAddress else { ++ return ++ } ++#endif ++ pipe(baseAddress) + } + + close(fds[1]) +diff --git a/swift-corelibs-foundation/Tests/Foundation/Tests/TestNSData.swift b/swift-corelibs-foundation/Tests/Foundation/Tests/TestNSData.swift +index 2c84f633..7f72e0d0 100644 +--- a/swift-corelibs-foundation/Tests/Foundation/Tests/TestNSData.swift ++++ b/swift-corelibs-foundation/Tests/Foundation/Tests/TestNSData.swift +@@ -589,6 +589,8 @@ class TestNSData: LoopbackServerTest { + let permission = try fileManager._permissionsOfItem(atPath: url.path) + #if canImport(Darwin) + let expected = Int(S_IRUSR) | Int(S_IWUSR) | Int(S_IRGRP) | Int(S_IWGRP) | Int(S_IROTH) | Int(S_IWOTH) ++#elseif canImport(Android) ++ let expected = Int(Android.S_IRUSR) | Int(Android.S_IWUSR) | Int(Android.S_IRGRP) | Int(Android.S_IWGRP) | Int(Android.S_IROTH) | Int(Android.S_IWOTH) + #else + let expected = Int(Glibc.S_IRUSR) | Int(Glibc.S_IWUSR) | Int(Glibc.S_IRGRP) | Int(Glibc.S_IWGRP) | Int(Glibc.S_IROTH) | Int(Glibc.S_IWOTH) + #endif +@@ -612,6 +614,8 @@ class TestNSData: LoopbackServerTest { + let permission = try fileManager._permissionsOfItem(atPath: url.path) + #if canImport(Darwin) + let expected = Int(S_IRUSR) | Int(S_IWUSR) | Int(S_IRGRP) | Int(S_IWGRP) | Int(S_IROTH) | Int(S_IWOTH) ++#elseif canImport(Android) ++ let expected = Int(Android.S_IRUSR) | Int(Android.S_IWUSR) | Int(Android.S_IRGRP) | Int(Android.S_IWGRP) | Int(Android.S_IROTH) | Int(Android.S_IWOTH) + #else + let expected = Int(Glibc.S_IRUSR) | Int(Glibc.S_IWUSR) | Int(Glibc.S_IRGRP) | Int(Glibc.S_IWGRP) | Int(Glibc.S_IROTH) | Int(Glibc.S_IWOTH) + #endif +diff --git a/swift-corelibs-foundation/Tests/Foundation/Tests/TestTimeZone.swift b/swift-corelibs-foundation/Tests/Foundation/Tests/TestTimeZone.swift +index 5e15c000..5c679b38 100644 +--- a/swift-corelibs-foundation/Tests/Foundation/Tests/TestTimeZone.swift ++++ b/swift-corelibs-foundation/Tests/Foundation/Tests/TestTimeZone.swift +@@ -160,7 +160,12 @@ class TestTimeZone: XCTestCase { + var lt = tm() + localtime_r(&t, <) + let zoneName = NSTimeZone.system.abbreviation() ?? "Invalid Abbreviation" +- let expectedName = String(cString: lt.tm_zone, encoding: .ascii) ?? "Invalid Zone" ++ // tm_zone is nullable in the Android NDK only. ++ let tm_zone: UnsafePointer? = lt.tm_zone ++ guard let tm_zone else { ++ return ++ } ++ let expectedName = String(cString: tm_zone, encoding: .ascii) ?? "Invalid Zone" + XCTAssertEqual(zoneName, expectedName, "expected name \"\(expectedName)\" is not equal to \"\(zoneName)\"") + } + #endif +diff --git a/swift-corelibs-foundation/Tests/Foundation/main.swift b/swift-corelibs-foundation/Tests/Foundation/main.swift +index e6c7b35b..643c0c12 100644 +--- a/swift-corelibs-foundation/Tests/Foundation/main.swift ++++ b/swift-corelibs-foundation/Tests/Foundation/main.swift +@@ -13,6 +13,8 @@ + import Darwin + #elseif canImport(Glibc) + import Glibc ++#elseif canImport(Android) ++ import Android + #elseif canImport(CRT) + import CRT + #endif diff --git a/android-overlay/import-android.patch b/android-overlay/import-android.patch new file mode 100644 index 00000000..6d2f92ad --- /dev/null +++ b/android-overlay/import-android.patch @@ -0,0 +1,434 @@ +diff --git a/indexstore-db/Sources/IndexStoreDB/IndexStoreDB.swift b/indexstore-db/Sources/IndexStoreDB/IndexStoreDB.swift +index 7005561..ebb2e1d 100644 +--- a/indexstore-db/Sources/IndexStoreDB/IndexStoreDB.swift ++++ b/indexstore-db/Sources/IndexStoreDB/IndexStoreDB.swift +@@ -19,6 +19,8 @@ import Foundation + import Glibc + #elseif os(Windows) + import ucrt ++#elseif canImport(Android) ++import Android + #else + import Darwin.POSIX + #endif +diff --git a/llbuild/products/llbuildSwift/BuildDBBindings.swift b/llbuild/products/llbuildSwift/BuildDBBindings.swift +index db8a9b72..78652cc7 100644 +--- a/llbuild/products/llbuildSwift/BuildDBBindings.swift ++++ b/llbuild/products/llbuildSwift/BuildDBBindings.swift +@@ -17,6 +17,8 @@ import WinSDK + import Glibc + #elseif canImport(Musl) + import Musl ++#elseif canImport(Android) ++import Android + #else + #error("Missing libc or equivalent") + #endif +diff --git a/llbuild/products/llbuildSwift/BuildKey.swift b/llbuild/products/llbuildSwift/BuildKey.swift +index 1d89c534..a59e895a 100644 +--- a/llbuild/products/llbuildSwift/BuildKey.swift ++++ b/llbuild/products/llbuildSwift/BuildKey.swift +@@ -17,6 +17,8 @@ import WinSDK + import Glibc + #elseif canImport(Musl) + import Musl ++#elseif canImport(Android) ++import Android + #else + #error("Missing libc or equivalent") + #endif +diff --git a/llbuild/products/llbuildSwift/BuildSystemBindings.swift b/llbuild/products/llbuildSwift/BuildSystemBindings.swift +index 85c8fe24..9566f66b 100644 +--- a/llbuild/products/llbuildSwift/BuildSystemBindings.swift ++++ b/llbuild/products/llbuildSwift/BuildSystemBindings.swift +@@ -17,6 +17,8 @@ import WinSDK + import Glibc + #elseif canImport(Musl) + import Musl ++#elseif canImport(Android) ++import Android + #else + #error("Missing libc or equivalent") + #endif +@@ -1235,7 +1237,7 @@ public final class BuildSystem { + #elseif os(Windows) + info.pointee.mod_time.seconds = UInt64(s.st_mtime) + info.pointee.mod_time.nanoseconds = 0 +- #elseif canImport(Glibc) || canImport(Musl) ++ #elseif canImport(Glibc) || canImport(Musl) || canImport(Android) + info.pointee.mod_time.seconds = UInt64(s.st_mtim.tv_sec) + info.pointee.mod_time.nanoseconds = UInt64(s.st_mtim.tv_nsec) + #else +diff --git a/llbuild/products/llbuildSwift/BuildValue.swift b/llbuild/products/llbuildSwift/BuildValue.swift +index 2caa5947..b2af480f 100644 +--- a/llbuild/products/llbuildSwift/BuildValue.swift ++++ b/llbuild/products/llbuildSwift/BuildValue.swift +@@ -17,6 +17,8 @@ import WinSDK + import Glibc + #elseif canImport(Musl) + import Musl ++#elseif canImport(Android) ++import Android + #else + #error("Missing libc or equivalent") + #endif +diff --git a/llbuild/products/llbuildSwift/Internals.swift b/llbuild/products/llbuildSwift/Internals.swift +index 4e134288..3f5c4fe4 100644 +--- a/llbuild/products/llbuildSwift/Internals.swift ++++ b/llbuild/products/llbuildSwift/Internals.swift +@@ -17,6 +17,8 @@ import WinSDK + import Glibc + #elseif canImport(Musl) + import Musl ++#elseif canImport(Android) ++import Android + #else + #error("Missing libc or equivalent") + #endif +diff --git a/sourcekit-lsp/Sources/LanguageServerProtocolJSONRPC/DisableSigpipe.swift b/sourcekit-lsp/Sources/LanguageServerProtocolJSONRPC/DisableSigpipe.swift +index e9967f64..0630fe53 100644 +--- a/sourcekit-lsp/Sources/LanguageServerProtocolJSONRPC/DisableSigpipe.swift ++++ b/sourcekit-lsp/Sources/LanguageServerProtocolJSONRPC/DisableSigpipe.swift +@@ -14,9 +14,11 @@ + import Glibc + #elseif canImport(Musl) + import Musl ++#elseif canImport(Android) ++import Android + #endif + +-#if canImport(Glibc) || canImport(Musl) ++#if canImport(Glibc) || canImport(Musl) || canImport(Android) + // This is a lazily initialised global variable that when read for the first time, will ignore SIGPIPE. + private let globallyIgnoredSIGPIPE: Bool = { + /* no F_SETNOSIGPIPE on Linux :( */ +diff --git a/sourcekit-lsp/Sources/SKSupport/dlopen.swift b/sourcekit-lsp/Sources/SKSupport/dlopen.swift +index 4adf5b44..07573da1 100644 +--- a/sourcekit-lsp/Sources/SKSupport/dlopen.swift ++++ b/sourcekit-lsp/Sources/SKSupport/dlopen.swift +@@ -19,6 +19,8 @@ import Darwin + import Glibc + #elseif canImport(Musl) + import Musl ++#elseif canImport(Android) ++import Android + #endif + + public final class DLHandle { +diff --git a/sourcekit-lsp/Sources/SourceKitD/SKDRequestArray.swift b/sourcekit-lsp/Sources/SourceKitD/SKDRequestArray.swift +index a68c4ae3..f8aed9d7 100644 +--- a/sourcekit-lsp/Sources/SourceKitD/SKDRequestArray.swift ++++ b/sourcekit-lsp/Sources/SourceKitD/SKDRequestArray.swift +@@ -18,6 +18,8 @@ import Glibc + import Musl + #elseif canImport(CRT) + import CRT ++#elseif canImport(Android) ++import Android + #endif + + extension SourceKitD { +diff --git a/sourcekit-lsp/Sources/SourceKitD/SKDRequestDictionary.swift b/sourcekit-lsp/Sources/SourceKitD/SKDRequestDictionary.swift +index 99e02502..7ff965bc 100644 +--- a/sourcekit-lsp/Sources/SourceKitD/SKDRequestDictionary.swift ++++ b/sourcekit-lsp/Sources/SourceKitD/SKDRequestDictionary.swift +@@ -19,6 +19,8 @@ import Glibc + import Musl + #elseif canImport(CRT) + import CRT ++#elseif canImport(Android) ++import Android + #endif + + /// Values that can be stored in a `SKDRequestDictionary`. +diff --git a/sourcekit-lsp/Sources/SourceKitD/SKDResponse.swift b/sourcekit-lsp/Sources/SourceKitD/SKDResponse.swift +index 6f7ec1ba..a48af403 100644 +--- a/sourcekit-lsp/Sources/SourceKitD/SKDResponse.swift ++++ b/sourcekit-lsp/Sources/SourceKitD/SKDResponse.swift +@@ -19,6 +19,8 @@ import Glibc + import Musl + #elseif canImport(CRT) + import CRT ++#elseif canImport(Android) ++import Android + #endif + + public final class SKDResponse: Sendable { +diff --git a/sourcekit-lsp/Sources/SourceKitD/SKDResponseArray.swift b/sourcekit-lsp/Sources/SourceKitD/SKDResponseArray.swift +index c2d4da58..79c32ee5 100644 +--- a/sourcekit-lsp/Sources/SourceKitD/SKDResponseArray.swift ++++ b/sourcekit-lsp/Sources/SourceKitD/SKDResponseArray.swift +@@ -18,6 +18,8 @@ import Glibc + import Musl + #elseif canImport(CRT) + import CRT ++#elseif canImport(Android) ++import Android + #endif + + public final class SKDResponseArray: Sendable { +diff --git a/sourcekit-lsp/Sources/SourceKitD/SKDResponseDictionary.swift b/sourcekit-lsp/Sources/SourceKitD/SKDResponseDictionary.swift +index efb5d761..e8b8d250 100644 +--- a/sourcekit-lsp/Sources/SourceKitD/SKDResponseDictionary.swift ++++ b/sourcekit-lsp/Sources/SourceKitD/SKDResponseDictionary.swift +@@ -18,6 +18,8 @@ import Glibc + import Musl + #elseif canImport(CRT) + import CRT ++#elseif canImport(Android) ++import Android + #endif + + public final class SKDResponseDictionary: Sendable { +diff --git a/swift-driver/Sources/SwiftDriver/Driver/ToolExecutionDelegate.swift b/swift-driver/Sources/SwiftDriver/Driver/ToolExecutionDelegate.swift +index 4d6577d0..0eef6e57 100644 +--- a/swift-driver/Sources/SwiftDriver/Driver/ToolExecutionDelegate.swift ++++ b/swift-driver/Sources/SwiftDriver/Driver/ToolExecutionDelegate.swift +@@ -19,6 +19,8 @@ import WinSDK + import Glibc + #elseif canImport(Musl) + import Musl ++#elseif canImport(Android) ++import Android + #else + #error("Missing libc or equivalent") + #endif +diff --git a/swift-driver/Sources/SwiftDriver/SwiftScan/Loader.swift b/swift-driver/Sources/SwiftDriver/SwiftScan/Loader.swift +index 92ec883f..2ab4e6fd 100644 +--- a/swift-driver/Sources/SwiftDriver/SwiftScan/Loader.swift ++++ b/swift-driver/Sources/SwiftDriver/SwiftScan/Loader.swift +@@ -21,6 +21,8 @@ import Darwin + import Glibc + #elseif canImport(Musl) + import Musl ++#elseif canImport(Android) ++import Android + #endif + + internal enum Loader { +diff --git a/swift-driver/Sources/SwiftDriver/Utilities/DateAdditions.swift b/swift-driver/Sources/SwiftDriver/Utilities/DateAdditions.swift +index fcad533d..8d924dbd 100644 +--- a/swift-driver/Sources/SwiftDriver/Utilities/DateAdditions.swift ++++ b/swift-driver/Sources/SwiftDriver/Utilities/DateAdditions.swift +@@ -18,6 +18,8 @@ import Darwin + import Glibc + #elseif canImport(Musl) + import Musl ++#elseif canImport(Android) ++import Android + #endif + + /// Represents a time point value with nanosecond precision. +diff --git a/swift-driver/Sources/SwiftDriver/Utilities/System.swift b/swift-driver/Sources/SwiftDriver/Utilities/System.swift +index c4fdaa89..a3b4d451 100644 +--- a/swift-driver/Sources/SwiftDriver/Utilities/System.swift ++++ b/swift-driver/Sources/SwiftDriver/Utilities/System.swift +@@ -16,6 +16,8 @@ import Darwin + import Glibc + #elseif canImport(Musl) + import Musl ++#elseif canImport(Android) ++import Android + #endif + + func argumentNeedsQuoting(_ argument: String) -> Bool { +diff --git a/swift-driver/Sources/swift-build-sdk-interfaces/main.swift b/swift-driver/Sources/swift-build-sdk-interfaces/main.swift +index 07eced80..a12a594a 100644 +--- a/swift-driver/Sources/swift-build-sdk-interfaces/main.swift ++++ b/swift-driver/Sources/swift-build-sdk-interfaces/main.swift +@@ -19,6 +19,8 @@ import Darwin + import Glibc + #elseif canImport(Musl) + import Musl ++#elseif canImport(Android) ++import Android + #endif + + import class TSCBasic.DiagnosticsEngine +diff --git a/swift-driver/Sources/swift-driver/main.swift b/swift-driver/Sources/swift-driver/main.swift +index 8126b659..e1f2f56f 100644 +--- a/swift-driver/Sources/swift-driver/main.swift ++++ b/swift-driver/Sources/swift-driver/main.swift +@@ -20,6 +20,8 @@ import Darwin + import Glibc + #elseif canImport(Musl) + import Musl ++#elseif canImport(Android) ++import Android + #endif + + import Dispatch +diff --git a/swift-system/Sources/System/Internals/CInterop.swift b/swift-system/Sources/System/Internals/CInterop.swift +index cb84a59..d426924 100644 +--- a/swift-system/Sources/System/Internals/CInterop.swift ++++ b/swift-system/Sources/System/Internals/CInterop.swift +@@ -16,12 +16,15 @@ public typealias CModeT = CInterop.Mode + + #if os(macOS) || os(iOS) || os(watchOS) || os(tvOS) + import Darwin +-#elseif os(Linux) || os(FreeBSD) || os(Android) ++#elseif os(Linux) || os(FreeBSD) + @_implementationOnly import CSystem + import Glibc + #elseif os(Windows) + import CSystem + import ucrt ++#elseif canImport(Android) ++@_implementationOnly import CSystem ++import Android + #else + #error("Unsupported Platform") + #endif +diff --git a/swift-system/Sources/System/Internals/Constants.swift b/swift-system/Sources/System/Internals/Constants.swift +index 5489a55..29324ae 100644 +--- a/swift-system/Sources/System/Internals/Constants.swift ++++ b/swift-system/Sources/System/Internals/Constants.swift +@@ -13,11 +13,13 @@ + + #if os(macOS) || os(iOS) || os(watchOS) || os(tvOS) + import Darwin +-#elseif os(Linux) || os(FreeBSD) || os(Android) ++#elseif os(Linux) || os(FreeBSD) + import Glibc + #elseif os(Windows) + import CSystem + import ucrt ++#elseif canImport(Android) ++import Android + #else + #error("Unsupported Platform") + #endif +diff --git a/swift-system/Sources/System/Internals/Exports.swift b/swift-system/Sources/System/Internals/Exports.swift +index 5c0a58a..b62eb81 100644 +--- a/swift-system/Sources/System/Internals/Exports.swift ++++ b/swift-system/Sources/System/Internals/Exports.swift +@@ -14,12 +14,15 @@ + + #if os(macOS) || os(iOS) || os(watchOS) || os(tvOS) + import Darwin +-#elseif os(Linux) || os(FreeBSD) || os(Android) ++#elseif os(Linux) || os(FreeBSD) + @_implementationOnly import CSystem + import Glibc + #elseif os(Windows) + import CSystem + import ucrt ++#elseif canImport(Android) ++@_implementationOnly import CSystem ++import Android + #else + #error("Unsupported Platform") + #endif +@@ -45,6 +48,11 @@ internal var system_errno: CInt { + _ = ucrt._set_errno(newValue) + } + } ++#elseif canImport(Android) ++internal var system_errno: CInt { ++ get { Android.errno } ++ set { Android.errno = newValue } ++} + #else + internal var system_errno: CInt { + get { Glibc.errno } +diff --git a/swift-system/Sources/System/Internals/Syscalls.swift b/swift-system/Sources/System/Internals/Syscalls.swift +index b22d6a3..a929844 100644 +--- a/swift-system/Sources/System/Internals/Syscalls.swift ++++ b/swift-system/Sources/System/Internals/Syscalls.swift +@@ -9,10 +9,12 @@ + + #if os(macOS) || os(iOS) || os(watchOS) || os(tvOS) + import Darwin +-#elseif os(Linux) || os(FreeBSD) || os(Android) ++#elseif os(Linux) || os(FreeBSD) + import Glibc + #elseif os(Windows) + import ucrt ++#elseif canImport(Android) ++import Android + #else + #error("Unsupported Platform") + #endif +diff --git a/swift-tools-support-core/Sources/TSCLibc/libc.swift b/swift-tools-support-core/Sources/TSCLibc/libc.swift +index 8c5c898..5c29f97 100644 +--- a/swift-tools-support-core/Sources/TSCLibc/libc.swift ++++ b/swift-tools-support-core/Sources/TSCLibc/libc.swift +@@ -15,6 +15,8 @@ + #elseif os(Windows) + @_exported import CRT + @_exported import WinSDK ++#elseif canImport(Android) ++@_exported import Android + #else + @_exported import Darwin.C + #endif +diff --git a/swift-tools-support-core/Sources/TSCUtility/FSWatch.swift b/swift-tools-support-core/Sources/TSCUtility/FSWatch.swift +index 5cea437..79499e9 100644 +--- a/swift-tools-support-core/Sources/TSCUtility/FSWatch.swift ++++ b/swift-tools-support-core/Sources/TSCUtility/FSWatch.swift +@@ -54,7 +54,7 @@ public class FSWatch { + self._watcher = NoOpWatcher(paths: paths, latency: latency, delegate: _WatcherDelegate(block: block)) + #elseif os(Windows) + self._watcher = RDCWatcher(paths: paths, latency: latency, delegate: _WatcherDelegate(block: block)) +- #elseif canImport(Glibc) || canImport(Musl) ++ #elseif canImport(Glibc) || canImport(Musl) || canImport(Android) + var ipaths: [AbsolutePath: Inotify.WatchOptions] = [:] + + // FIXME: We need to recurse here. +@@ -106,7 +106,7 @@ extension NoOpWatcher: _FileWatcher{} + #elseif os(Windows) + extension FSWatch._WatcherDelegate: RDCWatcherDelegate {} + extension RDCWatcher: _FileWatcher {} +-#elseif canImport(Glibc) || canImport(Musl) ++#elseif canImport(Glibc) || canImport(Musl) || canImport(Android) + extension FSWatch._WatcherDelegate: InotifyDelegate {} + extension Inotify: _FileWatcher{} + #elseif os(macOS) +@@ -296,7 +296,7 @@ public final class RDCWatcher { + } + } + +-#elseif canImport(Glibc) || canImport(Musl) ++#elseif canImport(Glibc) || canImport(Musl) || canImport(Android) + + /// The delegate for receiving inotify events. + public protocol InotifyDelegate { +diff --git a/swift-tools-support-core/Sources/TSCUtility/Tracing.swift b/swift-tools-support-core/Sources/TSCUtility/Tracing.swift +index c32d6a5..b53d26c 100644 +--- a/swift-tools-support-core/Sources/TSCUtility/Tracing.swift ++++ b/swift-tools-support-core/Sources/TSCUtility/Tracing.swift +@@ -92,7 +92,7 @@ public struct TracingEvent: TracingEventProtocol, Codable, Sendable { + self.ts = ts + self.startTs = startTs + } +- #elseif canImport(Glibc) ++ #elseif canImport(Glibc) || canImport(Android) + public init( + cat: String, + name: String, +diff --git a/swiftpm/Sources/Build/TestObservation.swift b/swiftpm/Sources/Build/TestObservation.swift +index 98a8f5f8e..a86ff4675 100644 +--- a/swiftpm/Sources/Build/TestObservation.swift ++++ b/swiftpm/Sources/Build/TestObservation.swift +@@ -132,6 +132,8 @@ public func generateTestObservationCode(buildParameters: BuildParameters) -> Str + @_exported import WinSDK + #elseif os(WASI) + @_exported import WASILibc ++ #elseif canImport(Android) ++ @_exported import Android + #else + @_exported import Darwin.C + #endif +diff --git a/swiftpm/Sources/CoreCommands/SwiftCommandState.swift b/swiftpm/Sources/CoreCommands/SwiftCommandState.swift +index 38c190ec3..27d0762cf 100644 +--- a/swiftpm/Sources/CoreCommands/SwiftCommandState.swift ++++ b/swiftpm/Sources/CoreCommands/SwiftCommandState.swift +@@ -39,6 +39,8 @@ import Darwin + import Glibc + #elseif canImport(Musl) + import Musl ++#elseif canImport(Android) ++import Android + #endif + + import func TSCBasic.exec diff --git a/android-overlay/modulemap.patch b/android-overlay/modulemap.patch new file mode 100644 index 00000000..0ed97645 --- /dev/null +++ b/android-overlay/modulemap.patch @@ -0,0 +1,900 @@ +From 7fa3a4127209ebce1e5d7c53ccdf2402cec6b41f Mon Sep 17 00:00:00 2001 +From: Alex Lorenz +Date: Wed, 27 Mar 2024 13:49:42 -0700 +Subject: [PATCH] [android] add a module map for Android NDK + +This commit doesn't install them yet, they will be installed and a whole Android NDK module will be built in a follow-up commit + +This module map covers the Bionic C standard library and other Posix headers used in the Android NDK +--- + stdlib/public/Platform/SwiftAndroidNDK.h | 150 +++++ + stdlib/public/Platform/SwiftBionic.h | 38 ++ + stdlib/public/Platform/android.modulemap | 677 +++++++++++++++++++++++ + 3 files changed, 865 insertions(+) + create mode 100644 stdlib/public/Platform/SwiftAndroidNDK.h + create mode 100644 stdlib/public/Platform/SwiftBionic.h + create mode 100644 stdlib/public/Platform/android.modulemap + +diff --git a/swift/stdlib/public/Platform/SwiftAndroidNDK.h b/swift/stdlib/public/Platform/SwiftAndroidNDK.h +new file mode 100644 +index 0000000000000..4aae88ba41bb5 +--- /dev/null ++++ b/swift/stdlib/public/Platform/SwiftAndroidNDK.h +@@ -0,0 +1,150 @@ ++//===--- SwiftAndroidNDK.h ------------------------------------------------===// ++// ++// This source file is part of the Swift.org open source project ++// ++// Copyright (c) 2014 - 2024 Apple Inc. and the Swift project authors ++// Licensed under Apache License v2.0 with Runtime Library Exception ++// ++// See https://swift.org/LICENSE.txt for license information ++// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors ++// ++//===----------------------------------------------------------------------===// ++ ++#ifndef SWIFT_ANDROID_NDK_MODULE ++#define SWIFT_ANDROID_NDK_MODULE ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++// C headers that are included with the compiler. ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#endif // SWIFT_ANDROID_NDK_MODULE +diff --git a/swift/stdlib/public/Platform/SwiftBionic.h b/swift/stdlib/public/Platform/SwiftBionic.h +new file mode 100644 +index 0000000000000..b3e173030f18b +--- /dev/null ++++ b/swift/stdlib/public/Platform/SwiftBionic.h +@@ -0,0 +1,38 @@ ++//===--- SwiftBionic.h ----------------------------------------------------===// ++// ++// This source file is part of the Swift.org open source project ++// ++// Copyright (c) 2014 - 2024 Apple Inc. and the Swift project authors ++// Licensed under Apache License v2.0 with Runtime Library Exception ++// ++// See https://swift.org/LICENSE.txt for license information ++// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors ++// ++//===----------------------------------------------------------------------===// ++ ++#ifndef SWIFT_BIONIC_MODULE ++#define SWIFT_BIONIC_MODULE ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#endif // SWIFT_BIONIC_MODULE +diff --git a/swift/stdlib/public/Platform/android.modulemap b/swift/stdlib/public/Platform/android.modulemap +new file mode 100644 +index 0000000000000..9a47b4cfca816 +--- /dev/null ++++ b/swift/stdlib/public/Platform/android.modulemap +@@ -0,0 +1,677 @@ ++//===--- android.modulemap ------------------------------------------------===// ++// ++// This source file is part of the Swift.org open source project ++// ++// Copyright (c) 2014 - 2024 Apple Inc. and the Swift project authors ++// Licensed under Apache License v2.0 with Runtime Library Exception ++// ++// See https://swift.org/LICENSE.txt for license information ++// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors ++// ++//===----------------------------------------------------------------------===// ++// The module map for the Android NDK. ++// A portion of the modules in this file are prefixed ++// with an underscore, to discourage users from importing them from ++// Swift directly, as these modules might be overriden by the C++ stdlib. ++// Instead, users should import 'Android' or another ++// umbrella module that includes these headers. ++ ++// The top level 'Android' module can be included from Swift. ++module SwiftAndroid [system] { ++ header "SwiftAndroidNDK.h" ++ export * ++} ++ ++// The top level 'Bionic' module is the C standard library ++// used in the Android NDK. ++module Bionic [system] { ++ header "SwiftBionic.h" ++ export * ++} ++ ++// The individual modules for the Bionic C standard library used ++// by the Android NDK. ++module _assert [system] { ++ // 's use of NDEBUG requires textual inclusion. ++ textual header "assert.h" ++} ++module _complex [system] { ++ header "complex.h" ++ export * ++} ++module _ctype [system] { ++ header "ctype.h" ++ export * ++} ++module _errno [system] { ++ header "errno.h" ++ export * ++} ++module _fenv [system] { ++ header "fenv.h" ++ export * ++} ++// Use 'no_undeclared_includes' to avoid pulling in the libc++ headers. ++// FIXME: this can be dropped once NDK's libc++ 'std' module is split ++// into individual submodules. ++module _inttypes [system] [no_undeclared_includes] { ++ header "inttypes.h" ++ export * ++ use _stdint ++ use _sys_cdefs ++} ++module _limits [system] { ++ header "limits.h" ++ export * ++ explicit module posix_limits { ++ header "bits/posix_limits.h" ++ export * ++ } ++} ++module _locale [system] { ++ header "locale.h" ++ export * ++} ++module _malloc [system] { ++ header "malloc.h" ++ export * ++} ++module _math [system] { ++ header "math.h" ++ export * ++ link "m" ++} ++module _setjmp [system] { ++ header "setjmp.h" ++ export * ++} ++module _signal [system] { ++ header "signal.h" ++ // The 'signal.h' header unfortunately has a circular include ++ // with 'sys/ucontext.h' and thus it must be part of this module. ++ header "sys/ucontext.h" ++ export * ++ explicit module bits_signaltypes { ++ header "bits/signal_types.h" ++ export * ++ } ++} ++module _stdatomic [system] { ++ header "stdatomic.h" ++ export * ++} ++module _stdint [system] { ++ header "stdint.h" ++ export * ++} ++module _stdio [system] { ++ header "stdio.h" ++ export * ++ explicit module stdio_ext { ++ header "stdio_ext.h" ++ export * ++ } ++} ++module _stdlib [system] { ++ header "stdlib.h" ++ export * ++} ++module _string [system] { ++ header "string.h" ++ export * ++} ++module _threads [system] { ++ header "threads.h" ++ export * ++ explicit module threads_inlines { ++ header "bits/threads_inlines.h" ++ export * ++ } ++} ++module _time [system] { ++ header "time.h" ++ export * ++ explicit module sys_time { ++ header "sys/time.h" ++ export * ++ } ++ explicit module sys_times { ++ header "sys/times.h" ++ export * ++ } ++} ++module _uchar [system] { ++ header "uchar.h" ++ export * ++} ++module _wchar [system] { ++ header "wchar.h" ++ export * ++ explicit module mbstate_t { ++ header "bits/mbstate_t.h" ++ export * ++ } ++} ++ ++// POSIX and another android NDK headers. ++module alloca [system] { ++ header "alloca.h" ++ export * ++} ++ ++module ar [system] { ++ header "ar.h" ++ export * ++} ++ ++module cpio [system] { ++ header "cpio.h" ++ export * ++} ++ ++module posix_filesystem [system] { ++ // This module groups all file, paths and filesystem ++ // operations into one module. ++ explicit module dirent { ++ header "dirent.h" ++ export * ++ } ++ explicit module fcntl { ++ header "fcntl.h" ++ export * ++ } ++ explicit module fnmatch { ++ header "fnmatch.h" ++ export * ++ } ++ explicit module fts { ++ header "fts.h" ++ export * ++ } ++ explicit module ftw { ++ header "ftw.h" ++ export * ++ } ++ explicit module glob { ++ header "glob.h" ++ export * ++ } ++ explicit module mntent { ++ header "mntent.h" ++ export * ++ } ++ explicit module libgen { ++ header "libgen.h" ++ export * ++ } ++ explicit module nl_types { ++ header "nl_types.h" ++ export * ++ } ++ explicit module paths { ++ header "paths.h" ++ export * ++ } ++ explicit module poll { ++ header "poll.h" ++ export * ++ } ++ explicit module pwd { ++ header "pwd.h" ++ export * ++ } ++ explicit module utime { ++ header "utime.h" ++ export * ++ } ++ explicit module bits_ioctl { ++ header "bits/ioctl.h" ++ export * ++ } ++ explicit module sys_epoll { ++ header "sys/epoll.h" ++ export * ++ } ++ explicit module sys_eventfd { ++ header "sys/eventfd.h" ++ export * ++ } ++ explicit module sys_fcntl { ++ header "sys/fcntl.h" ++ export * ++ } ++ explicit module sys_file { ++ header "sys/file.h" ++ export * ++ } ++ explicit module sys_inotify { ++ header "sys/inotify.h" ++ export * ++ } ++ explicit module sys_ioctl { ++ header "sys/ioctl.h" ++ export * ++ } ++ explicit module sys_mount { ++ header "sys/mount.h" ++ export * ++ } ++ explicit module sys_sendfile { ++ header "sys/sendfile.h" ++ export * ++ } ++ explicit module sys_stat { ++ header "sys/stat.h" ++ export * ++ } ++ explicit module sys_statvfs { ++ header "sys/statvfs.h" ++ export * ++ } ++ explicit module sys_vfs { ++ header "sys/vfs.h" ++ export * ++ } ++ explicit module sys_uio { ++ header "sys/uio.h" ++ export * ++ } ++} ++ ++module dl [system] { ++ // This module groups all dl* based operations ++ // into one module. ++ explicit module dlfcn { ++ header "dlfcn.h" ++ export * ++ } ++ explicit module link_ { ++ header "link.h" ++ export * ++ } ++} ++ ++module error [system] { ++ header "error.h" ++ export * ++ explicit module err { ++ header "err.h" ++ export * ++ } ++} ++ ++module execinfo [system] { ++ header "execinfo.h" ++ export * ++} ++ ++module features [system] { ++ header "features.h" ++ export * ++} ++ ++module getopt [system] { ++ header "getopt.h" ++ export * ++} ++ ++module grp [system] { ++ header "grp.h" ++ export * ++} ++ ++module iconv [system] { ++ header "iconv.h" ++ export * ++} ++ ++module inet [system] { ++ // This module groups headers related to inet ++ // and networking. ++ explicit module ifaddrs { ++ header "ifaddrs.h" ++ export * ++ } ++ explicit module netdb { ++ header "netdb.h" ++ export * ++ } ++ explicit module arpa_inet { ++ header "arpa/inet.h" ++ export * ++ } ++ explicit module net_if { ++ header "net/if.h" ++ export * ++ } ++ explicit module netinet_in { ++ header "netinet/in.h" ++ export * ++ } ++ explicit module netinet_in6 { ++ header "netinet/in6.h" ++ export * ++ } ++ explicit module netinet_tcp { ++ header "netinet/tcp.h" ++ export * ++ } ++ explicit module bits_ip_mreq_source { ++ header "bits/ip_mreq_source.h" ++ export * ++ } ++ explicit module bits_ip_msfilter { ++ header "bits/ip_msfilter.h" ++ export * ++ } ++ explicit module bits_in_addr { ++ header "bits/in_addr.h" ++ export * ++ } ++ explicit module linux_if { ++ header "linux/if.h" ++ export * ++ } ++ explicit module sys_socket { ++ header "sys/socket.h" ++ export * ++ } ++} ++ ++module jni [system] { ++ header "jni.h" ++ export * ++} ++ ++module langinfo [system] { ++ header "langinfo.h" ++ export * ++} ++ ++module pthread [system] { ++ header "pthread.h" ++ export * ++} ++ ++module pty [system] { ++ header "pty.h" ++ export * ++} ++ ++module regex [system] { ++ header "regex.h" ++ export * ++} ++ ++module resolv [system] { ++ header "resolv.h" ++ export * ++} ++ ++module sched [system] { ++ header "sched.h" ++ export * ++} ++ ++module search [system] { ++ header "search.h" ++ export * ++} ++ ++module semaphore [system] { ++ header "semaphore.h" ++ export * ++} ++ ++module spawn [system] { ++ header "spawn.h" ++ export * ++} ++ ++module strings [system] { ++ header "strings.h" ++ export * ++} ++ ++module sys [system] { ++ explicit module syscall { ++ header "syscall.h" ++ export * ++ } ++ explicit module sysexits { ++ header "sysexits.h" ++ export * ++ } ++ explicit module syslog { ++ header "syslog.h" ++ export * ++ } ++} ++ ++module tar [system] { ++ header "tar.h" ++ export * ++} ++ ++module termio [system] { ++ explicit module termio { ++ header "termio.h" ++ export * ++ } ++ explicit module termios { ++ header "termios.h" ++ export * ++ } ++} ++ ++module uconfig_local [system] { ++ header "uconfig_local.h" ++ export * ++} ++ ++module ucontext [system] { ++ header "ucontext.h" ++ export * ++} ++ ++module unistd [system] { ++ header "unistd.h" ++ export * ++ explicit module sys_unistd { ++ header "sys/unistd.h" ++ export * ++ } ++} ++ ++module utmp [system] { ++ explicit module utmp { ++ header "utmp.h" ++ export * ++ } ++ explicit module utmpx { ++ header "utmpx.h" ++ export * ++ } ++} ++ ++module wait [system] { ++ header "wait.h" ++ export * ++ explicit module sys_wait { ++ header "sys/wait.h" ++ export * ++ } ++} ++ ++module xlocale [system] { ++ header "xlocale.h" ++ export * ++} ++ ++// Additional modules in the 'android' subdirectory. ++module android_defs [system] { ++ explicit module ndk_version { ++ header "android/ndk-version.h" ++ export * ++ } ++ explicit module versioning { ++ header "android/versioning.h" ++ export * ++ } ++} ++ ++module android_apis [system] { ++ explicit module asset_manager_jni { ++ header "android/asset_manager_jni.h" ++ export * ++ } ++ explicit module asset_manager { ++ header "android/asset_manager.h" ++ export * ++ } ++ explicit module log { ++ header "android/log.h" ++ export * ++ } ++ explicit module trace { ++ header "android/trace.h" ++ export * ++ } ++} ++ ++// Additional modules in the 'bits' subdirectory. ++module _bits_sa_family_t [system] { ++ // Note: this module is not part of 'inet' ++ // to prevent a circular modular dependency. ++ header "bits/sa_family_t.h" ++ export * ++} ++module _bits_stdatomic [system] { ++ // Note: this module is not part of 'stdatomic' ++ // as it depends on libc++ and forcing it to ++ // be in the same module breaks that modularization ++ // chain. ++ header "bits/stdatomic.h" ++ export * ++} ++ ++// Additional modules in the 'linux' subdirectory. ++module _linux_time [system] { ++ // Note: this module is not part of '_time' ++ // to prevent a circular modular dependency ++ // between linux_time and sys modules. ++ header "linux/time.h" ++ header "linux/time_types.h" ++ export * ++ explicit module bits_timespec { ++ header "bits/timespec.h" ++ export * ++ } ++} ++ ++// Additional modules in the 'sys' subdirectory. ++module _sys_cdefs [system] { ++ header "sys/cdefs.h" ++ // Circular included header, so combine them ++ // into the same module. ++ header "android/api-level.h" ++ export * ++} ++module _sys_core [system] { ++ explicit module endian { ++ header "sys/endian.h" ++ export * ++ } ++ explicit module errno { ++ header "sys/errno.h" ++ export * ++ } ++ explicit module ifunc { ++ header "sys/ifunc.h" ++ export * ++ } ++ explicit module ipc { ++ header "sys/ipc.h" ++ export * ++ } ++ explicit module mman { ++ header "sys/mman.h" ++ export * ++ } ++ explicit module mman_common { ++ header "asm-generic/mman-common.h" ++ export * ++ } ++ explicit module msg { ++ header "sys/msg.h" ++ export * ++ } ++ explicit module random { ++ header "sys/random.h" ++ export * ++ } ++ explicit module resource { ++ header "sys/resource.h" ++ export * ++ } ++ explicit module sem { ++ header "sys/sem.h" ++ export * ++ } ++ explicit module shm { ++ header "sys/shm.h" ++ export * ++ } ++ explicit module un { ++ header "sys/un.h" ++ export * ++ } ++ explicit module utsname { ++ header "sys/utsname.h" ++ export * ++ } ++} ++module _sys_select [system] { ++ // Note: this module is not part of ++ // 'sys_core' to prevent circular dependency error. ++ header "sys/select.h" ++ export * ++} ++// Use 'no_undeclared_includes' to avoid pulling in the libc++ module. ++// This module depends on 'stdint.h', which is defined in libc++. ++// We can't import libc++ as that would cause circular dependency ++// between libc++ and this module. Using 'no_undeclared_includes' ++// ensures that we include 'stdint.h' from usr/include instead of libc++. ++module _sys_types [system] [no_undeclared_includes] { ++ header "sys/types.h" ++ // The 'sys/types.h' header has a circular include ++ // with 'bits/pthread_types.h' and thus it must be in the same module. ++ header "bits/pthread_types.h" ++ export * ++ use _stdint ++ use _sys_cdefs ++ use _Builtin_stddef ++} ++// Use 'no_undeclared_includes' to avoid pulling in the libc++ module. ++// This module depends on 'stdint.h', which is defined in libc++. ++// We can't import libc++ as that would cause circular dependency ++// between libc++ and this module. Using 'no_undeclared_includes' ++// ensures that we include 'stdint.h' from usr/include instead of libc++. ++module _sys_user [system] [no_undeclared_includes] { ++ header "sys/user.h" ++ export * ++ use _stdint ++ use _sys_cdefs ++ use _Builtin_stddef ++} ++ ++// Module for zlib headers. ++module zlib [system] { ++ header "zlib.h" ++ explicit module zconf { ++ header "zconf.h" ++ export * ++ } ++ export * ++ link "z" ++} diff --git a/android-overlay/overlay.patch b/android-overlay/overlay.patch new file mode 100644 index 00000000..110e69cd --- /dev/null +++ b/android-overlay/overlay.patch @@ -0,0 +1,701 @@ +From 8b6767bcda115bad7a554b0bcfae8ec9778f78bf Mon Sep 17 00:00:00 2001 +From: Alex Lorenz +Date: Wed, 27 Mar 2024 13:53:11 -0700 +Subject: [PATCH] [android] add an android NDK Swift overlay module, and use it + instead of Glibc + +--- + lib/ClangImporter/ClangIncludePaths.cpp | 31 +++--- + stdlib/cmake/modules/AddSwiftStdlib.cmake | 15 ++- + stdlib/private/RuntimeUnittest/CMakeLists.txt | 1 + + .../StdlibCollectionUnittest/CMakeLists.txt | 1 + + .../StdlibUnicodeUnittest/CMakeLists.txt | 1 + + stdlib/private/StdlibUnittest/CMakeLists.txt | 1 + + stdlib/private/StdlibUnittest/RaceTest.swift | 2 + + .../StdlibUnittest/StdlibCoreExtras.swift | 2 + + .../StdlibUnittest/StdlibUnittest.swift | 2 + + stdlib/private/SwiftPrivate/CMakeLists.txt | 1 + + stdlib/private/SwiftPrivate/IO.swift | 2 + + .../SwiftPrivateLibcExtras/CMakeLists.txt | 1 + + .../SwiftPrivateLibcExtras/Subprocess.swift | 2 + + .../SwiftPrivateLibcExtras.swift | 2 + + .../SwiftPrivateThreadExtras/CMakeLists.txt | 1 + + .../SwiftPrivateThreadExtras.swift | 2 + + .../ThreadBarriers.swift | 2 + + .../SwiftReflectionTest/CMakeLists.txt | 1 + + .../SwiftReflectionTest.swift | 2 + + stdlib/public/Concurrency/CMakeLists.txt | 1 + + stdlib/public/Differentiation/CMakeLists.txt | 1 + + .../TgmathDerivatives.swift.gyb | 4 +- + stdlib/public/Distributed/CMakeLists.txt | 1 + + .../LocalTestingDistributedActorSystem.swift | 2 + + stdlib/public/Platform/Android.swift | 88 +++++++++++++++++ + stdlib/public/Platform/CMakeLists.txt | 95 ++++++++++++++++++- + stdlib/public/Platform/Platform.swift | 2 +- + stdlib/public/RegexBuilder/CMakeLists.txt | 1 + + stdlib/public/StringProcessing/CMakeLists.txt | 1 + + 29 files changed, 249 insertions(+), 19 deletions(-) + create mode 100644 stdlib/public/Platform/Android.swift + +diff --git a/swift/lib/ClangImporter/ClangIncludePaths.cpp b/swift/lib/ClangImporter/ClangIncludePaths.cpp +index 11d95131b701b..7228aaab670da 100644 +--- a/swift/lib/ClangImporter/ClangIncludePaths.cpp ++++ b/swift/lib/ClangImporter/ClangIncludePaths.cpp +@@ -185,7 +185,7 @@ static bool shouldInjectLibcModulemap(const llvm::Triple &triple) { + + static SmallVector, 2> + getLibcFileMapping(ASTContext &ctx, StringRef modulemapFileName, +- std::optional maybeHeaderFileName, ++ std::optional> maybeHeaderFileNames, + const llvm::IntrusiveRefCntPtr &vfs) { + const llvm::Triple &triple = ctx.LangOpts.Target; + if (!shouldInjectLibcModulemap(triple)) +@@ -227,18 +227,20 @@ getLibcFileMapping(ASTContext &ctx, StringRef modulemapFileName, + SmallVector, 2> vfsMappings{ + {std::string(injectedModuleMapPath), std::string(actualModuleMapPath)}}; + +- if (maybeHeaderFileName) { +- // TODO: remove the SwiftGlibc.h header and reference all Glibc headers +- // directly from the modulemap. +- Path actualHeaderPath = actualModuleMapPath; +- llvm::sys::path::remove_filename(actualHeaderPath); +- llvm::sys::path::append(actualHeaderPath, maybeHeaderFileName.value()); ++ if (maybeHeaderFileNames) { ++ for (const auto &filename : *maybeHeaderFileNames) { ++ // TODO: remove the SwiftGlibc.h header and reference all Glibc headers ++ // directly from the modulemap. ++ Path actualHeaderPath = actualModuleMapPath; ++ llvm::sys::path::remove_filename(actualHeaderPath); ++ llvm::sys::path::append(actualHeaderPath, filename); + +- Path injectedHeaderPath(libcDir); +- llvm::sys::path::append(injectedHeaderPath, maybeHeaderFileName.value()); ++ Path injectedHeaderPath(libcDir); ++ llvm::sys::path::append(injectedHeaderPath, filename); + +- vfsMappings.push_back( +- {std::string(injectedHeaderPath), std::string(actualHeaderPath)}); ++ vfsMappings.push_back( ++ {std::string(injectedHeaderPath), std::string(actualHeaderPath)}); ++ } + } + + return vfsMappings; +@@ -559,8 +561,13 @@ ClangInvocationFileMapping swift::getClangInvocationFileMapping( + } else if (triple.isMusl()) { + libcFileMapping = + getLibcFileMapping(ctx, "musl.modulemap", StringRef("SwiftMusl.h"), vfs); ++ } else if (triple.isAndroid()) { ++ // Android uses the android-specific module map that overlays the NDK. ++ StringRef headerFiles[] = {"SwiftAndroidNDK.h", "SwiftBionic.h"}; ++ libcFileMapping = ++ getLibcFileMapping(ctx, "android.modulemap", headerFiles, vfs); + } else { +- // Android/BSD/Linux Mappings ++ // BSD/Linux Mappings + libcFileMapping = getLibcFileMapping(ctx, "glibc.modulemap", + StringRef("SwiftGlibc.h"), vfs); + +diff --git a/swift/stdlib/cmake/modules/AddSwiftStdlib.cmake b/swift/stdlib/cmake/modules/AddSwiftStdlib.cmake +index 8bef94ac1529a..61673dd54fde8 100644 +--- a/swift/stdlib/cmake/modules/AddSwiftStdlib.cmake ++++ b/swift/stdlib/cmake/modules/AddSwiftStdlib.cmake +@@ -1752,6 +1752,9 @@ endfunction() + # SWIFT_MODULE_DEPENDS_WASI + # Swift modules this library depends on when built for WASI. + # ++# SWIFT_MODULE_DEPENDS_ANDROID ++# Swift modules this library depends on when built for Android. ++# + # FRAMEWORK_DEPENDS + # System frameworks this library depends on. + # +@@ -1875,6 +1878,7 @@ function(add_swift_target_library name) + SWIFT_COMPILE_FLAGS_XROS + SWIFT_COMPILE_FLAGS_LINUX + SWIFT_MODULE_DEPENDS ++ SWIFT_MODULE_DEPENDS_ANDROID + SWIFT_MODULE_DEPENDS_CYGWIN + SWIFT_MODULE_DEPENDS_FREEBSD + SWIFT_MODULE_DEPENDS_FREESTANDING +@@ -2086,12 +2090,15 @@ function(add_swift_target_library name) + elseif(sdk STREQUAL "OPENBSD") + list(APPEND swiftlib_module_depends_flattened + ${SWIFTLIB_SWIFT_MODULE_DEPENDS_OPENBSD}) +- elseif(sdk STREQUAL "LINUX" OR sdk STREQUAL "ANDROID") ++ elseif(sdk STREQUAL "LINUX") + list(APPEND swiftlib_module_depends_flattened + ${SWIFTLIB_SWIFT_MODULE_DEPENDS_LINUX}) + elseif(sdk STREQUAL "LINUX_STATIC") + list(APPEND swiftlib_module_depends_flattened + ${SWIFTLIB_SWIFT_MODULE_DEPENDS_LINUX_STATIC}) ++ elseif(sdk STREQUAL "ANDROID") ++ list(APPEND swiftlib_module_depends_flattened ++ ${SWIFTLIB_SWIFT_MODULE_DEPENDS_ANDROID}) + elseif(sdk STREQUAL "CYGWIN") + list(APPEND swiftlib_module_depends_flattened + ${SWIFTLIB_SWIFT_MODULE_DEPENDS_CYGWIN}) +@@ -2905,6 +2912,7 @@ function(add_swift_target_executable name) + DEPENDS + LINK_LIBRARIES + SWIFT_MODULE_DEPENDS ++ SWIFT_MODULE_DEPENDS_ANDROID + SWIFT_MODULE_DEPENDS_CYGWIN + SWIFT_MODULE_DEPENDS_FREEBSD + SWIFT_MODULE_DEPENDS_FREESTANDING +@@ -3015,12 +3023,15 @@ function(add_swift_target_executable name) + elseif(sdk STREQUAL "OPENBSD") + list(APPEND swiftexe_module_depends_flattened + ${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_OPENBSD}) +- elseif(sdk STREQUAL "LINUX" OR sdk STREQUAL "ANDROID") ++ elseif(sdk STREQUAL "LINUX") + list(APPEND swiftexe_module_depends_flattened + ${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_LINUX}) + elseif(sdk STREQUAL "LINUX_STATIC") + list(APPEND swiftexe_module_depends_flattened + ${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_LINUX_STATIC}) ++ elseif(sdk STREQUAL "ANDROID") ++ list(APPEND swiftexe_module_depends_flattened ++ ${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_ANDROID}) + elseif(sdk STREQUAL "CYGWIN") + list(APPEND swiftexe_module_depends_flattened + ${SWIFTEXE_TARGET_SWIFT_MODULE_DEPENDS_CYGWIN}) +diff --git a/swift/stdlib/private/RuntimeUnittest/CMakeLists.txt b/swift/stdlib/private/RuntimeUnittest/CMakeLists.txt +index e23d3a155c869..992f90ad33d2a 100644 +--- a/swift/stdlib/private/RuntimeUnittest/CMakeLists.txt ++++ b/swift/stdlib/private/RuntimeUnittest/CMakeLists.txt +@@ -8,6 +8,7 @@ add_swift_target_library(swiftRuntimeUnittest ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES + ExclusivityTests.cpp + + SWIFT_MODULE_DEPENDS StdlibUnittest ++ SWIFT_MODULE_DEPENDS_ANDROID Android + SWIFT_MODULE_DEPENDS_LINUX Glibc + SWIFT_MODULE_DEPENDS_FREEBSD Glibc + SWIFT_MODULE_DEPENDS_OPENBSD Glibc +diff --git a/swift/stdlib/private/StdlibCollectionUnittest/CMakeLists.txt b/swift/stdlib/private/StdlibCollectionUnittest/CMakeLists.txt +index 12fc845a887ef..e063340a4e638 100644 +--- a/swift/stdlib/private/StdlibCollectionUnittest/CMakeLists.txt ++++ b/swift/stdlib/private/StdlibCollectionUnittest/CMakeLists.txt +@@ -19,6 +19,7 @@ add_swift_target_library(swiftStdlibCollectionUnittest ${SWIFT_STDLIB_LIBRARY_BU + WriteBackMutableSlice.swift + + SWIFT_MODULE_DEPENDS StdlibUnittest ++ SWIFT_MODULE_DEPENDS_ANDROID Android + SWIFT_MODULE_DEPENDS_LINUX Glibc + SWIFT_MODULE_DEPENDS_FREEBSD Glibc + SWIFT_MODULE_DEPENDS_OPENBSD Glibc +diff --git a/swift/stdlib/private/StdlibUnicodeUnittest/CMakeLists.txt b/swift/stdlib/private/StdlibUnicodeUnittest/CMakeLists.txt +index 6914812465a54..44920a8f62fa8 100644 +--- a/swift/stdlib/private/StdlibUnicodeUnittest/CMakeLists.txt ++++ b/swift/stdlib/private/StdlibUnicodeUnittest/CMakeLists.txt +@@ -10,6 +10,7 @@ add_swift_target_library(swiftStdlibUnicodeUnittest ${SWIFT_STDLIB_LIBRARY_BUILD + WordBreaking.swift + + SWIFT_MODULE_DEPENDS StdlibUnittest ++ SWIFT_MODULE_DEPENDS_ANDROID Android + SWIFT_MODULE_DEPENDS_LINUX Glibc + SWIFT_MODULE_DEPENDS_FREEBSD Glibc + SWIFT_MODULE_DEPENDS_OPENBSD Glibc +diff --git a/swift/stdlib/private/StdlibUnittest/CMakeLists.txt b/swift/stdlib/private/StdlibUnittest/CMakeLists.txt +index 711ee520376c0..dfcbb067d8ff7 100644 +--- a/swift/stdlib/private/StdlibUnittest/CMakeLists.txt ++++ b/swift/stdlib/private/StdlibUnittest/CMakeLists.txt +@@ -62,6 +62,7 @@ add_swift_target_library(swiftStdlibUnittest ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} + SWIFT_MODULE_DEPENDS_XROS ${swift_stdlib_unittest_darwin_dependencies} + SWIFT_MODULE_DEPENDS_MACCATALYST ${swift_stdlib_unittest_darwin_dependencies} + SWIFT_MODULE_DEPENDS_FREESTANDING "${SWIFT_FREESTANDING_TEST_DEPENDENCIES}" ++ SWIFT_MODULE_DEPENDS_ANDROID Android + SWIFT_MODULE_DEPENDS_LINUX Glibc + SWIFT_MODULE_DEPENDS_FREEBSD Glibc + SWIFT_MODULE_DEPENDS_OPENBSD Glibc +diff --git a/swift/stdlib/private/StdlibUnittest/RaceTest.swift b/swift/stdlib/private/StdlibUnittest/RaceTest.swift +index d3aab9cd252fd..0a94d4da05ffb 100644 +--- a/swift/stdlib/private/StdlibUnittest/RaceTest.swift ++++ b/swift/stdlib/private/StdlibUnittest/RaceTest.swift +@@ -45,6 +45,8 @@ import Darwin + import Glibc + #elseif canImport(Musl) + import Musl ++#elseif canImport(Android) ++import Android + #elseif os(WASI) + import WASILibc + #elseif os(Windows) +diff --git a/swift/stdlib/private/StdlibUnittest/StdlibCoreExtras.swift b/swift/stdlib/private/StdlibUnittest/StdlibCoreExtras.swift +index 9b5ef8be2e81a..3afef278d4cd5 100644 +--- a/swift/stdlib/private/StdlibUnittest/StdlibCoreExtras.swift ++++ b/swift/stdlib/private/StdlibUnittest/StdlibCoreExtras.swift +@@ -18,6 +18,8 @@ import Darwin + import Glibc + #elseif canImport(Musl) + import Musl ++#elseif canImport(Android) ++import Android + #elseif os(WASI) + import WASILibc + #elseif os(Windows) +diff --git a/swift/stdlib/private/StdlibUnittest/StdlibUnittest.swift b/swift/stdlib/private/StdlibUnittest/StdlibUnittest.swift +index 11e60e1dbad41..55171a7114414 100644 +--- a/swift/stdlib/private/StdlibUnittest/StdlibUnittest.swift ++++ b/swift/stdlib/private/StdlibUnittest/StdlibUnittest.swift +@@ -24,6 +24,8 @@ import Darwin + import Glibc + #elseif canImport(Musl) + import Musl ++#elseif canImport(Android) ++import Android + #elseif os(WASI) + import WASILibc + #elseif os(Windows) +diff --git a/swift/stdlib/private/SwiftPrivate/CMakeLists.txt b/swift/stdlib/private/SwiftPrivate/CMakeLists.txt +index 480781284ebb7..1e0bbfea54e13 100644 +--- a/swift/stdlib/private/SwiftPrivate/CMakeLists.txt ++++ b/swift/stdlib/private/SwiftPrivate/CMakeLists.txt +@@ -27,6 +27,7 @@ add_swift_target_library(swiftSwiftPrivate ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} I + SWIFT_MODULE_DEPENDS_WATCHOS ${swift_swiftprivate_darwin_depencencies} + SWIFT_MODULE_DEPENDS_MACCATALYST ${swift_swiftprivate_darwin_depencencies} + SWIFT_MODULE_DEPENDS_FREESTANDING "${SWIFT_FREESTANDING_TEST_DEPENDENCIES}" ++ SWIFT_MODULE_DEPENDS_ANDROID Android + SWIFT_MODULE_DEPENDS_LINUX Glibc + SWIFT_MODULE_DEPENDS_LINUX_STATIC Musl + SWIFT_MODULE_DEPENDS_FREEBSD Glibc +diff --git a/swift/stdlib/private/SwiftPrivate/IO.swift b/swift/stdlib/private/SwiftPrivate/IO.swift +index 9e0f3c5ddfe75..e8bf2c659fa0d 100644 +--- a/swift/stdlib/private/SwiftPrivate/IO.swift ++++ b/swift/stdlib/private/SwiftPrivate/IO.swift +@@ -23,6 +23,8 @@ import Darwin + import Glibc + #elseif canImport(Musl) + import Musl ++#elseif canImport(Android) ++import Android + #elseif canImport(WASILibc) + import WASILibc + #endif +diff --git a/swift/stdlib/private/SwiftPrivateLibcExtras/CMakeLists.txt b/swift/stdlib/private/SwiftPrivateLibcExtras/CMakeLists.txt +index db317dcdf6882..927eae491caa5 100644 +--- a/swift/stdlib/private/SwiftPrivateLibcExtras/CMakeLists.txt ++++ b/swift/stdlib/private/SwiftPrivateLibcExtras/CMakeLists.txt +@@ -38,6 +38,7 @@ add_swift_target_library(swiftSwiftPrivateLibcExtras ${SWIFT_STDLIB_LIBRARY_BUIL + SWIFT_MODULE_DEPENDS_XROS ${swift_private_libc_extras_darwin_depencencies} + SWIFT_MODULE_DEPENDS_MACCATALYST ${swift_private_libc_extras_darwin_depencencies} + SWIFT_MODULE_DEPENDS_FREESTANDING "${SWIFT_FREESTANDING_TEST_DEPENDENCIES}" ++ SWIFT_MODULE_DEPENDS_ANDROID Android + SWIFT_MODULE_DEPENDS_LINUX Glibc + SWIFT_MODULE_DEPENDS_LINUX_STATIC Musl + SWIFT_MODULE_DEPENDS_FREEBSD Glibc +diff --git a/swift/stdlib/private/SwiftPrivateLibcExtras/Subprocess.swift b/swift/stdlib/private/SwiftPrivateLibcExtras/Subprocess.swift +index 47e8972a276c2..ad15200ac7518 100644 +--- a/swift/stdlib/private/SwiftPrivateLibcExtras/Subprocess.swift ++++ b/swift/stdlib/private/SwiftPrivateLibcExtras/Subprocess.swift +@@ -17,6 +17,8 @@ import Darwin + import Glibc + #elseif canImport(Musl) + import Musl ++#elseif canImport(Android) ++import Android + #elseif os(WASI) + import WASILibc + #elseif os(Windows) +diff --git a/swift/stdlib/private/SwiftPrivateLibcExtras/SwiftPrivateLibcExtras.swift b/swift/stdlib/private/SwiftPrivateLibcExtras/SwiftPrivateLibcExtras.swift +index 146cc404931e2..27ee869f70609 100644 +--- a/swift/stdlib/private/SwiftPrivateLibcExtras/SwiftPrivateLibcExtras.swift ++++ b/swift/stdlib/private/SwiftPrivateLibcExtras/SwiftPrivateLibcExtras.swift +@@ -17,6 +17,8 @@ import Darwin + import Glibc + #elseif canImport(Musl) + import Musl ++#elseif canImport(Android) ++import Android + #elseif os(WASI) + import WASILibc + #elseif os(Windows) +diff --git a/swift/stdlib/private/SwiftPrivateThreadExtras/CMakeLists.txt b/swift/stdlib/private/SwiftPrivateThreadExtras/CMakeLists.txt +index d0a791ad8a47f..4002af837db10 100644 +--- a/swift/stdlib/private/SwiftPrivateThreadExtras/CMakeLists.txt ++++ b/swift/stdlib/private/SwiftPrivateThreadExtras/CMakeLists.txt +@@ -19,6 +19,7 @@ add_swift_target_library(swiftSwiftPrivateThreadExtras ${SWIFT_STDLIB_LIBRARY_BU + SWIFT_MODULE_DEPENDS_XROS ${swift_private_thread_extras_darwin_depencencies} + SWIFT_MODULE_DEPENDS_MACCATALYST ${swift_private_thread_extras_darwin_depencencies} + SWIFT_MODULE_DEPENDS_FREESTANDING "${SWIFT_FREESTANDING_TEST_DEPENDENCIES}" ++ SWIFT_MODULE_DEPENDS_ANDROID Android + SWIFT_MODULE_DEPENDS_LINUX Glibc + SWIFT_MODULE_DEPENDS_LINUX_STATIC Musl + SWIFT_MODULE_DEPENDS_FREEBSD Glibc +diff --git a/swift/stdlib/private/SwiftPrivateThreadExtras/SwiftPrivateThreadExtras.swift b/swift/stdlib/private/SwiftPrivateThreadExtras/SwiftPrivateThreadExtras.swift +index 20d5cdf214087..4ddf17a803136 100644 +--- a/swift/stdlib/private/SwiftPrivateThreadExtras/SwiftPrivateThreadExtras.swift ++++ b/swift/stdlib/private/SwiftPrivateThreadExtras/SwiftPrivateThreadExtras.swift +@@ -21,6 +21,8 @@ import Darwin + import Glibc + #elseif canImport(Musl) + import Musl ++#elseif canImport(Android) ++import Android + #elseif os(WASI) + import WASILibc + #elseif os(Windows) +diff --git a/swift/stdlib/private/SwiftPrivateThreadExtras/ThreadBarriers.swift b/swift/stdlib/private/SwiftPrivateThreadExtras/ThreadBarriers.swift +index 97a5439d9ed4d..e7c43bf02567f 100644 +--- a/swift/stdlib/private/SwiftPrivateThreadExtras/ThreadBarriers.swift ++++ b/swift/stdlib/private/SwiftPrivateThreadExtras/ThreadBarriers.swift +@@ -16,6 +16,8 @@ import Darwin + import Glibc + #elseif canImport(Musl) + import Musl ++#elseif canImport(Android) ++import Android + #elseif os(WASI) + import WASILibc + #elseif os(Windows) +diff --git a/swift/stdlib/private/SwiftReflectionTest/CMakeLists.txt b/swift/stdlib/private/SwiftReflectionTest/CMakeLists.txt +index f28b657be7d30..8ad688393765e 100644 +--- a/swift/stdlib/private/SwiftReflectionTest/CMakeLists.txt ++++ b/swift/stdlib/private/SwiftReflectionTest/CMakeLists.txt +@@ -14,6 +14,7 @@ if (SWIFT_INCLUDE_TESTS AND SWIFT_BUILD_DYNAMIC_STDLIB) + SWIFT_MODULE_DEPENDS_TVOS ${swift_reflection_test_darwin_depencencies} + SWIFT_MODULE_DEPENDS_WATCHOS ${swift_reflection_test_darwin_depencencies} + SWIFT_MODULE_DEPENDS_XROS ${swift_reflection_test_darwin_depencencies} ++ SWIFT_MODULE_DEPENDS_ANDROID Android + SWIFT_MODULE_DEPENDS_LINUX Glibc + SWIFT_MODULE_DEPENDS_LINUX_STATIC Musl + SWIFT_MODULE_DEPENDS_FREEBSD Glibc +diff --git a/swift/stdlib/private/SwiftReflectionTest/SwiftReflectionTest.swift b/swift/stdlib/private/SwiftReflectionTest/SwiftReflectionTest.swift +index 44175a187da1b..041206cd4244e 100644 +--- a/swift/stdlib/private/SwiftReflectionTest/SwiftReflectionTest.swift ++++ b/swift/stdlib/private/SwiftReflectionTest/SwiftReflectionTest.swift +@@ -131,6 +131,8 @@ import SwiftShims + import Glibc + #elseif canImport(Musl) + import Musl ++#elseif canImport(Android) ++import Android + #endif + + let rtldDefault: UnsafeMutableRawPointer? = nil +diff --git a/swift/stdlib/public/Concurrency/CMakeLists.txt b/swift/stdlib/public/Concurrency/CMakeLists.txt +index d4831ef988aef..2582041ad8b6f 100644 +--- a/swift/stdlib/public/Concurrency/CMakeLists.txt ++++ b/swift/stdlib/public/Concurrency/CMakeLists.txt +@@ -156,6 +156,7 @@ add_swift_target_library(swift_Concurrency ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} I + ${SWIFT_RUNTIME_CONCURRENCY_C_SOURCES} + ${SWIFT_RUNTIME_CONCURRENCY_SWIFT_SOURCES} + ++ SWIFT_MODULE_DEPENDS_ANDROID Android + SWIFT_MODULE_DEPENDS_LINUX Glibc + SWIFT_MODULE_DEPENDS_FREEBSD Glibc + SWIFT_MODULE_DEPENDS_OPENBSD Glibc +diff --git a/swift/stdlib/public/Differentiation/CMakeLists.txt b/swift/stdlib/public/Differentiation/CMakeLists.txt +index 64e0ec3ee15e8..16a296bbbe772 100644 +--- a/swift/stdlib/public/Differentiation/CMakeLists.txt ++++ b/swift/stdlib/public/Differentiation/CMakeLists.txt +@@ -42,6 +42,7 @@ add_swift_target_library(swift_Differentiation ${SWIFT_STDLIB_LIBRARY_BUILD_TYPE + SWIFT_MODULE_DEPENDS_TVOS ${swiftDifferentiationDarwinDependencies} + SWIFT_MODULE_DEPENDS_WATCHOS ${swiftDifferentiationDarwinDependencies} + SWIFT_MODULE_DEPENDS_XROS ${swiftDifferentiationDarwinDependencies} ++ SWIFT_MODULE_DEPENDS_ANDROID Android + SWIFT_MODULE_DEPENDS_LINUX Glibc + SWIFT_MODULE_DEPENDS_LINUX_STATIC Musl + SWIFT_MODULE_DEPENDS_FREEBSD Glibc +diff --git a/swift/stdlib/public/Differentiation/TgmathDerivatives.swift.gyb b/swift/stdlib/public/Differentiation/TgmathDerivatives.swift.gyb +index a517dade14502..ce28c9c5d079f 100644 +--- a/swift/stdlib/public/Differentiation/TgmathDerivatives.swift.gyb ++++ b/swift/stdlib/public/Differentiation/TgmathDerivatives.swift.gyb +@@ -18,12 +18,14 @@ import Swift + import Darwin.C.tgmath + #elseif canImport(Musl) + import Musl +-#elseif os(Linux) || os(FreeBSD) || os(OpenBSD) || os(PS4) || os(Android) || os(Cygwin) || os(Haiku) ++#elseif os(Linux) || os(FreeBSD) || os(OpenBSD) || os(PS4) || os(Cygwin) || os(Haiku) + import Glibc + #elseif os(WASI) + import WASILibc + #elseif os(Windows) + import CRT ++#elseif os(Android) ++ import Android + #else + #error("Unsupported platform") + #endif +diff --git a/swift/stdlib/public/Distributed/CMakeLists.txt b/swift/stdlib/public/Distributed/CMakeLists.txt +index 3a0dcb21d9832..5dbea7d12f822 100644 +--- a/swift/stdlib/public/Distributed/CMakeLists.txt ++++ b/swift/stdlib/public/Distributed/CMakeLists.txt +@@ -34,6 +34,7 @@ add_swift_target_library(swiftDistributed ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} IS + SWIFT_MODULE_DEPENDS_OSX ${swift_distributed_darwin_depencencies} + SWIFT_MODULE_DEPENDS_TVOS ${swift_distributed_darwin_depencencies} + SWIFT_MODULE_DEPENDS_WATCHOS ${swift_distributed_darwin_depencencies} ++ SWIFT_MODULE_DEPENDS_ANDROID Android + SWIFT_MODULE_DEPENDS_LINUX Glibc + SWIFT_MODULE_DEPENDS_FREEBSD Glibc + SWIFT_MODULE_DEPENDS_OPENBSD Glibc +diff --git a/swift/stdlib/public/Distributed/LocalTestingDistributedActorSystem.swift b/swift/stdlib/public/Distributed/LocalTestingDistributedActorSystem.swift +index 47e31d9019800..33c208bff38ea 100644 +--- a/swift/stdlib/public/Distributed/LocalTestingDistributedActorSystem.swift ++++ b/swift/stdlib/public/Distributed/LocalTestingDistributedActorSystem.swift +@@ -18,6 +18,8 @@ import Darwin + import Glibc + #elseif canImport(Musl) + import Musl ++#elseif canImport(Android) ++import Android + #elseif os(Windows) + import WinSDK + #endif +diff --git a/swift/stdlib/public/Platform/Android.swift b/swift/stdlib/public/Platform/Android.swift +new file mode 100644 +index 0000000000000..32f71ebdd9b08 +--- /dev/null ++++ b/swift/stdlib/public/Platform/Android.swift +@@ -0,0 +1,88 @@ ++//===----------------------------------------------------------------------===// ++// ++// This source file is part of the Swift.org open source project ++// ++// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors ++// Licensed under Apache License v2.0 with Runtime Library Exception ++// ++// See https://swift.org/LICENSE.txt for license information ++// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors ++// ++//===----------------------------------------------------------------------===// ++ ++@_exported import SwiftAndroid // Clang module ++ ++@available(swift, deprecated: 3.0, message: "Please use 'Double.pi' or '.pi' to get the value of correct type and avoid casting.") ++public let M_PI = Double.pi ++@available(swift, deprecated: 3.0, message: "Please use 'Double.pi / 2' or '.pi / 2' to get the value of correct type and avoid casting.") ++public let M_PI_2 = Double.pi / 2 ++@available(swift, deprecated: 3.0, message: "Please use 'Double.pi / 4' or '.pi / 4' to get the value of correct type and avoid casting.") ++public let M_PI_4 = Double.pi / 4 ++ ++@available(swift, deprecated: 3.0, message: "Please use 2.squareRoot()'.") ++public let M_SQRT2 = 2.squareRoot() ++ ++@available(swift, deprecated: 3.0, message: "Please use 0.5.squareRoot()'.") ++public let M_SQRT1_2 = 0.5.squareRoot() ++ ++@available(swift, deprecated: 3.0, message: "Please use 'T.radix' to get the radix of a FloatingPoint type 'T'.") ++public let FLT_RADIX = Double.radix ++ ++// Where does the 1 come from? C counts the usually-implicit leading ++// significand bit, but Swift does not. Neither is really right or wrong. ++@available(swift, deprecated: 3.0, message: "Please use 'Float.significandBitCount + 1'.") ++public let FLT_MANT_DIG = Float.significandBitCount + 1 ++ ++// Where does the 1 come from? C models floating-point numbers as having a ++// significand in [0.5, 1), but Swift (following IEEE 754) considers the ++// significand to be in [1, 2). This rationale applies to FLT_MIN_EXP ++// as well. ++@available(swift, deprecated: 3.0, message: "Please use 'Float.greatestFiniteMagnitude.exponent + 1'.") ++public let FLT_MAX_EXP = Float.greatestFiniteMagnitude.exponent + 1 ++ ++@available(swift, deprecated: 3.0, message: "Please use 'Float.leastNormalMagnitude.exponent + 1'.") ++public let FLT_MIN_EXP = Float.leastNormalMagnitude.exponent + 1 ++ ++@available(swift, deprecated: 3.0, message: "Please use 'Float.greatestFiniteMagnitude' or '.greatestFiniteMagnitude'.") ++public let FLT_MAX = Float.greatestFiniteMagnitude ++ ++@available(swift, deprecated: 3.0, message: "Please use 'Float.ulpOfOne' or '.ulpOfOne'.") ++public let FLT_EPSILON = Float.ulpOfOne ++ ++@available(swift, deprecated: 3.0, message: "Please use 'Float.leastNormalMagnitude' or '.leastNormalMagnitude'.") ++public let FLT_MIN = Float.leastNormalMagnitude ++ ++@available(swift, deprecated: 3.0, message: "Please use 'Float.leastNonzeroMagnitude' or '.leastNonzeroMagnitude'.") ++public let FLT_TRUE_MIN = Float.leastNonzeroMagnitude ++ ++ ++// Where does the 1 come from? C counts the usually-implicit leading ++// significand bit, but Swift does not. Neither is really right or wrong. ++@available(swift, deprecated: 3.0, message: "Please use 'Double.significandBitCount + 1'.") ++public let DBL_MANT_DIG = Double.significandBitCount + 1 ++ ++// Where does the 1 come from? C models floating-point numbers as having a ++// significand in [0.5, 1), but Swift (following IEEE 754) considers the ++// significand to be in [1, 2). This rationale applies to DBL_MIN_EXP ++// as well. ++@available(swift, deprecated: 3.0, message: "Please use 'Double.greatestFiniteMagnitude.exponent + 1'.") ++public let DBL_MAX_EXP = Double.greatestFiniteMagnitude.exponent + 1 ++ ++@available(swift, deprecated: 3.0, message: "Please use 'Double.leastNormalMagnitude.exponent + 1'.") ++public let DBL_MIN_EXP = Double.leastNormalMagnitude.exponent + 1 ++ ++@available(swift, deprecated: 3.0, message: "Please use 'Double.greatestFiniteMagnitude' or '.greatestFiniteMagnitude'.") ++public let DBL_MAX = Double.greatestFiniteMagnitude ++ ++@available(swift, deprecated: 3.0, message: "Please use 'Double.ulpOfOne' or '.ulpOfOne'.") ++public let DBL_EPSILON = Double.ulpOfOne ++ ++@available(swift, deprecated: 3.0, message: "Please use 'Double.leastNormalMagnitude' or '.leastNormalMagnitude'.") ++public let DBL_MIN = Double.leastNormalMagnitude ++ ++@available(swift, deprecated: 3.0, message: "Please use 'Double.leastNonzeroMagnitude' or '.leastNonzeroMagnitude'.") ++public let DBL_TRUE_MIN = Double.leastNonzeroMagnitude ++ ++public let M_LN2 = SwiftAndroid.M_LN2 ++public let M_LOG10E = SwiftAndroid.M_LOG10E ++public let M_2_SQRTPI = SwiftAndroid.M_2_SQRTPI +diff --git a/swift/stdlib/public/Platform/CMakeLists.txt b/swift/stdlib/public/Platform/CMakeLists.txt +index 31419b092c057..23ddb0a20857c 100644 +--- a/swift/stdlib/public/Platform/CMakeLists.txt ++++ b/swift/stdlib/public/Platform/CMakeLists.txt +@@ -127,9 +127,9 @@ if(SWIFT_SHOULD_BUILD_EMBEDDED_STDLIB) + endforeach() + endif() + +-set(swiftGlibc_target_sdks ANDROID CYGWIN FREEBSD OPENBSD LINUX HAIKU) ++set(swiftGlibc_target_sdks CYGWIN FREEBSD OPENBSD LINUX HAIKU) + if(SWIFT_FREESTANDING_FLAVOR STREQUAL "linux") +- set(swiftGlibc_target_sdks ANDROID CYGWIN FREEBSD OPENBSD LINUX HAIKU FREESTANDING) ++ set(swiftGlibc_target_sdks CYGWIN FREEBSD OPENBSD LINUX HAIKU FREESTANDING) + endif() + add_swift_target_library(swiftGlibc ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} IS_SDK_OVERLAY + ${swift_platform_sources} +@@ -273,12 +273,28 @@ add_custom_target(musl_modulemap DEPENDS ${musl_modulemap_target_list}) + set_property(TARGET musl_modulemap PROPERTY FOLDER "Miscellaneous") + add_dependencies(sdk-overlay musl_modulemap) + ++add_swift_target_library(swiftAndroid ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} IS_SDK_OVERLAY ++ Android.swift ++ ${swift_platform_sources} ++ POSIXError.swift ++ ++ GYB_SOURCES ++ ${swift_platform_gyb_sources} ++ ++ SWIFT_COMPILE_FLAGS ++ ${SWIFT_RUNTIME_SWIFT_COMPILE_FLAGS} ++ ${SWIFT_STANDARD_LIBRARY_SWIFT_FLAGS} ++ ${swift_platform_compile_flags} ++ LINK_FLAGS "${SWIFT_RUNTIME_SWIFT_LINK_FLAGS}" ++ TARGET_SDKS "ANDROID" ++ INSTALL_IN_COMPONENT sdk-overlay ++ DEPENDS android_modulemap) ++ + set(glibc_modulemap_target_list) + foreach(sdk ${SWIFT_SDKS}) + if(NOT "${sdk}" STREQUAL "LINUX" AND + NOT "${sdk}" STREQUAL "FREEBSD" AND + NOT "${sdk}" STREQUAL "OPENBSD" AND +- NOT "${sdk}" STREQUAL "ANDROID" AND + NOT "${sdk}" STREQUAL "CYGWIN" AND + NOT "${sdk}" STREQUAL "HAIKU") + continue() +@@ -376,6 +392,79 @@ add_custom_target(glibc_modulemap DEPENDS ${glibc_modulemap_target_list}) + set_property(TARGET glibc_modulemap PROPERTY FOLDER "Miscellaneous") + add_dependencies(sdk-overlay glibc_modulemap) + ++set(android_modulemap_target_list) ++if("ANDROID" IN_LIST SWIFT_SDKS) ++ set(android_modulemap_source "android.modulemap") ++ set(android_ndk_header_source "SwiftAndroidNDK.h") ++ set(android_bionic_header_source "SwiftBionic.h") ++ ++ foreach(arch ${SWIFT_SDK_ANDROID_ARCHITECTURES}) ++ set(arch_subdir "${SWIFT_SDK_ANDROID_LIB_SUBDIR}/${arch}") ++ set(module_dir "${SWIFTLIB_DIR}/${arch_subdir}") ++ set(module_dir_static "${SWIFTSTATICLIB_DIR}/${arch_subdir}") ++ ++ add_custom_command_target( ++ copy_android_modulemap_resource ++ COMMAND ++ "${CMAKE_COMMAND}" "-E" "make_directory" ${module_dir} ${module_dir_static} ++ COMMAND ++ "${CMAKE_COMMAND}" "-E" "copy_if_different" ++ "${CMAKE_CURRENT_SOURCE_DIR}/${android_modulemap_source}" ${module_dir} ++ COMMAND ++ "${CMAKE_COMMAND}" "-E" "copy_if_different" ++ "${CMAKE_CURRENT_SOURCE_DIR}/${android_modulemap_source}" ${module_dir_static} ++ OUTPUT ${module_dir}/${android_modulemap_source} ${module_dir_static}/${android_modulemap_source} ++ COMMENT "Copying Android modulemap to resource directories") ++ add_custom_command_target( ++ copy_android_ndk_neader_resource ++ COMMAND ++ "${CMAKE_COMMAND}" "-E" "make_directory" ${module_dir} ${module_dir_static} ++ COMMAND ++ "${CMAKE_COMMAND}" "-E" "copy_if_different" ++ "${CMAKE_CURRENT_SOURCE_DIR}/${android_ndk_header_source}" ${module_dir} ++ COMMAND ++ "${CMAKE_COMMAND}" "-E" "copy_if_different" ++ "${CMAKE_CURRENT_SOURCE_DIR}/${android_ndk_header_source}" ${module_dir_static} ++ OUTPUT ${module_dir}/${android_ndk_header_source} ${module_dir_static}/${android_ndk_header_source} ++ COMMENT "Copying Android NDK header to resource directories") ++ add_custom_command_target( ++ copy_android_bionic_neader_resource ++ COMMAND ++ "${CMAKE_COMMAND}" "-E" "make_directory" ${module_dir} ${module_dir_static} ++ COMMAND ++ "${CMAKE_COMMAND}" "-E" "copy_if_different" ++ "${CMAKE_CURRENT_SOURCE_DIR}/${android_bionic_header_source}" ${module_dir} ++ COMMAND ++ "${CMAKE_COMMAND}" "-E" "copy_if_different" ++ "${CMAKE_CURRENT_SOURCE_DIR}/${android_bionic_header_source}" ${module_dir_static} ++ OUTPUT ${module_dir}/${android_bionic_header_source} ${module_dir_static}/${android_bionic_header_source} ++ COMMENT "Copying Android NDK header to resource directories") ++ ++ add_dependencies(sdk-overlay ${copy_android_modulemap_resource} ++ ${copy_android_ndk_neader_resource} ++ ${copy_android_bionic_neader_resource}) ++ list(APPEND android_modulemap_target_list ${copy_android_modulemap_resource} ++ ${copy_android_ndk_neader_resource} ++ ${copy_android_bionic_neader_resource}) ++ ++ swift_install_in_component(FILES "${android_modulemap_source}" ++ "${android_ndk_header_source}" ++ "${android_bionic_header_source}" ++ DESTINATION "lib/swift/${arch_subdir}" ++ COMPONENT sdk-overlay) ++ if(SWIFT_BUILD_STATIC_STDLIB) ++ swift_install_in_component(FILES "${android_modulemap_source}" ++ "${android_ndk_header_source}" ++ "${android_bionic_header_source}" ++ DESTINATION "lib/swift_static/${arch_subdir}" ++ COMPONENT sdk-overlay) ++ endif() ++ endforeach() ++endif() ++add_custom_target(android_modulemap DEPENDS ${android_modulemap_target_list}) ++set_property(TARGET android_modulemap PROPERTY FOLDER "Miscellaneous") ++add_dependencies(sdk-overlay android_modulemap) ++ + set(wasilibc_modulemap_target_list) + if("WASI" IN_LIST SWIFT_SDKS) + set(wasilibc_modulemap_source "wasi-libc.modulemap") +diff --git a/swift/stdlib/public/Platform/Platform.swift b/swift/stdlib/public/Platform/Platform.swift +index 0c2d63a0cffdb..b6316445ee573 100644 +--- a/swift/stdlib/public/Platform/Platform.swift ++++ b/swift/stdlib/public/Platform/Platform.swift +@@ -241,7 +241,7 @@ public var S_IFIFO: Int32 { return Int32(0x1000) } + public var S_IREAD: Int32 { return Int32(0x0100) } + public var S_IWRITE: Int32 { return Int32(0x0080) } + public var S_IEXEC: Int32 { return Int32(0x0040) } +-#else ++#else //if !os(Android) + public var S_IFMT: mode_t { return mode_t(0o170000) } + public var S_IFIFO: mode_t { return mode_t(0o010000) } + public var S_IFCHR: mode_t { return mode_t(0o020000) } +diff --git a/swift/stdlib/public/RegexBuilder/CMakeLists.txt b/swift/stdlib/public/RegexBuilder/CMakeLists.txt +index 8db5dae116602..117cb57ee7f60 100644 +--- a/swift/stdlib/public/RegexBuilder/CMakeLists.txt ++++ b/swift/stdlib/public/RegexBuilder/CMakeLists.txt +@@ -27,6 +27,7 @@ message(STATUS "Using Experimental String Processing library for RegexBuilder ($ + add_swift_target_library(swiftRegexBuilder ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} IS_STDLIB + "${REGEX_BUILDER_SOURCES}" + ++ SWIFT_MODULE_DEPENDS_ANDROID Android + SWIFT_MODULE_DEPENDS_LINUX Glibc + SWIFT_MODULE_DEPENDS_FREEBSD Glibc + SWIFT_MODULE_DEPENDS_OPENBSD Glibc +diff --git a/swift/stdlib/public/StringProcessing/CMakeLists.txt b/swift/stdlib/public/StringProcessing/CMakeLists.txt +index 408e019e46644..c767dcff59f42 100644 +--- a/swift/stdlib/public/StringProcessing/CMakeLists.txt ++++ b/swift/stdlib/public/StringProcessing/CMakeLists.txt +@@ -41,6 +41,7 @@ message(STATUS "Using Experimental String Processing library for _StringProcessi + add_swift_target_library(swift_StringProcessing ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} IS_STDLIB + "${STRING_PROCESSING_SOURCES}" + ++ SWIFT_MODULE_DEPENDS_ANDROID Android + SWIFT_MODULE_DEPENDS_LINUX Glibc + SWIFT_MODULE_DEPENDS_FREEBSD Glibc + SWIFT_MODULE_DEPENDS_OPENBSD Glibc diff --git a/android-overlay/swift-argument-parser.patch b/android-overlay/swift-argument-parser.patch new file mode 100644 index 00000000..e24a4333 --- /dev/null +++ b/android-overlay/swift-argument-parser.patch @@ -0,0 +1,31 @@ +diff --git a/swift-argument-parser/Sources/ArgumentParser/Utilities/Platform.swift b/swift-argument-parser/Sources/ArgumentParser/Utilities/Platform.swift +index b7fa046..a94e3b8 100644 +--- a/swift-argument-parser/Sources/ArgumentParser/Utilities/Platform.swift ++++ b/swift-argument-parser/Sources/ArgumentParser/Utilities/Platform.swift +@@ -19,6 +19,8 @@ import Darwin + import CRT + #elseif canImport(WASILibc) + import WASILibc ++#elseif canImport(Android) ++import Android + #endif + + enum Platform {} +@@ -88,6 +90,8 @@ extension Platform { + ucrt._exit(code) + #elseif canImport(WASILibc) + WASILibc.exit(code) ++#elseif canImport(Android) ++ Android.exit(code) + #endif + } + } +@@ -108,7 +112,7 @@ extension Platform { + + // MARK: Terminal size + +-#if canImport(Glibc) ++#if canImport(Glibc) || canImport(Android) + func ioctl(_ a: Int32, _ b: Int32, _ p: UnsafeMutableRawPointer) -> Int32 { + ioctl(CInt(a), UInt(b), p) + } diff --git a/android-overlay/swift-system.patch b/android-overlay/swift-system.patch new file mode 100644 index 00000000..48ffa404 --- /dev/null +++ b/android-overlay/swift-system.patch @@ -0,0 +1,66 @@ +diff --git a/Sources/System/Internals/CInterop.swift b/Sources/System/Internals/CInterop.swift +index 19cf4d5..db0c25a 100644 +--- a/Sources/System/Internals/CInterop.swift ++++ b/Sources/System/Internals/CInterop.swift +@@ -20,6 +20,9 @@ import Glibc + import Musl + #elseif canImport(WASILibc) + import WASILibc ++#elseif canImport(Android) ++@_implementationOnly import CSystem ++import Android + #else + #error("Unsupported Platform") + #endif +diff --git a/Sources/System/Internals/Constants.swift b/Sources/System/Internals/Constants.swift +index 27a145f..904e5b2 100644 +--- a/Sources/System/Internals/Constants.swift ++++ b/Sources/System/Internals/Constants.swift +@@ -24,6 +24,8 @@ import Musl + #elseif canImport(WASILibc) + import CSystem + import WASILibc ++#elseif canImport(Android) ++import Android + #else + #error("Unsupported Platform") + #endif +diff --git a/Sources/System/Internals/Exports.swift b/Sources/System/Internals/Exports.swift +index f4358c5..d18102a 100644 +--- a/Sources/System/Internals/Exports.swift ++++ b/Sources/System/Internals/Exports.swift +@@ -25,6 +25,9 @@ import Glibc + import Musl + #elseif canImport(WASILibc) + import WASILibc ++#elseif canImport(Android) ++@_implementationOnly import CSystem ++import Android + #else + #error("Unsupported Platform") + #endif +@@ -65,6 +68,11 @@ internal var system_errno: CInt { + get { WASILibc.errno } + set { WASILibc.errno = newValue } + } ++#elseif canImport(Android) ++internal var system_errno: CInt { ++ get { Android.errno } ++ set { Android.errno = newValue } ++} + #endif + + // MARK: C stdlib decls +diff --git a/Sources/System/Internals/Syscalls.swift b/Sources/System/Internals/Syscalls.swift +index f40b168..6f885be 100644 +--- a/Sources/System/Internals/Syscalls.swift ++++ b/Sources/System/Internals/Syscalls.swift +@@ -17,6 +17,8 @@ import Musl + import WASILibc + #elseif os(Windows) + import ucrt ++#elseif canImport(Android) ++import Android + #else + #error("Unsupported Platform") + #endif diff --git a/android-overlay/yams.patch b/android-overlay/yams.patch new file mode 100644 index 00000000..721861c3 --- /dev/null +++ b/android-overlay/yams.patch @@ -0,0 +1,15 @@ +diff --git a/yams/Sources/Yams/Representer.swift b/yams/Sources/Yams/Representer.swift +index a749c52..b74ef8e 100644 +--- a/yams/Sources/Yams/Representer.swift ++++ b/yams/Sources/Yams/Representer.swift +@@ -14,6 +14,10 @@ private let cpow: (_: Double, _: Double) -> Double = Darwin.pow + #elseif os(Windows) + import ucrt + private let cpow: (_: Double, _: Double) -> Double = ucrt.pow ++#elseif canImport(Android) ++import CoreFoundation ++import Android ++private let cpow: (_: Double, _: Double) -> Double = Android.pow + #else + import CoreFoundation + import Glibc