diff options
| author | ruki <[email protected]> | 2021-03-27 19:54:04 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2021-03-27 19:54:04 +0800 |
| commit | fb14f73e5def17223e143840743e33b490fe6a48 (patch) | |
| tree | 706990c621416306bf54100c6cd387bfd3d89e07 | |
| parent | 3eec448a822427939b5af22ed96bebce0c7c506f (diff) | |
| parent | 313274ab5e9d3dce17460a832a966e2383f6ec4a (diff) | |
Merge pull request #1308 from xmake-io/linkdeps
Improve linkdeps for package
| -rw-r--r-- | xmake/core/package/package.lua | 35 | ||||
| -rw-r--r-- | xmake/modules/private/action/require/impl/actions/install.lua | 2 | ||||
| -rw-r--r-- | xmake/modules/private/action/require/impl/package.lua | 33 |
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 |
