summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2024-07-23 16:34:41 +0800
committerGitHub <[email protected]>2024-07-23 16:34:41 +0800
commit6febdd7a7f7f316cff20837209c1f9b1a4cd886d (patch)
tree029c504ffb7f151ae12071bb2d0330ac6265dcbf
parent06a90764a12521f4bb704d689e6313665934f2d4 (diff)
parent694c0ac091263a7bfeeda55cfc5a6a816c516a95 (diff)
Merge pull request #5382 from xmake-io/pack
fix pack io.gsub
-rw-r--r--xmake/plugins/pack/deb/main.lua18
-rw-r--r--xmake/plugins/pack/nsis/main.lua34
-rw-r--r--xmake/plugins/pack/runself/main.lua31
-rw-r--r--xmake/plugins/pack/srpm/main.lua32
-rw-r--r--xmake/plugins/pack/wix/main.lua32
5 files changed, 104 insertions, 43 deletions
diff --git a/xmake/plugins/pack/deb/main.lua b/xmake/plugins/pack/deb/main.lua
index e9a72f24b..076b88da3 100644
--- a/xmake/plugins/pack/deb/main.lua
+++ b/xmake/plugins/pack/deb/main.lua
@@ -195,11 +195,19 @@ function _pack_deb(debuild, package)
end
-- replace variables in specfile
+ -- and we need to avoid `attempt to yield across a C-call boundary` in io.gsub
local specvars = _get_specvars(package)
local pattern = package:extraconf("specfile", "pattern") or "%${([^\n]-)}"
+ local specvars_names = {}
+ local specvars_values = {}
for _, specfile in ipairs(os.files(path.join(debiandir, "**"))) do
io.gsub(specfile, "(" .. pattern .. ")", function(_, name)
- name = name:trim()
+ table.insert(specvars_names, name)
+ end)
+ end
+ for _, name in ipairs(specvars_names) do
+ name = name:trim()
+ if specvars_values[name] == nil then
local value = specvars[name]
if type(value) == "function" then
value = value()
@@ -210,7 +218,13 @@ function _pack_deb(debuild, package)
if type(value) == "table" then
dprint("invalid variable value", value)
end
- return value
+ specvars_values[name] = value
+ end
+ end
+ for _, specfile in ipairs(os.files(path.join(debiandir, "**"))) do
+ io.gsub(specfile, "(" .. pattern .. ")", function(_, name)
+ name = name:trim()
+ return specvars_values[name]
end)
end
diff --git a/xmake/plugins/pack/nsis/main.lua b/xmake/plugins/pack/nsis/main.lua
index 2dc304b7b..ac6d008b7 100644
--- a/xmake/plugins/pack/nsis/main.lua
+++ b/xmake/plugins/pack/nsis/main.lua
@@ -260,22 +260,34 @@ function _pack_nsis(makensis, package)
os.cp(specfile_template, specfile)
end
- -- replace variables in specfile
+ -- replace variables in specfile,
+ -- and we need to avoid `attempt to yield across a C-call boundary` in io.gsub
local specvars = _get_specvars(package)
local pattern = package:extraconf("specfile", "pattern") or "%${([^\n]-)}"
+ local specvars_names = {}
+ local specvars_values = {}
io.gsub(specfile, "(" .. pattern .. ")", function(_, name)
+ table.insert(specvars_names, name)
+ end)
+ for _, name in ipairs(specvars_names) do
name = name:trim()
- local value = specvars[name]
- if type(value) == "function" then
- value = value()
- end
- if value ~= nil then
- dprint(" > replace %s -> %s", name, value)
- end
- if type(value) == "table" then
- dprint("invalid variable value", value)
+ if specvars_values[name] == nil then
+ local value = specvars[name]
+ if type(value) == "function" then
+ value = value()
+ end
+ if value ~= nil then
+ dprint(" > replace %s -> %s", name, value)
+ end
+ if type(value) == "table" then
+ dprint("invalid variable value", value)
+ end
+ specvars_values[name] = value
end
- return value
+ end
+ io.gsub(specfile, "(" .. pattern .. ")", function(_, name)
+ name = name:trim()
+ return specvars_values[name]
end)
-- make package
diff --git a/xmake/plugins/pack/runself/main.lua b/xmake/plugins/pack/runself/main.lua
index eb5c01fb1..4343b1a76 100644
--- a/xmake/plugins/pack/runself/main.lua
+++ b/xmake/plugins/pack/runself/main.lua
@@ -117,19 +117,30 @@ function _pack_runself(makeself, package)
-- replace variables in specfile
local specvars = _get_specvars(package)
local pattern = package:extraconf("specfile", "pattern") or "%${([^\n]-)}"
+ local specvars_names = {}
+ local specvars_values = {}
io.gsub(specfile, "(" .. pattern .. ")", function(_, name)
+ table.insert(specvars_names, name)
+ end)
+ for _, name in ipairs(specvars_names) do
name = name:trim()
- local value = specvars[name]
- if type(value) == "function" then
- value = value()
- end
- if value ~= nil then
- dprint(" > replace %s -> %s", name, value)
- end
- if type(value) == "table" then
- dprint("invalid variable value", value)
+ if specvars_values[name] == nil then
+ local value = specvars[name]
+ if type(value) == "function" then
+ value = value()
+ end
+ if value ~= nil then
+ dprint(" > replace %s -> %s", name, value)
+ end
+ if type(value) == "table" then
+ dprint("invalid variable value", value)
+ end
+ specvars_values[name] = value
end
- return value
+ end
+ io.gsub(specfile, "(" .. pattern .. ")", function(_, name)
+ name = name:trim()
+ return specvars_values[name]
end)
-- archive source files
diff --git a/xmake/plugins/pack/srpm/main.lua b/xmake/plugins/pack/srpm/main.lua
index e8630ba58..a0b2d2dad 100644
--- a/xmake/plugins/pack/srpm/main.lua
+++ b/xmake/plugins/pack/srpm/main.lua
@@ -209,21 +209,33 @@ function _pack_srpm(rpmbuild, package)
end
-- replace variables in specfile
+ -- and we need to avoid `attempt to yield across a C-call boundary` in io.gsub
local specvars = _get_specvars(package)
local pattern = package:extraconf("specfile", "pattern") or "%${([^\n]-)}"
+ local specvars_names = {}
+ local specvars_values = {}
io.gsub(specfile, "(" .. pattern .. ")", function(_, name)
+ table.insert(specvars_names, name)
+ end)
+ for _, name in ipairs(specvars_names) do
name = name:trim()
- local value = specvars[name]
- if type(value) == "function" then
- value = value()
- end
- if value ~= nil then
- dprint(" > replace %s -> %s", name, value)
- end
- if type(value) == "table" then
- dprint("invalid variable value", value)
+ if specvars_values[name] == nil then
+ local value = specvars[name]
+ if type(value) == "function" then
+ value = value()
+ end
+ if value ~= nil then
+ dprint(" > replace %s -> %s", name, value)
+ end
+ if type(value) == "table" then
+ dprint("invalid variable value", value)
+ end
+ specvars_values[name] = value
end
- return value
+ end
+ io.gsub(specfile, "(" .. pattern .. ")", function(_, name)
+ name = name:trim()
+ return specvars_values[name]
end)
-- archive source files
diff --git a/xmake/plugins/pack/wix/main.lua b/xmake/plugins/pack/wix/main.lua
index a99ecdb6e..a99070def 100644
--- a/xmake/plugins/pack/wix/main.lua
+++ b/xmake/plugins/pack/wix/main.lua
@@ -265,21 +265,33 @@ function _pack_wix(wix, package)
end
-- replace variables in specfile
+ -- and we need to avoid `attempt to yield across a C-call boundary` in io.gsub
local specvars = _get_specvars(package)
local pattern = package:extraconf("specfile", "pattern") or "%${([^\n]-)}"
+ local specvars_names = {}
+ local specvars_values = {}
io.gsub(specfile, "(" .. pattern .. ")", function(_, name)
+ table.insert(specvars_names, name)
+ end)
+ for _, name in ipairs(specvars_names) do
name = name:trim()
- local value = specvars[name]
- if type(value) == "function" then
- value = value()
- end
- if value ~= nil then
- dprint(" > replace %s -> %s", name, value)
- end
- if type(value) == "table" then
- dprint("invalid variable value", value)
+ if specvars_values[name] == nil then
+ local value = specvars[name]
+ if type(value) == "function" then
+ value = value()
+ end
+ if value ~= nil then
+ dprint(" > replace %s -> %s", name, value)
+ end
+ if type(value) == "table" then
+ dprint("invalid variable value", value)
+ end
+ specvars_values[name] = value
end
- return value
+ end
+ io.gsub(specfile, "(" .. pattern .. ")", function(_, name)
+ name = name:trim()
+ return specvars_values[name]
end)
local argv = {"build", specfile}