summaryrefslogtreecommitdiff
path: root/xmake/rules/utils/replace/xmake.lua
diff options
context:
space:
mode:
authorruki <[email protected]>2026-04-01 23:27:51 +0800
committerruki <[email protected]>2026-04-01 23:27:51 +0800
commitf416451b312c06a3b9d48ea389450dfa9b11d376 (patch)
tree994e5d7b0c69ddcd9372a220c51a4680a560dd8d /xmake/rules/utils/replace/xmake.lua
parent4222dfcc1e73ec1f6fbe399ff1de6fb52e17af1e (diff)
add utils.replace rules
Diffstat (limited to 'xmake/rules/utils/replace/xmake.lua')
-rw-r--r--xmake/rules/utils/replace/xmake.lua92
1 files changed, 92 insertions, 0 deletions
diff --git a/xmake/rules/utils/replace/xmake.lua b/xmake/rules/utils/replace/xmake.lua
new file mode 100644
index 000000000..47340cb1a
--- /dev/null
+++ b/xmake/rules/utils/replace/xmake.lua
@@ -0,0 +1,92 @@
+--!A cross-platform build utility based on Lua
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+-- Copyright (C) 2015-present, Xmake Open Source Community.
+--
+-- @author ruki
+-- @file xmake.lua
+--
+
+-- @usage
+--
+-- e.g. replace with lua pattern (default)
+--
+-- add_files("src/foo.c", {rules = "utils.replace", replaces = {{"RDKCONST%);", "VDKREG);"}}})
+--
+-- e.g. replace with plain text
+--
+-- add_files("src/foo.c", {rules = "utils.replace", replaces = {{"RDKCONST);", "VDKREG);"}}, replace_plain = true})
+--
+rule("utils.replace")
+ on_prepare_file(function (target, sourcefile, opt)
+ import("utils.progress")
+ import("core.base.option")
+ import("core.project.depend")
+
+ -- get replace config from fileconfig
+ local fileconfig = target:fileconfig(sourcefile)
+ if not fileconfig or not fileconfig.replaces then
+ return
+ end
+ local replaces = fileconfig.replaces
+ local use_plain = fileconfig.replace_plain
+
+ -- get the replaced file path
+ local replacefile = target:autogenfile(sourcefile)
+
+ -- replace the sourcefile in the build sourcebatch,
+ -- so that the compiler uses the replaced file instead of the original
+ for _, sourcebatch in pairs(target:sourcebatches()) do
+ if sourcebatch.rulename ~= "utils.replace" then
+ for i, sf in ipairs(sourcebatch.sourcefiles) do
+ if sf == sourcefile then
+ sourcebatch.sourcefiles[i] = replacefile
+ end
+ end
+ end
+ end
+
+ -- 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")
+ 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])
+ end
+ end
+ io.writefile(replacefile, content)
+ end, {dependfile = target:dependfile(replacefile),
+ files = {sourcefile},
+ values = depvalues,
+ changed = target:is_rebuilt()})
+ end)