Skip to content

Commit 81bc6c5

Browse files
committed
Android: add host platform support
1 parent 8a87ae8 commit 81bc6c5

File tree

14 files changed

+81
-43
lines changed

14 files changed

+81
-43
lines changed

Fixtures/Miscellaneous/EchoExecutable/Sources/secho/main.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#if os(Linux)
1+
#if canImport(Glibc)
22
import Glibc
33
#else
44
import Darwin.C

Sources/Build/Triple.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ public struct Triple: Encodable {
129129
public static let arm64Linux = try! Triple("aarch64-unknown-linux")
130130
public static let armLinux = try! Triple("armv7-unknown-linux-gnueabihf")
131131
public static let android = try! Triple("armv7-unknown-linux-androideabi")
132+
public static let arm64Android = try! Triple("aarch64-unknown-linux-android")
132133
public static let windows = try! Triple("x86_64-unknown-windows-msvc")
133134

134135
#if os(macOS)
@@ -149,6 +150,12 @@ public struct Triple: Encodable {
149150
#elseif arch(arm)
150151
public static let hostTriple: Triple = .armLinux
151152
#endif
153+
#elseif os(Android)
154+
#if arch(arm)
155+
public static let hostTriple: Triple = .android
156+
#elseif arch(arm64)
157+
public static let hostTriple: Triple = .arm64Android
158+
#endif
152159
#endif
153160
}
154161

Sources/Commands/SwiftTool.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,12 @@ public class SwiftTool<Options: ToolOptions> {
375375
action.__sigaction_u.__sa_handler = SIG_DFL
376376
sigaction(SIGINT, &action, nil)
377377
kill(getpid(), SIGINT)
378+
#elseif os(Android)
379+
// Install the default signal handler.
380+
var action = sigaction()
381+
action.sa_handler = SIG_DFL
382+
sigaction(SIGINT, &action, nil)
383+
kill(getpid(), SIGINT)
378384
#else
379385
var action = sigaction()
380386
action.__sigaction_handler = unsafeBitCast(

Sources/PackageDescription4/Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
See http://swift.org/CONTRIBUTORS.txt for Swift project authors
99
*/
1010

11-
#if os(Linux)
11+
#if canImport(Glibc)
1212
import Glibc
1313
#elseif os(iOS) || os(macOS) || os(tvOS) || os(watchOS)
1414
import Darwin.C

Sources/PackageLoading/ManifestLoader.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,7 @@ public final class ManifestLoader: ManifestLoaderProtocol {
472472

473473
/// Returns the extra manifest args required during SwiftPM's own bootstrap.
474474
private func bootstrapArgs() -> [String] {
475-
#if !os(Linux)
475+
#if !os(Linux) && !os(Android)
476476
return []
477477
#else
478478
// The Linux bots require extra arguments in order to locate the corelibs.

Sources/TSCBasic/Process.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ public final class Process: ObjectIdentifierProtocol {
312312
try _process?.run()
313313
#else
314314
// Initialize the spawn attributes.
315-
#if canImport(Darwin)
315+
#if canImport(Darwin) || os(Android)
316316
var attributes: posix_spawnattr_t? = nil
317317
#else
318318
var attributes = posix_spawnattr_t()
@@ -357,7 +357,7 @@ public final class Process: ObjectIdentifierProtocol {
357357
posix_spawnattr_setflags(&attributes, Int16(flags))
358358

359359
// Setup the file actions.
360-
#if canImport(Darwin)
360+
#if canImport(Darwin) || os(Android)
361361
var fileActions: posix_spawn_file_actions_t? = nil
362362
#else
363363
var fileActions = posix_spawn_file_actions_t()

Sources/TSCLibc/libc.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
See http://swift.org/CONTRIBUTORS.txt for Swift project authors
99
*/
1010

11-
#if os(Linux)
11+
#if canImport(Glibc)
1212
@_exported import Glibc
1313
#elseif os(Windows)
1414
@_exported import MSVCRT

Sources/TSCUtility/FSWatch.swift

Lines changed: 53 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -428,55 +428,74 @@ public final class Inotify {
428428
// FIXME: <rdar://problem/45794219> Swift should provide shims for FD_ macros
429429

430430
private func FD_ZERO(_ set: inout fd_set) {
431+
#if os(Android)
432+
set.fds_bits = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
433+
#else
431434
set.__fds_bits = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
435+
#endif
432436
}
433437

434438
private func FD_SET(_ fd: Int32, _ set: inout fd_set) {
435439
let intOffset = Int(fd / 16)
436440
let bitOffset = Int(fd % 16)
437-
let mask = 1 << bitOffset
441+
let mask: UInt = 1 << bitOffset
442+
#if os(Android)
443+
var fd_bits = set.fds_bits
444+
#else
445+
var fd_bits = set.__fds_bits
446+
#endif
438447
switch intOffset {
439-
case 0: set.__fds_bits.0 = set.__fds_bits.0 | mask
440-
case 1: set.__fds_bits.1 = set.__fds_bits.1 | mask
441-
case 2: set.__fds_bits.2 = set.__fds_bits.2 | mask
442-
case 3: set.__fds_bits.3 = set.__fds_bits.3 | mask
443-
case 4: set.__fds_bits.4 = set.__fds_bits.4 | mask
444-
case 5: set.__fds_bits.5 = set.__fds_bits.5 | mask
445-
case 6: set.__fds_bits.6 = set.__fds_bits.6 | mask
446-
case 7: set.__fds_bits.7 = set.__fds_bits.7 | mask
447-
case 8: set.__fds_bits.8 = set.__fds_bits.8 | mask
448-
case 9: set.__fds_bits.9 = set.__fds_bits.9 | mask
449-
case 10: set.__fds_bits.10 = set.__fds_bits.10 | mask
450-
case 11: set.__fds_bits.11 = set.__fds_bits.11 | mask
451-
case 12: set.__fds_bits.12 = set.__fds_bits.12 | mask
452-
case 13: set.__fds_bits.13 = set.__fds_bits.13 | mask
453-
case 14: set.__fds_bits.14 = set.__fds_bits.14 | mask
454-
case 15: set.__fds_bits.15 = set.__fds_bits.15 | mask
448+
case 0: fd_bits.0 = fd_bits.0 | mask
449+
case 1: fd_bits.1 = fd_bits.1 | mask
450+
case 2: fd_bits.2 = fd_bits.2 | mask
451+
case 3: fd_bits.3 = fd_bits.3 | mask
452+
case 4: fd_bits.4 = fd_bits.4 | mask
453+
case 5: fd_bits.5 = fd_bits.5 | mask
454+
case 6: fd_bits.6 = fd_bits.6 | mask
455+
case 7: fd_bits.7 = fd_bits.7 | mask
456+
case 8: fd_bits.8 = fd_bits.8 | mask
457+
case 9: fd_bits.9 = fd_bits.9 | mask
458+
case 10: fd_bits.10 = fd_bits.10 | mask
459+
case 11: fd_bits.11 = fd_bits.11 | mask
460+
case 12: fd_bits.12 = fd_bits.12 | mask
461+
case 13: fd_bits.13 = fd_bits.13 | mask
462+
case 14: fd_bits.14 = fd_bits.14 | mask
463+
case 15: fd_bits.15 = fd_bits.15 | mask
455464
default: break
456465
}
466+
#if os(Android)
467+
set.fds_bits = fd_bits
468+
#else
469+
set.__fds_bits = fd_bits
470+
#endif
457471
}
458472

459473
private func FD_ISSET(_ fd: Int32, _ set: inout fd_set) -> Bool {
460474
let intOffset = Int(fd / 32)
461475
let bitOffset = Int(fd % 32)
462-
let mask = 1 << bitOffset
476+
let mask: UInt = 1 << bitOffset
477+
#if os(Android)
478+
let fd_bits = set.fds_bits
479+
#else
480+
let fd_bits = set.__fds_bits
481+
#endif
463482
switch intOffset {
464-
case 0: return set.__fds_bits.0 & mask != 0
465-
case 1: return set.__fds_bits.1 & mask != 0
466-
case 2: return set.__fds_bits.2 & mask != 0
467-
case 3: return set.__fds_bits.3 & mask != 0
468-
case 4: return set.__fds_bits.4 & mask != 0
469-
case 5: return set.__fds_bits.5 & mask != 0
470-
case 6: return set.__fds_bits.6 & mask != 0
471-
case 7: return set.__fds_bits.7 & mask != 0
472-
case 8: return set.__fds_bits.8 & mask != 0
473-
case 9: return set.__fds_bits.9 & mask != 0
474-
case 10: return set.__fds_bits.10 & mask != 0
475-
case 11: return set.__fds_bits.11 & mask != 0
476-
case 12: return set.__fds_bits.12 & mask != 0
477-
case 13: return set.__fds_bits.13 & mask != 0
478-
case 14: return set.__fds_bits.14 & mask != 0
479-
case 15: return set.__fds_bits.15 & mask != 0
483+
case 0: return fd_bits.0 & mask != 0
484+
case 1: return fd_bits.1 & mask != 0
485+
case 2: return fd_bits.2 & mask != 0
486+
case 3: return fd_bits.3 & mask != 0
487+
case 4: return fd_bits.4 & mask != 0
488+
case 5: return fd_bits.5 & mask != 0
489+
case 6: return fd_bits.6 & mask != 0
490+
case 7: return fd_bits.7 & mask != 0
491+
case 8: return fd_bits.8 & mask != 0
492+
case 9: return fd_bits.9 & mask != 0
493+
case 10: return fd_bits.10 & mask != 0
494+
case 11: return fd_bits.11 & mask != 0
495+
case 12: return fd_bits.12 & mask != 0
496+
case 13: return fd_bits.13 & mask != 0
497+
case 14: return fd_bits.14 & mask != 0
498+
case 15: return fd_bits.15 & mask != 0
480499
default: return false
481500
}
482501
}

Sources/TSCUtility/IndexStore.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,8 @@ public final class IndexStoreAPI {
193193
self.path = path
194194
#if os(Windows)
195195
let flags: DLOpenFlags = []
196+
#elseif os(Android)
197+
let flags: DLOpenFlags = [.lazy, .local, .first]
196198
#else
197199
let flags: DLOpenFlags = [.lazy, .local, .first, .deepBind]
198200
#endif

Sources/TSCUtility/InterruptHandler.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ public final class InterruptHandler {
6565
var action = sigaction()
6666
#if canImport(Darwin)
6767
action.__sigaction_u.__sa_handler = signalHandler
68+
#elseif os(Android)
69+
action.sa_handler = signalHandler
6870
#else
6971
action.__sigaction_handler = unsafeBitCast(
7072
signalHandler,

Sources/TSCUtility/dlopen.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,10 @@ public struct DLOpenFlags: RawRepresentable, OptionSet {
6060
public static let deepBind: DLOpenFlags = DLOpenFlags(rawValue: 0)
6161
#else
6262
public static let first: DLOpenFlags = DLOpenFlags(rawValue: 0)
63+
#if !os(Android)
6364
public static let deepBind: DLOpenFlags = DLOpenFlags(rawValue: RTLD_DEEPBIND)
6465
#endif
66+
#endif
6567
#endif
6668

6769
public var rawValue: Int32

Tests/FunctionalTests/MiscellaneousTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,7 @@ class MiscellaneousTestCase: XCTestCase {
439439
}
440440

441441
func testUnicode() {
442-
#if !os(Linux) // TODO: - Linux has trouble with this and needs investigation.
442+
#if !os(Linux) && !os(Android) // TODO: - Linux has trouble with this and needs investigation.
443443
fixture(name: "Miscellaneous/Unicode") { prefix in
444444
// See the fixture manifest for an explanation of this string.
445445
let complicatedString = "πשּׁµ𝄞🇺🇳🇮🇱x̱̱̱̱̱̄̄̄̄̄"

Tests/FunctionalTests/ModuleMapTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class ModuleMapsTestCase: XCTestCase {
2626
try systemQuietly(["clang", "-shared", input.pathString, "-o", output.pathString])
2727

2828
var Xld = ["-L", outdir.pathString]
29-
#if os(Linux)
29+
#if os(Linux) || os(Android)
3030
Xld += ["-rpath", outdir.pathString]
3131
#endif
3232

Tests/TSCBasicTests/FileSystemTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,7 @@ class FileSystemTests: XCTestCase {
391391
}
392392

393393
func testSetAttribute() throws {
394-
#if os(macOS) || os(Linux)
394+
#if os(macOS) || os(Linux) || os(Android)
395395
mktmpdir { path in
396396
let fs = TSCBasic.localFileSystem
397397

0 commit comments

Comments
 (0)