summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2021-08-07 10:45:19 +0800
committerGitHub <[email protected]>2021-08-07 10:45:19 +0800
commitf8fb074b73dd4317dd0f00a07b17cf9e9833f431 (patch)
tree3db21476e41286a38afcca3e69519d2c3b5ffe5d
parent0f35e8d5248fc56c395a3d03a1ac35a2e3378e63 (diff)
parentc31dca026e2fd927b0719a03adf4d346f1be4662 (diff)
Merge pull request #1554 from xmake-io/rule
Improve rule
-rw-r--r--tests/projects/other/bin2c/xmake.lua4
-rw-r--r--xmake/core/project/target.lua29
2 files changed, 25 insertions, 8 deletions
diff --git a/tests/projects/other/bin2c/xmake.lua b/tests/projects/other/bin2c/xmake.lua
index b5517a54e..b4c71e705 100644
--- a/tests/projects/other/bin2c/xmake.lua
+++ b/tests/projects/other/bin2c/xmake.lua
@@ -2,9 +2,9 @@ add_rules("mode.debug", "mode.release")
target("test")
set_kind("binary")
- add_rules("utils.bin2c", {linewidth = 16})
+ add_rules("utils.bin2c", {linewidth = 16, extensions = {".bin", ".png"}})
add_files("src/*.c")
add_files("src/*.bin")
- add_files("src/*.png", {rules = "utils.bin2c"})
+ add_files("src/*.png")
diff --git a/xmake/core/project/target.lua b/xmake/core/project/target.lua
index 3eed0cdad..ac9b63a0c 100644
--- a/xmake/core/project/target.lua
+++ b/xmake/core/project/target.lua
@@ -1116,11 +1116,15 @@ function _instance:filerules(sourcefile)
if not key2rules then
key2rules = {}
for _, r in pairs(table.wrap(self:rules())) do
- for _, sourcekind in ipairs(table.wrap(r:get("sourcekinds"))) do
+ -- we can also get sourcekinds from add_rules("xxx", {sourcekinds = "cxx"})
+ local rule_sourcekinds = self:extraconf("rules", r:name(), "sourcekinds") or r:get("sourcekinds")
+ for _, sourcekind in ipairs(table.wrap(rule_sourcekinds)) do
key2rules[sourcekind] = key2rules[sourcekind] or {}
table.insert(key2rules[sourcekind], r)
end
- for _, extension in ipairs(table.wrap(r:get("extensions"))) do
+ -- we can also get extensions from add_rules("xxx", {extensions = ".cpp"})
+ local rule_extensions = self:extraconf("rules", r:name(), "extensions") or r:get("extensions")
+ for _, extension in ipairs(table.wrap(rule_extensions)) do
extension = extension:lower()
key2rules[extension] = key2rules[extension] or {}
table.insert(key2rules[extension], r)
@@ -1130,13 +1134,26 @@ function _instance:filerules(sourcefile)
end
-- get target rules from the given sourcekind or extension
+ local rules_override = {}
local filename = path.filename(sourcefile):lower()
for _, r in ipairs(table.wrap(key2rules[path.extension(filename, 2)] or
- key2rules[path.extension(filename)] or
- key2rules[self:sourcekind_of(filename)])) do
- table.insert(rules, r)
+ key2rules[path.extension(filename)])) do
+ if self:extraconf("rules", r:name(), "override") then
+ table.insert(rules_override, r)
+ else
+ table.insert(rules, r)
+ end
+ end
+ for _, r in ipairs(table.wrap(key2rules[self:sourcekind_of(filename)])) do
+ if self:extraconf("rules", r:name(), "override") then
+ table.insert(rules_override, r)
+ else
+ table.insert(rules, r)
+ end
end
- return rules
+
+ -- we will use overrided rules first, e.g. add_rules("xxx", {override = true})
+ return #rules_override > 0 and rules_override or rules
end
-- get the config info of the given source file