Skip to content

Commit 4d0a9e9

Browse files
committed
Android: add host platform support
1 parent 8a87ae8 commit 4d0a9e9

File tree

14 files changed

+88
-42
lines changed

14 files changed

+88
-42
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: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,10 @@ public struct Triple: Encodable {
128128
public static let s390xLinux = try! Triple("s390x-unknown-linux")
129129
public static let arm64Linux = try! Triple("aarch64-unknown-linux")
130130
public static let armLinux = try! Triple("armv7-unknown-linux-gnueabihf")
131-
public static let android = try! Triple("armv7-unknown-linux-androideabi")
131+
public static let armAndroid = try! Triple("armv7-unknown-linux-androideabi")
132+
public static let arm64Android = try! Triple("aarch64-unknown-linux-android")
133+
public static let x86_64Android = try! Triple("x86_64-unknown-linux-android")
134+
public static let i686Android = try! Triple("i686-unknown-linux-android")
132135
public static let windows = try! Triple("x86_64-unknown-windows-msvc")
133136

134137
#if os(macOS)
@@ -149,6 +152,16 @@ public struct Triple: Encodable {
149152
#elseif arch(arm)
150153
public static let hostTriple: Triple = .armLinux
151154
#endif
155+
#elseif os(Android)
156+
#if arch(arm)
157+
public static let hostTriple: Triple = .armAndroid
158+
#elseif arch(arm64)
159+
public static let hostTriple: Triple = .arm64Android
160+
#elseif arch(x86_64)
161+
public static let hostTriple: Triple = .x86_64Android
162+
#elseif arch(i386)
163+
public static let hostTriple: Triple = .i686Android
164+
#endif
152165
#endif
153166
}
154167

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 & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -428,55 +428,76 @@ 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)
441+
#if os(Android)
442+
var fd_bits = set.fds_bits
443+
let mask: UInt = 1 << bitOffset
444+
#else
445+
var fd_bits = set.__fds_bits
437446
let mask = 1 << bitOffset
447+
#endif
438448
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
449+
case 0: fd_bits.0 = fd_bits.0 | mask
450+
case 1: fd_bits.1 = fd_bits.1 | mask
451+
case 2: fd_bits.2 = fd_bits.2 | mask
452+
case 3: fd_bits.3 = fd_bits.3 | mask
453+
case 4: fd_bits.4 = fd_bits.4 | mask
454+
case 5: fd_bits.5 = fd_bits.5 | mask
455+
case 6: fd_bits.6 = fd_bits.6 | mask
456+
case 7: fd_bits.7 = fd_bits.7 | mask
457+
case 8: fd_bits.8 = fd_bits.8 | mask
458+
case 9: fd_bits.9 = fd_bits.9 | mask
459+
case 10: fd_bits.10 = fd_bits.10 | mask
460+
case 11: fd_bits.11 = fd_bits.11 | mask
461+
case 12: fd_bits.12 = fd_bits.12 | mask
462+
case 13: fd_bits.13 = fd_bits.13 | mask
463+
case 14: fd_bits.14 = fd_bits.14 | mask
464+
case 15: fd_bits.15 = fd_bits.15 | mask
455465
default: break
456466
}
467+
#if os(Android)
468+
set.fds_bits = fd_bits
469+
#else
470+
set.__fds_bits = fd_bits
471+
#endif
457472
}
458473

459474
private func FD_ISSET(_ fd: Int32, _ set: inout fd_set) -> Bool {
460475
let intOffset = Int(fd / 32)
461476
let bitOffset = Int(fd % 32)
477+
#if os(Android)
478+
let fd_bits = set.fds_bits
479+
let mask: UInt = 1 << bitOffset
480+
#else
481+
let fd_bits = set.__fds_bits
462482
let mask = 1 << bitOffset
483+
#endif
463484
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
485+
case 0: return fd_bits.0 & mask != 0
486+
case 1: return fd_bits.1 & mask != 0
487+
case 2: return fd_bits.2 & mask != 0
488+
case 3: return fd_bits.3 & mask != 0
489+
case 4: return fd_bits.4 & mask != 0
490+
case 5: return fd_bits.5 & mask != 0
491+
case 6: return fd_bits.6 & mask != 0
492+
case 7: return fd_bits.7 & mask != 0
493+
case 8: return fd_bits.8 & mask != 0
494+
case 9: return fd_bits.9 & mask != 0
495+
case 10: return fd_bits.10 & mask != 0
496+
case 11: return fd_bits.11 & mask != 0
497+
case 12: return fd_bits.12 & mask != 0
498+
case 13: return fd_bits.13 & mask != 0
499+
case 14: return fd_bits.14 & mask != 0
500+
case 15: return fd_bits.15 & mask != 0
480501
default: return false
481502
}
482503
}

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)