diff options
| author | ruki <[email protected]> | 2015-12-09 10:02:45 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2015-12-09 10:02:45 +0800 |
| commit | caeedfebaed4de91afb0c66ef1706164dad79da6 (patch) | |
| tree | 4b8074e6ba5a30a25726d4451f0eff35f53cc327 | |
| parent | 5023cb209d1d9104b1a4ad4e99836a3c24b5302c (diff) | |
add watchos and watchsimulator platform for ios
| -rw-r--r-- | xmake/scripts/platform/iphoneos/iphoneos.lua | 6 | ||||
| -rw-r--r-- | xmake/scripts/platform/iphonesimulator/prober.lua | 2 | ||||
| -rw-r--r-- | xmake/scripts/platform/watchos/package.lua | 76 | ||||
| -rw-r--r-- | xmake/scripts/platform/watchos/prober.lua | 294 | ||||
| -rw-r--r-- | xmake/scripts/platform/watchos/watchos.lua | 144 | ||||
| -rw-r--r-- | xmake/scripts/platform/watchsimulator/prober.lua | 292 | ||||
| -rw-r--r-- | xmake/scripts/platform/watchsimulator/watchsimulator.lua | 141 |
7 files changed, 951 insertions, 4 deletions
diff --git a/xmake/scripts/platform/iphoneos/iphoneos.lua b/xmake/scripts/platform/iphoneos/iphoneos.lua index 0dbd891a8..cc085d66d 100644 --- a/xmake/scripts/platform/iphoneos/iphoneos.lua +++ b/xmake/scripts/platform/iphoneos/iphoneos.lua @@ -68,9 +68,9 @@ function iphoneos.make(configs) local archflags = nil local arch = config.get("arch") if arch then archflags = "-arch " .. arch end - configs.cxflags = { archflags, "-mios-simulator-version-min=" .. target_minver } - configs.mxflags = { archflags, "-mios-simulator-version-min=" .. target_minver } - configs.asflags = { archflags, "-mios-simulator-version-min=" .. target_minver } + configs.cxflags = { archflags, "-miphoneos-version-min=" .. target_minver } + configs.mxflags = { archflags, "-miphoneos-version-min=" .. target_minver } + configs.asflags = { archflags, "-miphoneos-version-min=" .. target_minver } configs.ldflags = { archflags, "-ObjC", "-lstdc++", "-fobjc-link-runtime", "-miphoneos-version-min=" .. target_minver } configs.shflags = { archflags, "-ObjC", "-lstdc++", "-fobjc-link-runtime", "-miphoneos-version-min=" .. target_minver } if arch then diff --git a/xmake/scripts/platform/iphonesimulator/prober.lua b/xmake/scripts/platform/iphonesimulator/prober.lua index 90b64cb4f..3683b9c57 100644 --- a/xmake/scripts/platform/iphonesimulator/prober.lua +++ b/xmake/scripts/platform/iphonesimulator/prober.lua @@ -111,7 +111,7 @@ function prober._probe_xcode_sdkver(configs) -- attempt to match the directory if not xcode_sdkver then - local dirs = os.match(configs.get("xcode_dir") .. "/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS*.sdk", true) + local dirs = os.match(configs.get("xcode_dir") .. "/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator*.sdk", true) if dirs then for _, dir in ipairs(dirs) do xcode_sdkver = string.match(dir, "%d+%.%d+") diff --git a/xmake/scripts/platform/watchos/package.lua b/xmake/scripts/platform/watchos/package.lua new file mode 100644 index 000000000..1e46ddadc --- /dev/null +++ b/xmake/scripts/platform/watchos/package.lua @@ -0,0 +1,76 @@ +--!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 package.lua +-- + +-- define module: package +local package = package or {} + +-- load modules +local os = require("base/os") +local path = require("base/path") +local rule = require("base/rule") +local utils = require("base/utils") +local string = require("base/string") +local platform = require("platform/platform") + +-- package target +function package.main(target) + + -- check + assert(target and target.name) + + -- the count of architectures + local count = 0 + for _, _ in pairs(target.archs) do count = count + 1 end + if count < 2 then return 0 end + + -- get the lipo tool + local lipo = platform.tool("lipo") + if not lipo then return 0 end + + -- make universal info + local universal = {} + universal.targetdir = rule.backupdir(target.name, "universal") + universal.targetfile = rule.targetfile(target.name, target) + if not universal.targetdir or not universal.targetfile then return 0 end + + -- make the universal directory + os.mkdir(path.directory(string.format("%s/%s", universal.targetdir, universal.targetfile))) + + -- make the lipo command + local cmd = lipo .. " -create" + for arch, info in pairs(target.archs) do + cmd = string.format("%s -arch %s %s/%s", cmd, arch, info.targetdir, info.targetfile) + end + cmd = string.format("%s -output %s/%s", cmd, universal.targetdir, universal.targetfile) + + -- make the universal target + if 0 ~= os.execute(cmd) then return 0 end + + -- ok + target.archs.universal = universal + + -- continue + return 0 +end + +-- return module: package +return package diff --git a/xmake/scripts/platform/watchos/prober.lua b/xmake/scripts/platform/watchos/prober.lua new file mode 100644 index 000000000..8428909c4 --- /dev/null +++ b/xmake/scripts/platform/watchos/prober.lua @@ -0,0 +1,294 @@ +--!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") + + -- trace + utils.verbose("checking for the architecture ... %s", configs.get("arch")) + + -- ok + return true +end + +-- probe the xcode application directory +function prober._probe_xcode(configs) + + -- get the xcode directory + local xcode_dir = configs.get("xcode_dir") + + -- ok? + if xcode_dir then return true end + + -- clear it first + xcode_dir = nil + + -- attempt to get the default directory + if not xcode_dir then + if os.isdir("/Applications/Xcode.app") then + xcode_dir = "/Applications/Xcode.app" + end + end + + -- attempt to match the other directories + if not xcode_dir then + local dirs = os.match("/Applications/Xcode*.app", true) + if dirs and table.getn(dirs) ~= 0 then + xcode_dir = dirs[1] + end + end + + -- probe ok? update it + if xcode_dir then + -- save it + configs.set("xcode_dir", xcode_dir) + + -- trace + utils.verbose("checking for the Xcode application directory ... %s", xcode_dir) + else + -- failed + utils.error("checking for the Xcode application directory ... no") + utils.error(" - xmake config --xcode_dir=xxx") + utils.error("or - xmake global --xcode_dir=xxx") + return false + end + + -- ok + return true +end + +-- probe the xcode sdk version +function prober._probe_xcode_sdkver(configs) + + -- get the xcode sdk version + local xcode_sdkver = configs.get("xcode_sdkver") + + -- ok? + if xcode_sdkver then return true end + + -- clear it first + xcode_sdkver = nil + + -- attempt to match the directory + if not xcode_sdkver then + local dirs = os.match(configs.get("xcode_dir") .. "/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS*.sdk", true) + if dirs then + for _, dir in ipairs(dirs) do + xcode_sdkver = string.match(dir, "%d+%.%d+") + if xcode_sdkver then break end + end + end + end + + -- probe ok? update it + if xcode_sdkver then + + -- save it + configs.set("xcode_sdkver", xcode_sdkver) + + -- trace + utils.verbose("checking for the Xcode SDK version for %s ... %s", configs.get("plat"), xcode_sdkver) + else + -- failed + utils.error("checking for the Xcode SDK version for %s ... no", configs.get("plat")) + utils.error(" - xmake config --xcode_sdkver=xxx") + utils.error("or - xmake global --xcode_sdkver=xxx") + return false + end + + -- ok + return true +end + +-- probe the target minimal version +function prober._probe_target_minver(configs) + + -- get the target minimal version + local target_minver = configs.get("target_minver") + + -- ok? + if target_minver then return true end + + -- init the default target minimal version + configs.set("target_minver", "7.0") + + -- trace + utils.verbose("checking for the target minimal version ... %s", configs.get("target_minver")) + + -- 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.verbose("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.verbose("checking for the ccache ... %s", utils.ifelse(ccache_path, ccache_path, "no")) + + -- ok + return true +end + +-- probe the tool path +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 run it directly + if not toolpath then + toolpath = tools.probe(cross .. name) + end + + -- probe ok? update it + if toolpath then configs.set(kind, toolpath) end + + -- trace + utils.verbose("checking for %s (%s) ... %s", description, kind, utils.ifelse(toolpath, path.filename(toolpath), "no")) + + -- ok + return true +end + +-- probe the toolchains +function prober._probe_toolchains(configs) + + -- done + if not prober._probe_toolpath(configs, "cc", "xcrun -sdk watchos ", "clang", "the c compiler") then return false end + if not prober._probe_toolpath(configs, "cxx", "xcrun -sdk watchos ", "clang++", "the c++ compiler") then return false end + if not prober._probe_toolpath(configs, "mm", "xcrun -sdk watchos ", "clang", "the objc compiler") then return false end + if not prober._probe_toolpath(configs, "mxx", "xcrun -sdk watchos ", "clang++", "the objc++ compiler") then return false end + if not prober._probe_toolpath(configs, "as", xmake._SCRIPTS_DIR .. "/tools/gas-preprocessor.pl xcrun -sdk watchos ", "clang", "the assember") then return false end + if not prober._probe_toolpath(configs, "ld", "xcrun -sdk watchos ", "clang++", "the linker") then return false end + if not prober._probe_toolpath(configs, "ar", "xcrun -sdk watchos ", "ar", "the static library linker") then return false end + if not prober._probe_toolpath(configs, "sh", "xcrun -sdk watchos ", "clang++", "the shared library linker") then return false end + if not prober._probe_toolpath(configs, "sc", "xcrun -sdk watchos ", "swiftc", "the swift compiler") then return false end + if not prober._probe_toolpath(configs, "lipo", "xcrun -sdk watchos ", "lipo", "the universal files creater") then return false end + return true +end + +-- probe the project configure +function prober.config() + + -- call all probe functions + return utils.call( { prober._probe_arch + , prober._probe_xcode + , prober._probe_xcode_sdkver + , prober._probe_target_minver + , prober._probe_make + , prober._probe_ccache + , prober._probe_toolchains} + , nil + , config) + +end + +-- probe the global configure +function prober.global() + + -- call all probe functions + return utils.call( { prober._probe_xcode + , prober._probe_make + , prober._probe_ccache} + , nil + , global) +end + +-- return module: prober +return prober diff --git a/xmake/scripts/platform/watchos/watchos.lua b/xmake/scripts/platform/watchos/watchos.lua new file mode 100644 index 000000000..9a5f61d45 --- /dev/null +++ b/xmake/scripts/platform/watchos/watchos.lua @@ -0,0 +1,144 @@ +--!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 watchos.lua +-- + +-- define module: watchos +local watchos = watchos or {} + +-- load modules +local config = require("base/config") + +-- init host +watchos._HOST = "macosx" + +-- init os +watchos._OS = "ios" + +-- init architectures +watchos._ARCHS = {"armv7", "armv7s", "arm64"} + +-- make configure +function watchos.make(configs) + + -- init the file formats + configs.formats = {} + configs.formats.static = {"lib", ".a"} + configs.formats.object = {"", ".o"} + configs.formats.shared = {"lib", ".dylib"} + + -- 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.mm = config.get("mm") + configs.tools.mxx = config.get("mxx") + 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") + configs.tools.lipo = config.get("lipo") + + -- init target minimal version + local target_minver = config.get("target_minver") + assert(target_minver) + + -- init flags for architecture + local archflags = nil + local arch = config.get("arch") + if arch then archflags = "-arch " .. arch end + configs.cxflags = { archflags, "-mwatchos-version-min=" .. target_minver } + configs.mxflags = { archflags, "-mwatchos-version-min=" .. target_minver } + configs.asflags = { archflags, "-mwatchos-version-min=" .. target_minver } + configs.ldflags = { archflags, "-ObjC", "-lstdc++", "-fobjc-link-runtime", "-mwatchos-version-min=" .. target_minver } + configs.shflags = { archflags, "-ObjC", "-lstdc++", "-fobjc-link-runtime", "-mwatchos-version-min=" .. target_minver } + if arch then + configs.scflags = { string.format("-target %s-apple-ios%s", arch, target_minver) } + end + + -- init flags for the xcode sdk directory + local xcode_dir = config.get("xcode_dir") + local xcode_sdkver = config.get("xcode_sdkver") + if xcode_dir and xcode_sdkver then + + -- init flags + local xcode_sdkdir = xcode_dir .. "/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS" .. xcode_sdkver .. ".sdk" + table.insert(configs.cxflags, "-isysroot " .. xcode_sdkdir) + table.insert(configs.asflags, "-isysroot " .. xcode_sdkdir) + table.insert(configs.mxflags, "-isysroot " .. xcode_sdkdir) + table.insert(configs.ldflags, "-isysroot " .. xcode_sdkdir) + table.insert(configs.shflags, "-isysroot " .. xcode_sdkdir) + table.insert(configs.scflags, "-sdk " .. xcode_sdkdir) + + -- save swift link directory + config.set("__swift_linkdirs", xcode_dir .. "/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/watchos") + end + +end + +-- get the option menu for action: xmake config or global +function watchos.menu(action) + + -- init config option menu + watchos._MENU_CONFIG = watchos._MENU_CONFIG or + { {} + , {nil, "mm", "kv", nil, "The Objc Compiler" } + , {nil, "mxx", "kv", nil, "The Objc++ Compiler" } + , {nil, "mflags", "kv", nil, "The Objc Compiler Flags" } + , {nil, "mxflags", "kv", nil, "The Objc/c++ Compiler Flags" } + , {nil, "mxxflags", "kv", nil, "The Objc++ Compiler Flags" } + , {} + , {nil, "sc", "kv", nil, "The Swift Compiler" } + , {nil, "scflags", "kv", nil, "The Swift Compiler Flags" } + , {} + , {nil, "xcode_dir", "kv", "auto", "The Xcode Application Directory" } + , {nil, "xcode_sdkver", "kv", "auto", "The SDK Version for Xcode" } + , {nil, "target_minver", "kv", "auto", "The Target Minimal Version" } + , {} + , {nil, "mobileprovision","kv", "auto", "The Provisioning Profile File" } + , {nil, "codesign", "kv", "auto", "The Code Signing Indentity" } + , {nil, "entitlements", "kv", "auto", "The Code Signing Entitlements" } + , } + + -- init global option menu + watchos._MENU_GLOBAL = watchos._MENU_GLOBAL or + { {} + , {nil, "xcode_dir", "kv", "auto", "The Xcode Application Directory" } + , {} + , {nil, "mobileprovision","kv", "auto", "The Provisioning Profile File" } + , {nil, "codesign", "kv", "auto", "The Code Signing Indentity" } + , {nil, "entitlements", "kv", "auto", "The Code Signing Entitlements" } + , } + + -- get the option menu + if action == "config" then + return watchos._MENU_CONFIG + elseif action == "global" then + return watchos._MENU_GLOBAL + end +end + + +-- return module: watchos +return watchos diff --git a/xmake/scripts/platform/watchsimulator/prober.lua b/xmake/scripts/platform/watchsimulator/prober.lua new file mode 100644 index 000000000..29564edf1 --- /dev/null +++ b/xmake/scripts/platform/watchsimulator/prober.lua @@ -0,0 +1,292 @@ +--!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", "x86_64") + + -- trace + utils.verbose("checking for the architecture ... %s", configs.get("arch")) + + -- ok + return true +end + +-- probe the xcode application directory +function prober._probe_xcode(configs) + + -- get the xcode directory + local xcode_dir = configs.get("xcode_dir") + + -- ok? + if xcode_dir then return true end + + -- clear it first + xcode_dir = nil + + -- attempt to get the default directory + if not xcode_dir then + if os.isdir("/Applications/Xcode.app") then + xcode_dir = "/Applications/Xcode.app" + end + end + + -- attempt to match the other directories + if not xcode_dir then + local dirs = os.match("/Applications/Xcode*.app", true) + if dirs and table.getn(dirs) ~= 0 then + xcode_dir = dirs[1] + end + end + + -- probe ok? update it + if xcode_dir then + -- save it + configs.set("xcode_dir", xcode_dir) + + -- trace + utils.verbose("checking for the Xcode application directory ... %s", xcode_dir) + else + -- failed + utils.error("checking for the Xcode application directory ... no") + utils.error(" - xmake config --xcode_dir=xxx") + utils.error("or - xmake global --xcode_dir=xxx") + return false + end + + -- ok + return true +end + +-- probe the xcode sdk version +function prober._probe_xcode_sdkver(configs) + + -- get the xcode sdk version + local xcode_sdkver = configs.get("xcode_sdkver") + + -- ok? + if xcode_sdkver then return true end + + -- clear it first + xcode_sdkver = nil + + -- attempt to match the directory + if not xcode_sdkver then + local dirs = os.match(configs.get("xcode_dir") .. "/Contents/Developer/Platforms/WatchSimulator.platform/Developer/SDKs/WatchSimulator*.sdk", true) + if dirs then + for _, dir in ipairs(dirs) do + xcode_sdkver = string.match(dir, "%d+%.%d+") + if xcode_sdkver then break end + end + end + end + + -- probe ok? update it + if xcode_sdkver then + + -- save it + configs.set("xcode_sdkver", xcode_sdkver) + + -- trace + utils.verbose("checking for the Xcode SDK version for %s ... %s", configs.get("plat"), xcode_sdkver) + else + -- failed + utils.error("checking for the Xcode SDK version for %s ... no", configs.get("plat")) + utils.error(" - xmake config --xcode_sdkver=xxx") + utils.error("or - xmake global --xcode_sdkver=xxx") + return false + end + + -- ok + return true +end + +-- probe the target minimal version +function prober._probe_target_minver(configs) + + -- get the target minimal version + local target_minver = configs.get("target_minver") + + -- ok? + if target_minver then return true end + + -- init the default target minimal version + configs.set("target_minver", "7.0") + + -- trace + utils.verbose("checking for the target minimal version ... %s", configs.get("target_minver")) + + -- 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.verbose("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.verbose("checking for the ccache ... %s", utils.ifelse(ccache_path, ccache_path, "no")) + + -- ok + return true +end + +-- probe the tool path +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 run it directly + if not toolpath then + toolpath = tools.probe(cross .. name) + end + + -- probe ok? update it + if toolpath then configs.set(kind, toolpath) end + + -- trace + utils.verbose("checking for %s (%s) ... %s", description, kind, utils.ifelse(toolpath, path.filename(toolpath), "no")) + + -- ok + return true +end + +-- probe the toolchains +function prober._probe_toolchains(configs) + + -- done + if not prober._probe_toolpath(configs, "cc", "xcrun -sdk watchsimulator ", "clang", "the c compiler") then return false end + if not prober._probe_toolpath(configs, "cxx", "xcrun -sdk watchsimulator ", "clang++", "the c++ compiler") then return false end + if not prober._probe_toolpath(configs, "mm", "xcrun -sdk watchsimulator ", "clang", "the objc compiler") then return false end + if not prober._probe_toolpath(configs, "mxx", "xcrun -sdk watchsimulator ", "clang++", "the objc++ compiler") then return false end + if not prober._probe_toolpath(configs, "as", "xcrun -sdk watchsimulator ", "clang", "the assember") then return false end + if not prober._probe_toolpath(configs, "ld", "xcrun -sdk watchsimulator ", "clang++", "the linker") then return false end + if not prober._probe_toolpath(configs, "ar", "xcrun -sdk watchsimulator ", "ar", "the static library linker") then return false end + if not prober._probe_toolpath(configs, "sh", "xcrun -sdk watchsimulator ", "clang++", "the shared library linker") then return false end + if not prober._probe_toolpath(configs, "sc", "xcrun -sdk watchsimulator ", "swiftc", "the swift compiler") then return false end + return true +end + +-- probe the project configure +function prober.config() + + -- call all probe functions + return utils.call( { prober._probe_arch + , prober._probe_xcode + , prober._probe_xcode_sdkver + , prober._probe_target_minver + , prober._probe_make + , prober._probe_ccache + , prober._probe_toolchains} + , nil + , config) +end + +-- probe the global configure +function prober.global() + + -- call all probe functions + return utils.call( { prober._probe_xcode + , prober._probe_make + , prober._probe_ccache} + , nil + , global) +end + +-- return module: prober +return prober diff --git a/xmake/scripts/platform/watchsimulator/watchsimulator.lua b/xmake/scripts/platform/watchsimulator/watchsimulator.lua new file mode 100644 index 000000000..a216e811e --- /dev/null +++ b/xmake/scripts/platform/watchsimulator/watchsimulator.lua @@ -0,0 +1,141 @@ +--!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 watchsimulator.lua +-- + +-- define module: watchsimulator +local watchsimulator = watchsimulator or {} + +-- load modules +local config = require("base/config") + +-- init host +watchsimulator._HOST = "macosx" + +-- init os +watchsimulator._OS = "ios" + +-- init architectures +watchsimulator._ARCHS = {"i386", "x86_64"} + +-- make configure +function watchsimulator.make(configs) + + -- init the file formats + configs.formats = {} + configs.formats.static = {"lib", ".a"} + configs.formats.object = {"", ".o"} + configs.formats.shared = {"lib", ".dylib"} + + -- 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.mm = config.get("mm") + configs.tools.mxx = config.get("mxx") + 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 target minimal version + local target_minver = config.get("target_minver") + assert(target_minver) + + -- init flags for architecture + local archflags = nil + local arch = config.get("arch") + if arch then archflags = "-arch " .. arch end + configs.cxflags = { archflags, "-mios-simulator-version-min=" .. target_minver } + configs.mxflags = { archflags, "-mios-simulator-version-min=" .. target_minver } + configs.asflags = { archflags, "-mios-simulator-version-min=" .. target_minver } + configs.ldflags = { archflags, "-Xlinker -objc_abi_version", "-Xlinker 2 -stdlib=libc++", "-Xlinker -no_implicit_dylibs", "-fobjc-link-runtime", "-mios-simulator-version-min=" .. target_minver } + configs.shflags = { archflags, "-Xlinker -objc_abi_version", "-Xlinker 2 -stdlib=libc++", "-Xlinker -no_implicit_dylibs", "-fobjc-link-runtime", "-mios-simulator-version-min=" .. target_minver } + if arch then + configs.scflags = { string.format("-target %s-apple-ios%s", arch, target_minver) } + end + + -- init flags for the xcode sdk directory + local xcode_dir = config.get("xcode_dir") + local xcode_sdkver = config.get("xcode_sdkver") + if xcode_dir and xcode_sdkver then + + -- init flags + local xcode_sdkdir = xcode_dir .. "/Contents/Developer/Platforms/WatchSimulator.platform/Developer/SDKs/WatchSimulator" .. xcode_sdkver .. ".sdk" + table.insert(configs.cxflags, "-isysroot " .. xcode_sdkdir) + table.insert(configs.asflags, "-isysroot " .. xcode_sdkdir) + table.insert(configs.mxflags, "-isysroot " .. xcode_sdkdir) + table.insert(configs.ldflags, "-isysroot " .. xcode_sdkdir) + table.insert(configs.shflags, "-isysroot " .. xcode_sdkdir) + table.insert(configs.scflags, "-sdk " .. xcode_sdkdir) + + -- save swift link directory + config.set("__swift_linkdirs", xcode_dir .. "/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/watchsimulator") + end +end + +-- get the option menu for action: xmake config or global +function watchsimulator.menu(action) + + -- init config option menu + watchsimulator._MENU_CONFIG = watchsimulator._MENU_CONFIG or + { {} + , {nil, "mm", "kv", nil, "The Objc Compiler" } + , {nil, "mxx", "kv", nil, "The Objc++ Compiler" } + , {nil, "mflags", "kv", nil, "The Objc Compiler Flags" } + , {nil, "mxflags", "kv", nil, "The Objc/c++ Compiler Flags" } + , {nil, "mxxflags", "kv", nil, "The Objc++ Compiler Flags" } + , {} + , {nil, "sc", "kv", nil, "The Swift Compiler" } + , {nil, "scflags", "kv", nil, "The Swift Compiler Flags" } + , {} + , {nil, "xcode_dir", "kv", "auto", "The Xcode Application Directory" } + , {nil, "xcode_sdkver", "kv", "auto", "The SDK Version for Xcode" } + , {nil, "target_minver", "kv", "auto", "The Target Minimal Version" } + , {} + , {nil, "mobileprovision","kv", "auto", "The Provisioning Profile File" } + , {nil, "codesign", "kv", "auto", "The Code Signing Indentity" } + , {nil, "entitlements", "kv", "auto", "The Code Signing Entitlements" } + , } + + -- init global option menu + watchsimulator._MENU_GLOBAL = watchsimulator._MENU_GLOBAL or + { {} + , {nil, "xcode_dir", "kv", "auto", "The Xcode Application Directory" } + , {} + , {nil, "mobileprovision","kv", "auto", "The Provisioning Profile File" } + , {nil, "codesign", "kv", "auto", "The Code Signing Indentity" } + , {nil, "entitlements", "kv", "auto", "The Code Signing Entitlements" } + , } + + -- get the option menu + if action == "config" then + return watchsimulator._MENU_CONFIG + elseif action == "global" then + return watchsimulator._MENU_GLOBAL + end +end + + +-- return module: watchsimulator +return watchsimulator |
