summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2022-10-19 22:36:19 +0800
committerruki <[email protected]>2022-10-19 22:36:19 +0800
commitf55de1eb50c29fc58bbaef1bc387035a8deabe6e (patch)
treebdc81e4eca0e93c5c5814c42d8468814106acf3f
parent0d3dc74e78b1d93de70c1a5e053afc9099e89029 (diff)
support default components
-rw-r--r--tests/projects/package/components/xmake.lua8
-rw-r--r--xmake/core/project/package.lua15
-rw-r--r--xmake/core/project/target.lua23
-rw-r--r--xmake/modules/private/action/require/impl/register_packages.lua14
4 files changed, 48 insertions, 12 deletions
diff --git a/tests/projects/package/components/xmake.lua b/tests/projects/package/components/xmake.lua
index a8d955fb8..a6b7dffff 100644
--- a/tests/projects/package/components/xmake.lua
+++ b/tests/projects/package/components/xmake.lua
@@ -5,12 +5,12 @@ add_requires("sfml")
target("graphics")
set_kind("static")
add_files("src/graphics.cpp")
- add_packages("sfml", {components = {"graphics", "window", "system"}, public = true})
+ add_packages("sfml", {components = {"graphics", "window"}, public = true})
target("network")
set_kind("static")
add_files("src/network.cpp")
- add_packages("sfml", {components = {"network", "system"}, public = true})
+ add_packages("sfml", {components = {"network"}, public = true})
target("test")
set_kind("binary")
@@ -131,9 +131,9 @@ package("sfml")
end
end
if package:is_plat("windows", "mingw") and package:config("main") then
- package:add("components", "main")
+ package:add("components", "main", {default = true})
end
- package:add("components", "system")
+ package:add("components", "system", {default = true})
end)
on_install("windows", "linux", function (package)
diff --git a/xmake/core/project/package.lua b/xmake/core/project/package.lua
index 4917e7c20..d1464fa4d 100644
--- a/xmake/core/project/package.lua
+++ b/xmake/core/project/package.lua
@@ -115,6 +115,21 @@ function _instance:libraryfiles()
return self:get("libfiles")
end
+-- get components
+function _instance:components()
+ return self:get("components")
+end
+
+-- get components list with link order
+function _instance:components_list()
+ return self:get("__components_list")
+end
+
+-- get default components
+function _instance:components_default()
+ return self:get("__components_default")
+end
+
-- get the extra info from the given name
function _instance:extra(name)
local extrainfo = self:extrainfo()
diff --git a/xmake/core/project/target.lua b/xmake/core/project/target.lua
index 4e6c21a56..418ff31cc 100644
--- a/xmake/core/project/target.lua
+++ b/xmake/core/project/target.lua
@@ -418,16 +418,23 @@ function _instance:get_from_pkgs(name, opt)
-- get values from package components
-- e.g. `add_packages("sfml", {components = {"graphics", "window"}})`
if configinfo and configinfo.components then
+ local components_enabled = hashset.from(table.wrap(configinfo.components))
+ for _, comp in ipairs(table.wrap(pkg:components_default())) do
+ components_enabled:insert(comp)
+ end
+ components_enabled:insert("__base")
-- if we can't find the values from the component, we need to fall back to __base to find them.
-- it contains some common values of all components
- local components = table.wrap(pkg:get("components"))
- for _, component_name in ipairs(table.join(configinfo.components, "__base")) do
- local info = components[component_name]
- if info then
- table.join2(values, info[name])
- else
- local components_str = table.concat(table.wrap(configinfo.components), ", ")
- utils.warning("unknown component(%s) in add_packages(%s, {components = {%s}})", component_name, pkg:name(), components_str)
+ local components = table.wrap(pkg:components())
+ for _, component_name in ipairs(table.join(pkg:components_list(), "__base")) do
+ if components_enabled:has(component_name) then
+ local info = components[component_name]
+ if info then
+ table.join2(values, info[name])
+ else
+ local components_str = table.concat(table.wrap(configinfo.components), ", ")
+ utils.warning("unknown component(%s) in add_packages(%s, {components = {%s}})", component_name, pkg:name(), components_str)
+ end
end
end
-- get values instead of the builtin configs if exists extra package config
diff --git a/xmake/modules/private/action/require/impl/register_packages.lua b/xmake/modules/private/action/require/impl/register_packages.lua
index 0ac1b833a..a6247cc9a 100644
--- a/xmake/modules/private/action/require/impl/register_packages.lua
+++ b/xmake/modules/private/action/require/impl/register_packages.lua
@@ -56,6 +56,20 @@ function _register_required_package_libs(instance, required_package, is_deps)
fetchinfo.components = nil
required_package:add(fetchinfo)
+ -- save components list
+ if components then
+ required_package:set("__components_list", instance:get("components"))
+ local components_default = {}
+ for _, comp in ipairs(instance:get("components")) do
+ if instance:extraconf("components", comp, "default") then
+ table.insert(components_default, comp)
+ end
+ end
+ if #components_default > 0 then
+ required_package:set("__components_default", components_default)
+ end
+ end
+
-- merge into the components values
local required_components = required_package:get("components")
if required_components then