From 2e9ef4c89828b3728f66d60b546e993b9a32d939 Mon Sep 17 00:00:00 2001 From: Butta Date: Tue, 17 Dec 2019 19:27:28 +0530 Subject: [PATCH] Android: fix ABI triple detection, disable C++ modules flags, and bring over tweaks from old bootstrap script to new one. --- Sources/Build/BuildPlan.swift | 6 +++--- Sources/Build/Triple.swift | 12 +++++++++--- Sources/TSCBasic/CMakeLists.txt | 5 +++++ Utilities/bootstrap | 20 ++++++++++++++++---- 4 files changed, 33 insertions(+), 10 deletions(-) diff --git a/Sources/Build/BuildPlan.swift b/Sources/Build/BuildPlan.swift index ee3cfc2ddcf..d43b35ead18 100644 --- a/Sources/Build/BuildPlan.swift +++ b/Sources/Build/BuildPlan.swift @@ -226,13 +226,13 @@ public final class ClangTargetBuildDescription { args += buildParameters.indexStoreArguments(for: target) } - if !buildParameters.triple.isWindows() { - // Using modules currently conflicts with the Windows SDKs. + if !buildParameters.triple.isWindows() && !buildParameters.triple.isAndroid() { + // Using modules currently conflicts with the Windows and Android SDKs. args += ["-fmodules", "-fmodule-name=" + target.c99name] } args += ["-I", clangTarget.includeDir.pathString] args += additionalFlags - if !buildParameters.triple.isWindows() { + if !buildParameters.triple.isWindows() && !buildParameters.triple.isAndroid() { args += moduleCacheArgs } args += buildParameters.sanitizers.compileCFlags() diff --git a/Sources/Build/Triple.swift b/Sources/Build/Triple.swift index ded5fec0565..fcbeb2dff3c 100644 --- a/Sources/Build/Triple.swift +++ b/Sources/Build/Triple.swift @@ -61,7 +61,7 @@ public struct Triple: Encodable { public enum ABI: String, Encodable { case unknown - case android = "androideabi" + case android } public init(_ string: String) throws { @@ -81,8 +81,7 @@ public struct Triple: Encodable { throw Error.unknownOS } - let abiString = components.count > 3 ? components[3] : nil - let abi = abiString.flatMap(ABI.init) + let abi = components.count > 3 ? Triple.parseABI(components[3]) : nil self.tripleString = string self.arch = arch @@ -101,6 +100,13 @@ public struct Triple: Encodable { return nil } + fileprivate static func parseABI(_ string: String) -> ABI? { + if string.hasPrefix(ABI.android.rawValue) { + return ABI.android + } + return nil + } + public func isAndroid() -> Bool { return os == .linux && abi == .android } diff --git a/Sources/TSCBasic/CMakeLists.txt b/Sources/TSCBasic/CMakeLists.txt index 892cb1401fd..57530b130a2 100644 --- a/Sources/TSCBasic/CMakeLists.txt +++ b/Sources/TSCBasic/CMakeLists.txt @@ -62,3 +62,8 @@ install(TARGETS TSCBasic LIBRARY DESTINATION lib RUNTIME DESTINATION bin) endif() + +# Don't use GNU strerror_r on Android. +if(CMAKE_SYSTEM_NAME STREQUAL Android) + target_compile_options(TSCBasic PUBLIC "SHELL:-Xcc -U_GNU_SOURCE") +endif() diff --git a/Utilities/bootstrap b/Utilities/bootstrap index 805d6bff568..2b208fc07af 100755 --- a/Utilities/bootstrap +++ b/Utilities/bootstrap @@ -232,7 +232,14 @@ def get_build_target(args): if platform.system() == 'Darwin': return "x86_64-apple-macosx" elif platform.system() == 'Linux': - if platform.machine() == 'x86_64': + if 'ANDROID_DATA' in os.environ: + if platform.machine().startswith('armv7'): + return 'armv7a-unknown-linux-androideabi' + elif platform.machine() == 'aarch64': + return 'aarch64-unknown-linux-android' + else: + raise SystemExit("ERROR: unsupported Android platform:", platform.machine()) + elif platform.machine() == 'x86_64': return "x86_64-unknown-linux-gnu" elif platform.machine() == "i686": return "i686-unknown-linux" @@ -548,10 +555,15 @@ def get_swiftpm_flags(args): "-Xlinker", "@executable_path/../../../../../SharedFrameworks", ]) - # Add a rpath to find core swift libraries on linux. We don't need a rpath - # for Darwin because the Swift libraries are present in the OS. + # Add a rpath to find core swift libraries on linux and Android. We don't + # need a rpath for Darwin because the Swift libraries are present in the OS. if platform.system() == 'Linux': - build_flags.extend(["-Xlinker", "-rpath=$ORIGIN/../lib/swift/linux"]) + if 'ANDROID_DATA' in os.environ: + build_flags.extend(["-Xlinker", "-rpath=$ORIGIN/../lib/swift/android"]) + # Don't use GNU strerror_r on Android. + build_flags.extend(["-Xswiftc", "-Xcc", "-Xswiftc", "-U_GNU_SOURCE"]) + else: + build_flags.extend(["-Xlinker", "-rpath=$ORIGIN/../lib/swift/linux"]) return build_flags