diff options
author | Jake Petroules <jake.petroules@qt.io> | 2016-04-22 11:20:50 -0700 |
---|---|---|
committer | Jake Petroules <jake.petroules@qt.io> | 2016-05-23 07:40:01 +0000 |
commit | 12c2eaee9f27ddfa1ac8232fdf04577223927cf6 (patch) | |
tree | 466e4dd306b250abfb9e27917999680d98d5ed9a /share/qbs/modules/cpp/android-gcc.qbs | |
parent | dd93ebcc6dedef1af3bd102a3e1c64784124ebcb (diff) |
Flip the cpp and Android.ndk dependencies.
This is more logically consistent and allows us to use a Probe to
get compiler info in the cpp module. This is required for a
subsequent patch.
Change-Id: Id25ee84f201e8e72ecc24af4ec5c27cedc47b660
Reviewed-by: Christian Kandeler <christian.kandeler@theqtcompany.com>
Diffstat (limited to 'share/qbs/modules/cpp/android-gcc.qbs')
-rw-r--r-- | share/qbs/modules/cpp/android-gcc.qbs | 268 |
1 files changed, 268 insertions, 0 deletions
diff --git a/share/qbs/modules/cpp/android-gcc.qbs b/share/qbs/modules/cpp/android-gcc.qbs new file mode 100644 index 000000000..c42f78578 --- /dev/null +++ b/share/qbs/modules/cpp/android-gcc.qbs @@ -0,0 +1,268 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing +** +** This file is part of the Qt Build Suite. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms and +** conditions see http://www.qt.io/terms-conditions. For further information +** use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +import qbs +import qbs.File +import qbs.FileInfo +import qbs.ModUtils +import qbs.TextFile +import "../../modules/Android/ndk/utils.js" as NdkUtils + +LinuxGCC { + Depends { name: "Android.ndk" } + + condition: qbs.targetOS.contains("android") && + qbs.toolchain && qbs.toolchain.contains("gcc") + rpaths: ['$ORIGIN'] + + property string toolchainDir: { + if (qbs.toolchain && qbs.toolchain.contains("clang")) + return "llvm-" + Android.ndk.toolchainVersionNumber; + if (["x86", "x86_64"].contains(Android.ndk.abi)) + return Android.ndk.abi + "-" + Android.ndk.toolchainVersionNumber; + return toolchainPrefix + Android.ndk.toolchainVersionNumber; + } + + 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 stlLibsDir: { + if (stlBaseDir) { + var infix = Android.ndk.buildProfile; + if (Android.ndk.armMode === "thumb") + infix = FileInfo.joinPaths(infix, "thumb"); + return FileInfo.joinPaths(stlBaseDir, "libs", infix); + } + return undefined; + } + + property string sharedStlFilePath: (stlLibsDir && Android.ndk.appStl.endsWith("_shared")) + ? 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) + : undefined + + toolchainInstallPath: FileInfo.joinPaths(Android.ndk.ndkDir, "toolchains", + toolchainDir, "prebuilt", + Android.ndk.hostArch, "bin") + + toolchainPrefix: { + if (qbs.toolchain && qbs.toolchain.contains("clang")) + return undefined; + return [targetAbi === "androideabi" ? "arm" : targetArch, + targetSystem, targetAbi].join("-") + "-"; + } + + machineType: { + if (Android.ndk.abi === "armeabi") + return "armv5te"; + if (Android.ndk.abi === "armeabi-v7a") + return "armv7-a"; + } + + qbs.optimization: targetAbi === "androideabi" ? "small" : base + + enableExceptions: Android.ndk.appStl !== "system" + enableRtti: Android.ndk.appStl !== "system" + + commonCompilerFlags: NdkUtils.commonCompilerFlags(qbs.buildVariant, Android.ndk.abi, + Android.ndk.hardFloat, Android.ndk.armMode) + + linkerFlags: NdkUtils.commonLinkerFlags(Android.ndk.abi, Android.ndk.hardFloat) + + libraryPaths: { + var prefix = FileInfo.joinPaths(sysroot, "usr"); + var paths = []; + 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")); + return paths; + } + + dynamicLibraries: { + var libs = ["c"]; + if (!Android.ndk.hardFloat) + libs.push("m"); + if (sharedStlFilePath) + libs.push(sharedStlFilePath); + return libs; + } + staticLibraries: { + var libs = ["gcc"]; + if (Android.ndk.hardFloat) + libs.push("m_hard"); + if (staticStlFilePath) + libs.push(staticStlFilePath); + return libs; + } + systemIncludePaths: { + var includes = []; + 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.buildProfile, "include")); + includes.push(FileInfo.joinPaths(gnuStlBaseDir, "include", "backward")); + } else if (Android.ndk.appStl.startsWith("c++_")) { + includes.push(FileInfo.joinPaths(llvmStlBaseDir, "libcxx", "include")); + includes.push(FileInfo.joinPaths(llvmStlBaseDir + "abi", "libcxxabi", "include")); + } + return includes; + } + defines: { + var list = ["ANDROID"]; + if (Android.ndk.hardFloat) + list.push("_NDK_MATH_NO_SOFTFP=1"); + return list; + } + sysroot: FileInfo.joinPaths(Android.ndk.ndkDir, "platforms", Android.ndk.platform, + "arch-" + NdkUtils.abiNameToDirName(Android.ndk.abi)) + + targetArch: { + switch (qbs.architecture) { + case "arm64": + return "aarch64"; + case "armv5": + case "armv5te": + return "armv5te"; + case "armv7a": + case "x86_64": + return qbs.architecture; + case "x86": + return "i686"; + case "mips": + case "mipsel": + return "mipsel"; + case "mips64": + case "mips64el": + return "mips64el"; + } + } + + targetVendor: "none" + targetSystem: "linux" + targetAbi: "android" + (["armeabi", "armeabi-v7a"].contains(Android.ndk.abi) ? "eabi" : "") + + Rule { + inputs: ["dynamiclibrary"] + outputFileTags: ["android.nativelibrary", "android.gdbserver-info", "android.stl-info"] + outputArtifacts: { + var artifacts = [{ + filePath: FileInfo.joinPaths("stripped-libs", + inputs["dynamiclibrary"][0].fileName), + fileTags: ["android.nativelibrary"] + }]; + if (product.moduleProperty("qbs", "buildVariant") === "debug") { + artifacts.push({ + filePath: "android.gdbserver-info.txt", + fileTags: ["android.gdbserver-info"] + }); + } + var stlFilePath = product.moduleProperty("cpp", "sharedStlFilePath"); + if (stlFilePath) + artifacts.push({filePath: "android.stl-info.txt", fileTags: ["android.stl-info"]}); + return artifacts; + } + + prepare: { + var stlFilePath = product.moduleProperty("cpp", "sharedStlFilePath"); + var copyCmd = new JavaScriptCommand(); + copyCmd.silent = true; + copyCmd.stlFilePath = stlFilePath; + copyCmd.sourceCode = function() { + File.copy(inputs["dynamiclibrary"][0].filePath, + outputs["android.nativelibrary"][0].filePath); + var arch = product.moduleProperty("Android.ndk", "abi"); + var destDir = FileInfo.joinPaths("lib", arch); + if (product.moduleProperty("qbs", "buildVariant") === "debug") { + arch = NdkUtils.abiNameToDirName(arch); + var srcPath = FileInfo.joinPaths( + product.moduleProperty("Android.ndk", "ndkDir"), + "prebuilt/android-" + arch, "gdbserver/gdbserver"); + var targetPath = FileInfo.joinPaths(destDir, + product.moduleProperty("Android.ndk", "gdbserverFileName")); + var infoFile = new TextFile(outputs["android.gdbserver-info"][0].filePath, + TextFile.WriteOnly); + infoFile.writeLine(srcPath); + infoFile.writeLine(targetPath); + infoFile.close(); + } + if (stlFilePath) { + var srcPath = stlFilePath; + var targetPath = FileInfo.joinPaths(destDir, FileInfo.fileName(srcPath)); + var infoFile = new TextFile(outputs["android.stl-info"][0].filePath, + TextFile.WriteOnly); + infoFile.writeLine(srcPath); + infoFile.writeLine(targetPath); + infoFile.close(); + } + } + var stripArgs = ["--strip-unneeded", outputs["android.nativelibrary"][0].filePath]; + if (stlFilePath) + stripArgs.push(stlFilePath); + var stripCmd = new Command(product.moduleProperty("cpp", "stripPath"), stripArgs); + stripCmd.description = "Stripping unneeded symbols from " + + outputs["android.nativelibrary"][0].fileName; + return [copyCmd, stripCmd]; + } + } + + validate: { + var baseValidator = new ModUtils.PropertyValidator("qbs"); + baseValidator.addCustomValidator("architecture", targetArch, function (value) { + return value !== undefined; + }, "unknown Android architecture '" + qbs.architecture + "'."); + + var validator = new ModUtils.PropertyValidator("cpp"); + validator.setRequiredProperty("targetArch", targetArch); + + return baseValidator.validate() && validator.validate(); + } +} |