From 65cb0d3e2d669151560b53fdbbd3f2f0efb29c44 Mon Sep 17 00:00:00 2001 From: BogDan Vatra Date: Mon, 22 Apr 2019 17:56:22 +0300 Subject: Android: Nuke support for old NDKs - Support NDK only r19+ - Remove deprecated and unsupported stl libs: "system", "gabi++_static", "gabi++_shared", "stlport_static", "stlport_shared", "gnustl_static", "gnustl_shared" - Fix armv7a link (we need to link against libc++.[a/so].API) - Use lldb - Use llvm bin utils [ChangeLog][Android] Support NDK only r19+, remove deprecated and unsupported stl libs, use lldb and llvm bin utils Change-Id: If9d5d5462dffb6c9bf481f910ee2c3ba03bc5649 Reviewed-by: Christian Kandeler --- share/qbs/modules/cpp/android-gcc.qbs | 133 ++++++++-------------------------- 1 file changed, 32 insertions(+), 101 deletions(-) (limited to 'share/qbs/modules/cpp') diff --git a/share/qbs/modules/cpp/android-gcc.qbs b/share/qbs/modules/cpp/android-gcc.qbs index 23b50b14e..75f4299f7 100644 --- a/share/qbs/modules/cpp/android-gcc.qbs +++ b/share/qbs/modules/cpp/android-gcc.qbs @@ -39,44 +39,16 @@ import 'gcc.js' as Gcc LinuxGCC { Depends { name: "Android.ndk" } - condition: qbs.targetOS.contains("android") && - qbs.toolchain && qbs.toolchain.contains("gcc") + condition: qbs.targetOS.contains("android") && qbs.toolchain && qbs.toolchain.contains("llvm") priority: 2 rpaths: [rpathOrigin] - property string toolchainDir: { - if (qbs.toolchain && qbs.toolchain.contains("clang")) { - return Utilities.versionCompare(Android.ndk.version, "10") <= 0 - ? "llvm-" + Android.ndk.toolchainVersionNumber : "llvm"; - } - return NdkUtils.getBinutilsPath(Android.ndk, toolchainTriple + "-") - } - property string cxxStlBaseDir: FileInfo.joinPaths(Android.ndk.ndkDir, "sources", "cxx-stl") - property string gabiBaseDir: FileInfo.joinPaths(cxxStlBaseDir, "gabi++") - property string stlPortBaseDir: FileInfo.joinPaths(cxxStlBaseDir, "stlport") - property string gnuStlBaseDir: FileInfo.joinPaths(cxxStlBaseDir, "gnu-libstdc++", - Android.ndk.toolchainVersionNumber) - property string llvmStlBaseDir: FileInfo.joinPaths(cxxStlBaseDir, "llvm-libc++") - property string stlBaseDir: { - if (Android.ndk.appStl.startsWith("gabi++_")) - return gabiBaseDir; - else if (Android.ndk.appStl.startsWith("stlport_")) - return stlPortBaseDir; - else if (Android.ndk.appStl.startsWith("gnustl_")) - return gnuStlBaseDir; - else if (Android.ndk.appStl.startsWith("c++_")) - return llvmStlBaseDir; - return undefined; - } + property string stlBaseDir: FileInfo.joinPaths(cxxStlBaseDir, "llvm-libc++") property string stlLibsDir: { - if (stlBaseDir) { - var infix = Android.ndk.abi; - if (Android.ndk.armMode === "thumb" && !Android.ndk.haveUnifiedStl) - infix = FileInfo.joinPaths(infix, "thumb"); - return FileInfo.joinPaths(stlBaseDir, "libs", infix); - } + if (stlBaseDir) + return FileInfo.joinPaths(stlBaseDir, "libs", Android.ndk.abi); return undefined; } @@ -84,7 +56,7 @@ LinuxGCC { ? FileInfo.joinPaths(stlLibsDir, dynamicLibraryPrefix + Android.ndk.appStl + dynamicLibrarySuffix) : undefined property string staticStlFilePath: (stlLibsDir && Android.ndk.appStl.endsWith("_static")) - ? FileInfo.joinPaths(stlLibsDir, staticLibraryPrefix + Android.ndk.appStl + staticLibrarySuffix) + ? FileInfo.joinPaths(stlLibsDir, NdkUtils.stlFilePath(staticLibraryPrefix, Android.ndk, staticLibrarySuffix)) : undefined Group { @@ -104,17 +76,13 @@ LinuxGCC { } toolchainInstallPath: FileInfo.joinPaths(Android.ndk.ndkDir, "toolchains", - toolchainDir, "prebuilt", + "llvm", "prebuilt", Android.ndk.hostArch, "bin") property string toolchainTriple: [targetAbi === "androideabi" ? "arm" : targetArch, targetSystem, targetAbi].join("-") - toolchainPrefix: { - if (qbs.toolchain && qbs.toolchain.contains("clang")) - return undefined; - return toolchainTriple + "-"; - } + toolchainPrefix: undefined machineType: { if (Android.ndk.abi === "armeabi") @@ -128,20 +96,18 @@ LinuxGCC { enableExceptions: Android.ndk.appStl !== "system" enableRtti: Android.ndk.appStl !== "system" - commonCompilerFlags: NdkUtils.commonCompilerFlags(qbs.toolchain, qbs.buildVariant, - Android.ndk.abi, Android.ndk.armMode) + commonCompilerFlags: NdkUtils.commonCompilerFlags(qbs.toolchain, qbs.buildVariant, Android.ndk) - linkerFlags: { - var flags = NdkUtils.commonLinkerFlags(Android.ndk.abi); - if (qbs.toolchainType === "clang") { - flags = flags.concat(["--exclude-libs", "libgcc.a", "--exclude-libs", "libatomic.a"]); - if (Android.ndk.appStl.startsWith("c++") && Android.ndk.abi === "armeabi-v7a") - flags = flags.concat(["--exclude-libs", "libunwind.a"]); - } + linkerFlags: NdkUtils.commonLinkerFlags(Android.ndk.abi); + driverLinkerFlags: { + var flags = ["-fuse-ld=lld", "-Wl,--exclude-libs,libgcc.a", "-Wl,--exclude-libs,libatomic.a"]; + if (Android.ndk.appStl.startsWith("c++") && Android.ndk.abi === "armeabi-v7a") + flags = flags.concat(["-Wl,--exclude-libs,libunwind.a"]); return flags; } - platformDriverFlags: ["-no-canonical-prefixes"] + platformDriverFlags: ["-fdata-sections", "-ffunction-sections", "-funwind-tables", + "-fstack-protector-strong", "-no-canonical-prefixes"] libraryPaths: { var prefix = FileInfo.joinPaths(sysroot, "usr"); @@ -149,77 +115,42 @@ LinuxGCC { if (Android.ndk.abi === "mips64" || Android.ndk.abi === "x86_64") // no lib64 for arm64-v8a paths.push(FileInfo.joinPaths(prefix, "lib64")); paths.push(FileInfo.joinPaths(prefix, "lib")); + paths.push(stlLibsDir); return paths; } dynamicLibraries: { var libs = ["c", "m"]; if (sharedStlFilePath) - libs.push(sharedStlFilePath); - return libs; - } - staticLibraries: { - var libs = []; - if (qbs.toolchainType === "gcc") - libs.push("gcc"); - - if (staticStlFilePath) { - libs.push(staticStlFilePath); - if (Android.ndk.appStl === "c++_static") { - var libAbi = FileInfo.joinPaths(stlLibsDir, "libc++abi.a"); - if (File.exists(libAbi)) - libs.push(libAbi); - } - } + libs.push(FileInfo.joinPaths(stlLibsDir, NdkUtils.stlFilePath(dynamicLibraryPrefix, Android.ndk, dynamicLibrarySuffix))); return libs; } + staticLibraries: staticStlFilePath systemIncludePaths: { - var includes = []; - if (Android.ndk.useUnifiedHeaders) { - // Might not be needed with Clang in a future NDK release - includes.push(FileInfo.joinPaths(sysroot, "usr", "include", toolchainTriple)); - } - if (Android.ndk.appStl === "system") { - includes.push(FileInfo.joinPaths(cxxStlBaseDir, "system", "include")); - } else if (Android.ndk.appStl.startsWith("gabi++")) { - includes.push(FileInfo.joinPaths(gabiBaseDir, "include")); - } else if (Android.ndk.appStl.startsWith("stlport")) { - includes.push(FileInfo.joinPaths(stlPortBaseDir, "stlport")); - } else if (Android.ndk.appStl.startsWith("gnustl")) { - includes.push(FileInfo.joinPaths(gnuStlBaseDir, "include")); - includes.push(FileInfo.joinPaths(gnuStlBaseDir, "libs", Android.ndk.abi, "include")); - includes.push(FileInfo.joinPaths(gnuStlBaseDir, "include", "backward")); - } else if (Android.ndk.appStl.startsWith("c++_")) { - if (Utilities.versionCompare(Android.ndk.version, "13") >= 0) { - includes.push(FileInfo.joinPaths(llvmStlBaseDir, "include")); - includes.push(FileInfo.joinPaths(llvmStlBaseDir + "abi", "include")); - } else { - includes.push(FileInfo.joinPaths(llvmStlBaseDir, "libcxx", "include")); - includes.push(FileInfo.joinPaths(llvmStlBaseDir + "abi", "libcxxabi", "include")); - } + var includes = [FileInfo.joinPaths(sysroot, "usr", "include", toolchainTriple)]; + if (Android.ndk.abi === "armeabi-v7a") { + includes.push(FileInfo.joinPaths(Android.ndk.ndkDir, "sources", "android", + "support", "include")); } + includes.push(FileInfo.joinPaths(stlBaseDir, "include")); + includes.push(FileInfo.joinPaths(stlBaseDir + "abi", "include")); return includes; } + defines: { var list = ["ANDROID"]; - if (Android.ndk.useUnifiedHeaders) { - // Might be superseded by an -mandroid-version or similar Clang compiler flag in future - list.push("__ANDROID_API__=" + Android.ndk.platformVersion); - } + // Might be superseded by an -mandroid-version or similar Clang compiler flag in future + list.push("__ANDROID_API__=" + Android.ndk.platformVersion); return list; } - binutilsPath: FileInfo.joinPaths(Android.ndk.ndkDir, "toolchains", - NdkUtils.getBinutilsPath(Android.ndk, toolchainTriple + "-"), - "prebuilt", Android.ndk.hostArch, "bin"); - binutilsPathPrefix: Gcc.pathPrefix(binutilsPath, toolchainTriple + "-") - driverFlags: qbs.toolchain.contains("clang") && Utilities.versionCompare(Android.ndk.version, "19") < 0 - ? ["-gcc-toolchain", FileInfo.path(binutilsPath)].concat(base || []) : base + + binutilsPath: FileInfo.joinPaths(Android.ndk.ndkDir, "toolchains", "llvm", "prebuilt", + Android.ndk.hostArch, "bin"); + binutilsPathPrefix: "llvm-" syslibroot: FileInfo.joinPaths(Android.ndk.ndkDir, "platforms", Android.ndk.platform, "arch-" + NdkUtils.abiNameToDirName(Android.ndk.abi)) - sysroot: !Android.ndk.useUnifiedHeaders - ? syslibroot - : FileInfo.joinPaths(Android.ndk.ndkDir, "sysroot") + sysroot: FileInfo.joinPaths(Android.ndk.ndkDir, "sysroot") targetArch: { switch (qbs.architecture) { -- cgit v1.2.3