summaryrefslogtreecommitdiff
path: root/xmake/core
diff options
context:
space:
mode:
Diffstat (limited to 'xmake/core')
-rw-r--r--xmake/core/package/package.lua45
-rw-r--r--xmake/core/platform/platform.lua48
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