summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2022-10-11 00:48:16 +0800
committerruki <[email protected]>2022-10-11 00:48:16 +0800
commitfba58146ef2b8e505e59ec58948e319606354ef7 (patch)
tree078b64a2f1bc6e75d549ddee2134cb515e19077d
parenta0e9f935de826a2050b056438e9c3cb521c8ddf2 (diff)
improve rules for generator
-rw-r--r--xmake/plugins/project/clang/compile_commands.lua2
-rw-r--r--xmake/plugins/project/cmake/cmakelists.lua2
-rw-r--r--xmake/plugins/project/vstudio/impl/vs201x.lua44
-rw-r--r--xmake/plugins/project/vsxmake/getinfo.lua42
4 files changed, 87 insertions, 3 deletions
diff --git a/xmake/plugins/project/clang/compile_commands.lua b/xmake/plugins/project/clang/compile_commands.lua
index b66e6e7f9..cc86a7b5e 100644
--- a/xmake/plugins/project/clang/compile_commands.lua
+++ b/xmake/plugins/project/clang/compile_commands.lua
@@ -171,7 +171,7 @@ function _make_commands_for_objectrules(jsonfile, target, sourcebatch, suffix)
-- get rule
local rulename = assert(sourcebatch.rulename, "unknown rule for sourcebatch!")
- local ruleinst = assert(project.rule(rulename) or rule.rule(rulename), "unknown rule: %s", rulename)
+ local ruleinst = assert(target:rule(rulename) or project.rule(rulename) or rule.rule(rulename), "unknown rule: %s", rulename)
-- generate commands for xx_buildcmd_files
local scriptname = "buildcmd_files" .. (suffix and ("_" .. suffix) or "")
diff --git a/xmake/plugins/project/cmake/cmakelists.lua b/xmake/plugins/project/cmake/cmakelists.lua
index cb0a9482c..3a22c98c7 100644
--- a/xmake/plugins/project/cmake/cmakelists.lua
+++ b/xmake/plugins/project/cmake/cmakelists.lua
@@ -898,7 +898,7 @@ function _add_target_custom_commands_for_objectrules(cmakelists, target, sourceb
-- get rule
local rulename = assert(sourcebatch.rulename, "unknown rule for sourcebatch!")
- local ruleinst = assert(project.rule(rulename) or rule.rule(rulename), "unknown rule: %s", rulename)
+ local ruleinst = assert(target:rule(rulename) or project.rule(rulename) or rule.rule(rulename), "unknown rule: %s", rulename)
-- generate commands for xx_buildcmd_files
local scriptname = "buildcmd_files" .. (suffix and ("_" .. suffix) or "")
diff --git a/xmake/plugins/project/vstudio/impl/vs201x.lua b/xmake/plugins/project/vstudio/impl/vs201x.lua
index edcfde2cb..116ca689f 100644
--- a/xmake/plugins/project/vstudio/impl/vs201x.lua
+++ b/xmake/plugins/project/vstudio/impl/vs201x.lua
@@ -158,7 +158,7 @@ function _make_custom_commands_for_objectrules(commands, target, sourcebatch, vc
-- get rule
local rulename = assert(sourcebatch.rulename, "unknown rule for sourcebatch!")
- local ruleinst = assert(project.rule(rulename) or rule.rule(rulename), "unknown rule: %s", rulename)
+ local ruleinst = assert(target:rule(rulename) or project.rule(rulename) or rule.rule(rulename), "unknown rule: %s", rulename)
-- generate commands for xx_buildcmd_files
local scriptname = "buildcmd_files" .. (suffix and ("_" .. suffix) or "")
@@ -505,6 +505,45 @@ function _config_targets()
end
end
+-- load rules in the required packages for target
+function _load_package_rules_for_target(target)
+ for _, rulename in ipairs(target:get("rules")) do
+ local packagename = rulename:match("@(.-)/")
+ if packagename then
+ local pkginfo = project.required_package(packagename)
+ if pkginfo then
+ local r = pkginfo:rule(rulename)
+ if r then
+ target:rule_add(r)
+ for _, dep in pairs(r:deps()) do
+ target:rule_add(dep)
+ end
+ end
+ end
+ end
+ end
+end
+
+-- load rules in the required packages for targets
+-- @see https://github.com/xmake-io/xmake/issues/2374
+--
+-- @code
+-- add_requires("zlib", {system = false})
+-- target("test")
+-- set_kind("binary")
+-- add_files("src/*.cpp")
+-- add_packages("zlib")
+-- add_rules("@zlib/test")
+-- @endcode
+--
+function _load_package_rules_for_targets()
+ for _, target in ipairs(project.ordertargets()) do
+ if target:is_enabled() then
+ _load_package_rules_for_target(target)
+ end
+ end
+end
+
-- make vstudio project
function make(outputdir, vsinfo)
@@ -558,6 +597,9 @@ function make(outputdir, vsinfo)
-- install and update requires
install_requires()
+ -- load package rules for targets
+ _load_package_rules_for_targets()
+
-- config targets
_config_targets()
diff --git a/xmake/plugins/project/vsxmake/getinfo.lua b/xmake/plugins/project/vsxmake/getinfo.lua
index a3bb44d83..e7bce0e8b 100644
--- a/xmake/plugins/project/vsxmake/getinfo.lua
+++ b/xmake/plugins/project/vsxmake/getinfo.lua
@@ -317,6 +317,45 @@ function _config_targets()
end
end
+-- load rules in the required packages for target
+function _load_package_rules_for_target(target)
+ for _, rulename in ipairs(target:get("rules")) do
+ local packagename = rulename:match("@(.-)/")
+ if packagename then
+ local pkginfo = project.required_package(packagename)
+ if pkginfo then
+ local r = pkginfo:rule(rulename)
+ if r then
+ target:rule_add(r)
+ for _, dep in pairs(r:deps()) do
+ target:rule_add(dep)
+ end
+ end
+ end
+ end
+ end
+end
+
+-- load rules in the required packages for targets
+-- @see https://github.com/xmake-io/xmake/issues/2374
+--
+-- @code
+-- add_requires("zlib", {system = false})
+-- target("test")
+-- set_kind("binary")
+-- add_files("src/*.cpp")
+-- add_packages("zlib")
+-- add_rules("@zlib/test")
+-- @endcode
+--
+function _load_package_rules_for_targets()
+ for _, target in ipairs(project.ordertargets()) do
+ if target:is_enabled() then
+ _load_package_rules_for_target(target)
+ end
+ end
+end
+
-- make filter
function _make_filter(filepath, target, vcxprojdir)
local filter
@@ -451,6 +490,9 @@ function main(outputdir, vsinfo)
-- install and update requires
install_requires()
+ -- load package rules for targets
+ _load_package_rules_for_targets()
+
-- config targets
_config_targets()