diff options
Diffstat (limited to 'xmake/core')
| -rw-r--r-- | xmake/core/package/package.lua | 45 | ||||
| -rw-r--r-- | xmake/core/platform/platform.lua | 48 |
2 files changed, 59 insertions, 34 deletions
diff --git a/xmake/core/package/package.lua b/xmake/core/package/package.lua index 00ae72768..fe77bd999 100644 --- a/xmake/core/package/package.lua +++ b/xmake/core/package/package.lua @@ -166,8 +166,7 @@ function _instance:plat() if self._PLAT then return self._PLAT end - -- @note we uses os.host() instead of them for the binary package - if self:is_binary() then + if self:is_host() then return os.subhost() end local requireinfo = self:requireinfo() @@ -182,8 +181,7 @@ function _instance:arch() if self._ARCH then return self._ARCH end - -- @note we uses os.arch() instead of them for the binary package - if self:is_binary() then + if self:is_host() then return os.subarch() end return self:targetarch() @@ -668,6 +666,31 @@ function _instance:is_local() return self._IS_LOCAL or self:is_source_embed() or self:is_binary_embed() or self:is_thirdparty() end +-- is debug package? (deprecated) +function _instance:debug() + return self:is_debug() +end + +-- is host package? +-- +-- @note It is different from not is_cross() in that users do not use host packages directly, +-- they are usually used to build library packages. +function _instance:is_host() + local requireinfo = self:requireinfo() + if requireinfo and requireinfo.host then + return true + end + return self:is_binary() +end + +-- is cross-compilation? +function _instance:is_cross() + if self:is_host() then + return false + end + return is_cross(self:plat(), self:arch()) +end + -- mark it as local package function _instance:_mark_as_local(is_local) if self:is_local() ~= is_local then @@ -699,16 +722,6 @@ function _instance:use_external_includes() return external end --- is debug package? (deprecated) -function _instance:debug() - return self:is_debug() -end - --- is cross-compilation? -function _instance:is_cross() - return is_cross(self:plat(), self:arch()) -end - -- get the filelock of the whole package directory function _instance:filelock() local filelock = self._FILELOCK @@ -1267,7 +1280,7 @@ function _instance:tool(toolkind) local cachekey = "package_" .. tostring(self) return toolchain.tool(self:toolchains(), toolkind, {cachekey = cachekey, plat = self:plat(), arch = self:arch()}) else - return platform.tool(toolkind, self:plat(), self:arch()) + return platform.tool(toolkind, self:plat(), self:arch(), {host = self:is_host()}) end end @@ -1277,7 +1290,7 @@ function _instance:toolconfig(name) local cachekey = "package_" .. tostring(self) return toolchain.toolconfig(self:toolchains(), name, {cachekey = cachekey, plat = self:plat(), arch = self:arch()}) else - return platform.toolconfig(name, self:plat(), self:arch()) + return platform.toolconfig(name, self:plat(), self:arch(), {host = self:is_host()}) end end diff --git a/xmake/core/platform/platform.lua b/xmake/core/platform/platform.lua index 913d44691..1a8beb357 100644 --- a/xmake/core/platform/platform.lua +++ b/xmake/core/platform/platform.lua @@ -27,20 +27,22 @@ local os = require("base/os") local path = require("base/path") local utils = require("base/utils") local table = require("base/table") +local global = require("base/global") local interpreter = require("base/interpreter") local toolchain = require("tool/toolchain") local memcache = require("cache/memcache") local sandbox = require("sandbox/sandbox") local config = require("project/config") -local global = require("base/global") local scheduler = require("sandbox/modules/import/core/base/scheduler") -- new an instance -function _instance.new(name, arch, info) +function _instance.new(name, info, opt) + opt = opt or{} local instance = table.inherit(_instance) instance._NAME = name - instance._ARCH = arch instance._INFO = info + instance._ARCH = opt.arch + instance._IS_HOST = opt.host or false return instance end @@ -54,6 +56,11 @@ function _instance:_memcache() return cache end +-- the toolchains cache key for names +function _instance:_toolchains_key() + return "__toolchains_" .. self:name() .. "_" .. self:arch() .. (self:is_host() and "_host" or "") +end + -- get platform name function _instance:name() return self._NAME @@ -74,6 +81,11 @@ function _instance:arch_set(arch) end end +-- is host platform, it will use the host toolchain +function _instance:is_host() + return self._IS_HOST +end + -- set the value to the platform configuration function _instance:set(name, ...) self._INFO:apival_set(name, ...) @@ -157,11 +169,11 @@ function _instance:toolchains(opt) local names = nil toolchains = {} if not (opt and opt.all) then - names = config.get("__toolchains_" .. self:name() .. "_" .. self:arch()) + names = config.get(self:_toolchains_key()) end if not names then -- get the given toolchain - local toolchain_given = config.get("toolchain") + local toolchain_given = config.get(self:is_host() and "toolchain_host" or "toolchain") if toolchain_given then local toolchain_inst, errors = toolchain.load(toolchain_given, { plat = self:name(), arch = self:arch()}) @@ -276,7 +288,7 @@ function _instance:check() end -- save valid toolchains - config.set("__toolchains_" .. self:name() .. "_" .. self:arch(), toolchains_valid) + config.set(self:_toolchains_key(), toolchains_valid) self:_memcache():set("checked", true) scheduler.co_unlock(lockname) return true @@ -407,14 +419,16 @@ function platform.add_directories(...) end -- load the given platform -function platform.load(plat, arch) - - -- get platform name +function platform.load(plat, arch, opt) + opt = opt or {} plat = plat or config.get("plat") or os.host() arch = arch or config.get("arch") or os.arch() -- get cache key local cachekey = plat .. "_" .. arch + if opt.host then + cachekey = cachekey .. "_host" + end -- get it directly from cache dirst platform._PLATFORMS = platform._PLATFORMS or {} @@ -425,8 +439,6 @@ function platform.load(plat, arch) -- find the platform script path local scriptpath = nil for _, dir in ipairs(platform.directories()) do - - -- find this directory scriptpath = path.join(dir, plat, "xmake.lua") if os.isfile(scriptpath) then break @@ -469,14 +481,14 @@ function platform.load(plat, arch) end -- save instance to the cache - local instance = _instance.new(plat, arch, result) + local instance = _instance.new(plat, result, {arch = arch, host = opt.host}) platform._PLATFORMS[cachekey] = instance return instance end -- get the given platform configuration -function platform.get(name, plat, arch) - local instance, errors = platform.load(plat, arch) +function platform.get(name, plat, arch, opt) + local instance, errors = platform.load(plat, arch, opt) if instance then return instance:get(name) else @@ -488,8 +500,8 @@ end -- -- e.g. cc, cxx, mm, mxx, as, ar, ld, sh, .. -- -function platform.tool(toolkind, plat, arch) - local instance, errors = platform.load(plat, arch) +function platform.tool(toolkind, plat, arch, opt) + local instance, errors = platform.load(plat, arch, opt) if instance then return instance:tool(toolkind) else @@ -498,8 +510,8 @@ function platform.tool(toolkind, plat, arch) end -- get the given tool configuration -function platform.toolconfig(name, plat, arch) - local instance, errors = platform.load(plat, arch) +function platform.toolconfig(name, plat, arch, opt) + local instance, errors = platform.load(plat, arch, opt) if instance then return instance:toolconfig(name) else |
