summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2026-04-01 23:49:51 +0800
committerruki <[email protected]>2026-04-01 23:49:51 +0800
commit57ef7e0332355a091abe1ee9eefe2a359aeb6f1a (patch)
tree29b17a285f487e522fe62375d9bb9489225aec69
parent55b9013e699dbfc94aa9d77d3a9546c0740fc56e (diff)
improve utils.replace to support function
-rw-r--r--tests/apis/add_files_replace/xmake.lua10
-rw-r--r--xmake/rules/utils/replace/xmake.lua46
2 files changed, 40 insertions, 16 deletions
diff --git a/tests/apis/add_files_replace/xmake.lua b/tests/apis/add_files_replace/xmake.lua
index 24b98e7cd..ee890c9f8 100644
--- a/tests/apis/add_files_replace/xmake.lua
+++ b/tests/apis/add_files_replace/xmake.lua
@@ -1,6 +1,16 @@
add_rules("mode.debug", "mode.release")
+
+-- test table replaces
target("test")
set_kind("binary")
add_files("src/main.c", {rules = "utils.replace", replaces = {
{'"original"', '"replaced"'},
}})
+
+-- test function replaces
+target("test2")
+ set_kind("binary")
+ add_files("src/main.c", {rules = "utils.replace", replaces = function (content)
+ content = content:gsub('"original"', '"func_replaced"')
+ return content
+ end})
diff --git a/xmake/rules/utils/replace/xmake.lua b/xmake/rules/utils/replace/xmake.lua
index a3608cc34..8b865b750 100644
--- a/xmake/rules/utils/replace/xmake.lua
+++ b/xmake/rules/utils/replace/xmake.lua
@@ -28,6 +28,13 @@
--
-- add_files("src/foo.c", {rules = "utils.replace", replaces = {{"RDKCONST);", "VDKREG);"}}, replace_plain = true})
--
+-- e.g. replace with custom function
+--
+-- add_files("src/foo.c", {rules = "utils.replace", replaces = function (content)
+-- content = content:gsub("old", "new")
+-- return content
+-- end})
+--
rule("utils.replace")
on_prepare_file(function (target, sourcefile, opt)
import("utils.progress")
@@ -64,29 +71,36 @@ rule("utils.replace")
-- build values list from replace config for change detection
local depvalues = {}
- for _, item in ipairs(replaces) do
- table.insert(depvalues, item[1])
- table.insert(depvalues, item[2])
- end
- if use_plain then
- table.insert(depvalues, "plain")
+ local is_function = type(replaces) == "function"
+ if not is_function then
+ for _, item in ipairs(replaces) do
+ table.insert(depvalues, item[1])
+ table.insert(depvalues, item[2])
+ end
+ if use_plain then
+ table.insert(depvalues, "plain")
+ end
end
-- do replace if source file or replace config is changed
depend.on_changed(function ()
progress.show(opt.progress, "${color.build.object}replacing.$(mode) %s", sourcefile)
vprint("replace %s to %s", sourcefile, replacefile)
- if option.get("diagnosis") then
- for _, item in ipairs(replaces) do
- cprint("${dim} > \"%s\" -> \"%s\"%s", item[1], item[2], use_plain and " (plain)" or "")
- end
- end
local content = io.readfile(sourcefile)
- for _, item in ipairs(replaces) do
- if use_plain then
- content = content:replace(item[1], item[2], {plain = true})
- else
- content = content:gsub(item[1], item[2])
+ if is_function then
+ content = replaces(content)
+ else
+ if option.get("diagnosis") then
+ for _, item in ipairs(replaces) do
+ cprint("${dim} > \"%s\" -> \"%s\"%s", item[1], item[2], use_plain and " (plain)" or "")
+ end
+ end
+ for _, item in ipairs(replaces) do
+ if use_plain then
+ content = content:replace(item[1], item[2], {plain = true})
+ else
+ content = content:gsub(item[1], item[2])
+ end
end
end
io.writefile(replacefile, content)