summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2021-03-27 19:54:04 +0800
committerGitHub <[email protected]>2021-03-27 19:54:04 +0800
commitfb14f73e5def17223e143840743e33b490fe6a48 (patch)
tree706990c621416306bf54100c6cd387bfd3d89e07
parent3eec448a822427939b5af22ed96bebce0c7c506f (diff)
parent313274ab5e9d3dce17460a832a966e2383f6ec4a (diff)
Merge pull request #1308 from xmake-io/linkdeps
Improve linkdeps for package
-rw-r--r--xmake/core/package/package.lua35
-rw-r--r--xmake/modules/private/action/require/impl/actions/install.lua2
-rw-r--r--xmake/modules/private/action/require/impl/package.lua33
3 files changed, 41 insertions, 29 deletions
diff --git a/xmake/core/package/package.lua b/xmake/core/package/package.lua
index 7438896b7..fd9ef0d6c 100644
--- a/xmake/core/package/package.lua
+++ b/xmake/core/package/package.lua
@@ -252,6 +252,11 @@ function _instance:orderdeps()
return self._ORDERDEPS
end
+-- get link deps
+function _instance:linkdeps()
+ return self._LINKDEPS
+end
+
-- get parents
function _instance:parents()
return self._PARENTS
@@ -1223,26 +1228,24 @@ function _instance:exists()
return self._FETCHINFO ~= nil
end
--- fetch all local info with dependencies
-function _instance:fetchdeps()
+-- fetch link info of dependencies
+function _instance:fetch_linkdeps()
local fetchinfo = self:fetch()
if not fetchinfo then
return
end
fetchinfo = table.copy(fetchinfo) -- avoid the cached fetchinfo be modified
- local orderdeps = self:orderdeps()
- if orderdeps then
- local total = #orderdeps
- for idx, _ in ipairs(orderdeps) do
- local dep = orderdeps[total + 1 - idx]
- if dep:is_library() then
- local depinfo = dep:fetch()
- if depinfo then
- for name, values in pairs(depinfo) do
- if name ~= "license" and name ~= "version" then
- fetchinfo[name] = table.wrap(fetchinfo[name])
- table.join2(fetchinfo[name], values)
- end
+ local linkdeps = self:linkdeps()
+ if linkdeps then
+ local total = #linkdeps
+ for idx, _ in ipairs(linkdeps) do
+ local dep = linkdeps[total + 1 - idx]
+ local depinfo = dep:fetch()
+ if depinfo then
+ for name, values in pairs(depinfo) do
+ if name ~= "license" and name ~= "version" then
+ fetchinfo[name] = table.wrap(fetchinfo[name])
+ table.join2(fetchinfo[name], values)
end
end
end
@@ -1346,7 +1349,7 @@ end
-- generate building configs for has_xxx/check_xxx
function _instance:_generate_build_configs(configs)
- configs = table.join(self:fetchdeps(), configs)
+ configs = table.join(self:fetch_linkdeps(), configs)
if self:is_plat("windows") then
local ld = self:build_getenv("ld")
local vs_runtime = self:config("vs_runtime")
diff --git a/xmake/modules/private/action/require/impl/actions/install.lua b/xmake/modules/private/action/require/impl/actions/install.lua
index c059a6e86..752b80725 100644
--- a/xmake/modules/private/action/require/impl/actions/install.lua
+++ b/xmake/modules/private/action/require/impl/actions/install.lua
@@ -48,7 +48,7 @@ function _patch_pkgconfig(package)
vprint("patching %s ..", pcfile)
-- fetch package
- local fetchinfo = package:fetchdeps()
+ local fetchinfo = package:fetch_linkdeps()
if not fetchinfo then
return
end
diff --git a/xmake/modules/private/action/require/impl/package.lua b/xmake/modules/private/action/require/impl/package.lua
index cc6d43afd..7688fb283 100644
--- a/xmake/modules/private/action/require/impl/package.lua
+++ b/xmake/modules/private/action/require/impl/package.lua
@@ -74,7 +74,7 @@ end
-- false: only get local packages
--
--
-function _parse_require(require_str, requires_extra, parentinfo)
+function _parse_require(require_str)
-- split package and version info
local splitinfo = require_str:split('%s+')
@@ -109,11 +109,7 @@ function _parse_require(require_str, requires_extra, parentinfo)
-- get repository name, package name and package url
local pos = packageinfo:lastof('@', true)
if pos then
-
- -- get package name
packagename = packageinfo:sub(pos + 1)
-
- -- get reponame
reponame = packageinfo:sub(1, pos - 1)
else
packagename = packageinfo
@@ -122,6 +118,14 @@ function _parse_require(require_str, requires_extra, parentinfo)
-- check package name
assert(packagename, "require(\"%s\"): the package name not found!", require_str)
+ return packagename, version, reponame
+end
+
+-- load require info
+function _load_require(require_str, requires_extra, parentinfo)
+
+ -- parse require
+ local packagename, version, reponame = _parse_require(require_str)
-- get require extra
local require_extra = {}
@@ -195,14 +199,18 @@ end
--
-- orderdeps: c -> b -> a
--
-function _sort_packagedeps(package)
+function _sort_packagedeps(package, onlylink)
+ -- we must use native deps list instead of package:deps() to generate correct linkdeps
local orderdeps = {}
- local deps = package:deps()
+ local deps = package:get("deps")
if deps then
- for _, depname in ipairs(table.orderkeys(deps)) do
- local dep = deps[depname]
- table.join2(orderdeps, _sort_packagedeps(dep))
- table.insert(orderdeps, dep)
+ for _, depname in ipairs(deps) do
+ local packagename = _parse_require(depname)
+ local dep = package:dep(packagename)
+ if dep and (onlylink ~= true or dep:is_library()) then
+ table.join2(orderdeps, _sort_packagedeps(dep, onlylink))
+ table.insert(orderdeps, dep)
+ end
end
end
return orderdeps
@@ -654,6 +662,7 @@ function _load_packages(requires, opt)
end
package._DEPS = packagedeps
package._ORDERDEPS = table.unique(_sort_packagedeps(package))
+ package._LINKDEPS = table.unique(_sort_packagedeps(package, true))
end
end
@@ -674,7 +683,7 @@ function load_requires(requires, requires_extra, opt)
opt = opt or {}
local requireitems = {}
for _, require_str in ipairs(requires) do
- local packagename, requireinfo = _parse_require(require_str, requires_extra, opt.parentinfo)
+ local packagename, requireinfo = _load_require(require_str, requires_extra, opt.parentinfo)
table.insert(requireitems, {name = packagename, info = requireinfo})
end
return requireitems