diff options
| author | ruki <[email protected]> | 2024-07-23 16:34:41 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-07-23 16:34:41 +0800 |
| commit | 6febdd7a7f7f316cff20837209c1f9b1a4cd886d (patch) | |
| tree | 029c504ffb7f151ae12071bb2d0330ac6265dcbf | |
| parent | 06a90764a12521f4bb704d689e6313665934f2d4 (diff) | |
| parent | 694c0ac091263a7bfeeda55cfc5a6a816c516a95 (diff) | |
Merge pull request #5382 from xmake-io/pack
fix pack io.gsub
| -rw-r--r-- | xmake/plugins/pack/deb/main.lua | 18 | ||||
| -rw-r--r-- | xmake/plugins/pack/nsis/main.lua | 34 | ||||
| -rw-r--r-- | xmake/plugins/pack/runself/main.lua | 31 | ||||
| -rw-r--r-- | xmake/plugins/pack/srpm/main.lua | 32 | ||||
| -rw-r--r-- | xmake/plugins/pack/wix/main.lua | 32 |
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} |
