diff options
| author | ruki <[email protected]> | 2026-04-01 23:49:51 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2026-04-01 23:49:51 +0800 |
| commit | 57ef7e0332355a091abe1ee9eefe2a359aeb6f1a (patch) | |
| tree | 29b17a285f487e522fe62375d9bb9489225aec69 | |
| parent | 55b9013e699dbfc94aa9d77d3a9546c0740fc56e (diff) | |
improve utils.replace to support function
| -rw-r--r-- | tests/apis/add_files_replace/xmake.lua | 10 | ||||
| -rw-r--r-- | xmake/rules/utils/replace/xmake.lua | 46 |
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) |
