summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2015-12-09 10:02:45 +0800
committerruki <[email protected]>2015-12-09 10:02:45 +0800
commitcaeedfebaed4de91afb0c66ef1706164dad79da6 (patch)
tree4b8074e6ba5a30a25726d4451f0eff35f53cc327
parent5023cb209d1d9104b1a4ad4e99836a3c24b5302c (diff)
add watchos and watchsimulator platform for ios
-rw-r--r--xmake/scripts/platform/iphoneos/iphoneos.lua6
-rw-r--r--xmake/scripts/platform/iphonesimulator/prober.lua2
-rw-r--r--xmake/scripts/platform/watchos/package.lua76
-rw-r--r--xmake/scripts/platform/watchos/prober.lua294
-rw-r--r--xmake/scripts/platform/watchos/watchos.lua144
-rw-r--r--xmake/scripts/platform/watchsimulator/prober.lua292
-rw-r--r--xmake/scripts/platform/watchsimulator/watchsimulator.lua141
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