diff options
| author | ruki <[email protected]> | 2016-01-14 09:19:14 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2016-01-14 09:19:14 +0800 |
| commit | cdcf953259aee5e7e1a06855ddbedbaabf585bc9 (patch) | |
| tree | 47b8e5de10522cca3b67354fa527b3525193e880 /xmake/core/platform/android | |
| parent | 8c50566e7ab2139b9f6c2976b9ce875b7ad11b7a (diff) | |
rename script directory to core
Diffstat (limited to 'xmake/core/platform/android')
| -rw-r--r-- | xmake/core/platform/android/android.lua | 120 | ||||
| -rw-r--r-- | xmake/core/platform/android/prober.lua | 269 |
2 files changed, 389 insertions, 0 deletions
diff --git a/xmake/core/platform/android/android.lua b/xmake/core/platform/android/android.lua new file mode 100644 index 000000000..15e3c33a2 --- /dev/null +++ b/xmake/core/platform/android/android.lua @@ -0,0 +1,120 @@ +--!The Automatic Cross-platform Build Tool +-- +-- XMake is free software; you can redistribute it and/or modify +-- it under the terms of the GNU Lesser General Public License as published by +-- the Free Software Foundation; either version 2.1 of the License, or +-- (at your option) any later version. +-- +-- XMake is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU Lesser General Public License for more details. +-- +-- You should have received a copy of the GNU Lesser General Public License +-- along with XMake; +-- If not, see <a href="http://www.gnu.org/licenses/"> http://www.gnu.org/licenses/</a> +-- +-- Copyright (C) 2009 - 2015, ruki All rights reserved. +-- +-- @author ruki +-- @file android.lua +-- + +-- define module: android +local android = android or {} + +-- load modules +local config = require("base/config") + +-- init host +android._HOST = xmake._HOST + +-- init os +android._OS = "android" + +-- init architectures +android._ARCHS = {"armv5te", "armv6", "armv7-a", "armv8-a", "arm64-v8a"} + +-- make configure +function android.make(configs) + + -- init the file formats + configs.formats = {} + configs.formats.static = {"lib", ".a"} + configs.formats.object = {"", ".o"} + configs.formats.shared = {"lib", ".so"} + + -- init the toolchains + configs.tools = {} + configs.tools.make = config.get("make") + configs.tools.ccache = config.get("__ccache") + configs.tools.cc = config.get("cc") + configs.tools.cxx = config.get("cxx") + configs.tools.as = config.get("as") + configs.tools.ld = config.get("ld") + configs.tools.ar = config.get("ar") + configs.tools.sh = config.get("sh") + configs.tools.ex = config.get("ar") + configs.tools.sc = config.get("sc") + + -- init flags + local arch = config.get("arch") + if arch:startswith("arm64") then + configs.cxflags = {} + configs.asflags = {} + configs.ldflags = {"-llog"} + configs.shflags = {"-llog"} + else + configs.cxflags = { "-march=" .. arch, "-mthumb"} + configs.asflags = { "-march=" .. arch, "-mthumb"} + configs.ldflags = { "-march=" .. arch, "-llog", "-mthumb"} + configs.shflags = { "-march=" .. arch, "-llog", "-mthumb"} + end + + -- add flags for the sdk directory of ndk + local ndk = config.get("ndk") + local ndk_sdkver = config.get("ndk_sdkver") + if ndk and ndk_sdkver then + local ndk_sdkdir = path.translate(string.format("%s/platforms/android-%d", ndk, ndk_sdkver)) + if arch:startswith("arm64") then + table.insert(configs.cxflags, string.format("--sysroot=%s/arch-arm64", ndk_sdkdir)) + table.insert(configs.asflags, string.format("--sysroot=%s/arch-arm64", ndk_sdkdir)) + table.insert(configs.ldflags, string.format("--sysroot=%s/arch-arm64", ndk_sdkdir)) + table.insert(configs.shflags, string.format("--sysroot=%s/arch-arm64", ndk_sdkdir)) + else + table.insert(configs.cxflags, string.format("--sysroot=%s/arch-arm", ndk_sdkdir)) + table.insert(configs.asflags, string.format("--sysroot=%s/arch-arm", ndk_sdkdir)) + table.insert(configs.ldflags, string.format("--sysroot=%s/arch-arm", ndk_sdkdir)) + table.insert(configs.shflags, string.format("--sysroot=%s/arch-arm", ndk_sdkdir)) + end + end + +end + +-- get the option menu for action: xmake config or global +function android.menu(action) + + -- init config option menu + android._MENU_CONFIG = android._MENU_CONFIG or + { {} + , {nil, "ndk", "kv", nil, "The NDK Directory" } + , {nil, "ndk_sdkver", "kv", "auto", "The SDK Version for NDK" } + , } + + -- init global option menu + android._MENU_GLOBAL = android._MENU_GLOBAL or + { {} + , {nil, "ndk", "kv", nil, "The NDK Directory" } + , {nil, "ndk_sdkver", "kv", "auto", "The SDK Version for NDK" } + , } + + -- get the option menu + if action == "config" then + return android._MENU_CONFIG + elseif action == "global" then + return android._MENU_GLOBAL + end +end + +-- return module: android +return android diff --git a/xmake/core/platform/android/prober.lua b/xmake/core/platform/android/prober.lua new file mode 100644 index 000000000..a6446e0e1 --- /dev/null +++ b/xmake/core/platform/android/prober.lua @@ -0,0 +1,269 @@ +--!The Automatic Cross-platform Build Tool +-- +-- XMake is free software; you can redistribute it and/or modify +-- it under the terms of the GNU Lesser General Public License as published by +-- the Free Software Foundation; either version 2.1 of the License, or +-- (at your option) any later version. +-- +-- XMake is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU Lesser General Public License for more details. +-- +-- You should have received a copy of the GNU Lesser General Public License +-- along with XMake; +-- If not, see <a href="http://www.gnu.org/licenses/"> http://www.gnu.org/licenses/</a> +-- +-- Copyright (C) 2009 - 2015, ruki All rights reserved. +-- +-- @author ruki +-- @file prober.lua +-- + +-- load modules +local os = require("base/os") +local path = require("base/path") +local utils = require("base/utils") +local string = require("base/string") +local tools = require("tools/tools") +local config = require("base/config") +local global = require("base/global") + +-- define module: prober +local prober = prober or {} + +-- probe the architecture +function prober._probe_arch(configs) + + -- get the architecture + local arch = configs.get("arch") + + -- ok? + if arch then return true end + + -- init the default architecture + configs.set("arch", "armv7-a") + + -- trace + utils.printf("checking for the architecture ... %s", configs.get("arch")) + + -- ok + return true +end + +-- probe the sdk version for ndk +function prober._probe_ndk_sdkver(configs) + + -- ok? + local ndk_sdkver = configs.get("ndk_sdkver") + if ndk_sdkver then return true end + + -- get the ndk + local ndk = configs.get("ndk") + if ndk then + + -- match all sdk directories + local sdkdirs = os.match(ndk .. "/platforms/android-*", true) + if sdkdirs then + + -- get the max version + local version_maxn = 0 + for _, sdkdir in ipairs(sdkdirs) do + local filename = path.filename(sdkdir) + local version, count = filename:gsub("android%-", "") + if count > 0 then + version = tonumber(version) + if version > version_maxn then version_maxn = version end + end + end + + -- save the version + if version_maxn > 0 then ndk_sdkver = version_maxn end + end + end + + -- probe ok? update it + if type(ndk_sdkver) == "number" and ndk_sdkver > 0 then + + -- save it + configs.set("ndk_sdkver", ndk_sdkver) + + -- trace + utils.printf("checking for the SDK version of NDK ... %s", string.format("android-%d", ndk_sdkver)) + else + + -- trace + utils.printf("checking for the SDK version of NDK ... no") + end + + -- ok + return true +end + +-- probe the make +function prober._probe_make(configs) + + -- ok? + local make = configs.get("make") + if make then return true end + + -- probe the make path + make = tools.probe("make", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) + + -- probe ok? update it + if make then configs.set("make", make) end + + -- trace + utils.printf("checking for the make ... %s", utils.ifelse(make, make, "no")) + + -- ok + return true +end + +-- probe the ccache +function prober._probe_ccache(configs) + + -- ok? + local ccache_enable = configs.get("ccache") + if ccache_enable and configs.get("__ccache") then return true end + + -- disable? + if type(ccache_enable) == "boolean" and not ccache_enable then + configs.set("__ccache", nil) + return true + end + + -- probe the ccache path + local ccache_path = tools.probe("ccache", {"/usr/bin", "/usr/local/bin", "/opt/bin", "/opt/local/bin"}) + + -- probe ok? update it + if ccache_path then + configs.set("ccache", true) + configs.set("__ccache", ccache_path) + else + configs.set("ccache", false) + end + + -- trace + utils.printf("checking for the ccache ... %s", utils.ifelse(ccache_path, ccache_path, "no")) + + -- ok + return true +end + +-- probe the toolchains +function prober._probe_toolpath(configs, kind, cross, name, description) + + -- check + assert(kind) + + -- get the cross + cross = configs.get("cross") or cross + + -- attempt to get it from the given cross toolchains + local toolpath = nil + local toolchains = configs.get("toolchains") + if toolchains then + toolpath = tools.probe(cross .. (configs.get(kind) or name), toolchains) + end + + -- attempt to get it directly from the configure + if not toolpath then + toolpath = configs.get(kind) + end + + -- attempt to get it from the ndk + if not toolpath then + local ndk = configs.get("ndk") + if ndk then + + -- match all toolchains + local arch = configs.get("arch") + if arch and arch:startswith("arm64") then + toolchains = os.match(string.format("%s/toolchains/aarch64-linux-android-**/prebuilt/*/bin/%s%s", ndk, cross, name)) + else + toolchains = os.match(string.format("%s/toolchains/arm-linux-androideabi-**/prebuilt/*/bin/%s%s", ndk, cross, name)) + end + + -- probe the tool path + if toolchains then + for _, filepath in ipairs(toolchains) do + toolpath = tools.probe(cross .. name, path.directory(filepath)) + if toolpath then break end + end + end + end + end + + -- probe ok? update it + if toolpath then configs.set(kind, toolpath) end + + -- trace + if toolpath then + utils.printf("checking for %s (%s) ... %s", description, kind, path.filename(toolpath)) + else + utils.printf("checking for %s (%s) ... no", description, kind) + end + + -- failed? + if not toolpath and not configs.get("ndk") then + utils.error("checking for the NDK directory ... no") + utils.error(" - xmake config --ndk=xxx") + utils.error("or - xmake global --ndk=xxx") + return false + end + + -- ok + return true +end + +-- probe the toolchains +function prober._probe_toolchains(configs) + + -- init prefix + local prefix = "arm-linux-androideabi-" + local arch = configs.get("arch") + if arch and arch:startswith("arm64") then + prefix = "aarch64-linux-android-" + end + + -- done + if not prober._probe_toolpath(configs, "cc", prefix, "gcc", "the c compiler") then return false end + if not prober._probe_toolpath(configs, "cxx", prefix, "g++", "the c++ compiler") then return false end + if not prober._probe_toolpath(configs, "as", prefix, "gcc", "the assember") then return false end + if not prober._probe_toolpath(configs, "ld", prefix, "g++", "the linker") then return false end + if not prober._probe_toolpath(configs, "ar", prefix, "ar", "the static library linker") then return false end + if not prober._probe_toolpath(configs, "sh", prefix, "g++", "the shared library linker") then return false end + if not prober._probe_toolpath(configs, "sc", prefix, "swiftc", "the swift compiler") then return false end + + -- ok + return true +end + +-- probe the project configure +function prober.config() + + -- call all probe functions + return utils.call( { prober._probe_arch + , prober._probe_make + , prober._probe_ccache + , prober._probe_ndk_sdkver + , prober._probe_toolchains} + , nil + , config) + +end + +-- probe the global configure +function prober.global() + + -- call all probe functions + return utils.call( { prober._probe_make + , prober._probe_ccache + , prober._probe_ndk_sdkver} + , nil + , global) +end + +-- return module: prober +return prober |
