summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2023-11-03 00:36:46 +0800
committerruki <[email protected]>2023-11-03 00:36:46 +0800
commitd92d8ad1fda4d9605d08ae4c44271d9273642a93 (patch)
treef4737cb1df283336ed87c32c0962171cd8399331
parent8d73a80b51d05aa81b0aaf6da02824e33352ca57 (diff)
improve binary match
-rw-r--r--xmake/core/project/option.lua18
-rw-r--r--xmake/includes/check/check_sizeof.lua13
-rw-r--r--xmake/modules/lib/detect/check_cxsnippets.lua9
3 files changed, 24 insertions, 16 deletions
diff --git a/xmake/core/project/option.lua b/xmake/core/project/option.lua
index 4b808bec3..0e4499f57 100644
--- a/xmake/core/project/option.lua
+++ b/xmake/core/project/option.lua
@@ -113,17 +113,17 @@ function _instance:_do_check_cxsnippets(snippets)
local snippets_build = {}
local snippets_tryrun = {}
local snippets_output = {}
- local snippets_binaryfind = {}
- local snippet_binaryfind = nil
+ local snippets_binary_match = {}
+ local snippet_binary_match = nil
if snippets then
for name, snippet in pairs(snippets) do
if self:extraconf(kind .. "snippets", name, "output") then
snippets_output[name] = snippet
elseif self:extraconf(kind .. "snippets", name, "tryrun") then
snippets_tryrun[name] = snippet
- elseif self:extraconf(kind .. "snippets", name, "binaryfind") then
- snippets_binaryfind[name] = snippet
- snippet_binaryfind = self:extraconf(kind .. "snippets", name, "binaryfind")
+ elseif self:extraconf(kind .. "snippets", name, "binary_match") then
+ snippets_binary_match[name] = snippet
+ snippet_binary_match = self:extraconf(kind .. "snippets", name, "binary_match")
else
snippets_build[name] = snippet
end
@@ -178,15 +178,15 @@ function _instance:_do_check_cxsnippets(snippets)
end
end
- -- check snippets (run with binaryfind)
- if #table.keys(snippets_binaryfind) > 0 then
- local ok, results_or_errors, output = sandbox.load(self._check_cxsnippets, snippets_binaryfind, {
+ -- check snippets (run with binary_match)
+ if #table.keys(snippets_binary_match) > 0 then
+ local ok, results_or_errors, output = sandbox.load(self._check_cxsnippets, snippets_binary_match, {
target = self,
sourcekind = sourcekind,
types = types,
funcs = funcs,
includes = includes,
- binaryfind = snippet_binaryfind})
+ binary_match = snippet_binary_match})
if not ok then
return false, -1, results_or_errors
end
diff --git a/xmake/includes/check/check_sizeof.lua b/xmake/includes/check/check_sizeof.lua
index c4921fbf9..57db09205 100644
--- a/xmake/includes/check/check_sizeof.lua
+++ b/xmake/includes/check/check_sizeof.lua
@@ -28,7 +28,7 @@
--
-- configvar_check_sizeof("SIZEOF_LONG", "long") => #define SIZEOF_LONG 4
--
-local binary_match = 'INFO:size%[(%d+)%]'
+local binary_match_pattern = 'INFO:size%[(%d+)%]'
local check_sizeof_template = [[
#define SIZE (sizeof(${TYPE}))
@@ -48,6 +48,13 @@ int main(int argc, char *argv[]) {
return require;
}]]
+function _binary_match(content)
+ local match = content:match(binary_match_pattern)
+ if match then
+ return match:ltrim("0")
+ end
+end
+
function check_sizeof(definition, typename, opt)
opt = opt or {}
if opt.number == nil then
@@ -58,7 +65,7 @@ function check_sizeof(definition, typename, opt)
interp_save_scope()
option(optname)
set_showmenu(false)
- add_csnippets(definition, check_sizeof_template:gsub('${TYPE}', typename), {binaryfind = binary_match})
+ add_csnippets(definition, check_sizeof_template:gsub('${TYPE}', typename), {binary_match = _binary_match})
if opt.links then
add_links(opt.links)
end
@@ -107,7 +114,7 @@ function configvar_check_sizeof(definition, typename, opt)
interp_save_scope()
option(optname)
set_showmenu(false)
- add_csnippets(definition, check_sizeof_template:gsub('${TYPE}', typename), {binaryfind = binary_match})
+ add_csnippets(definition, check_sizeof_template:gsub('${TYPE}', typename), {binary_match = _binary_match})
if opt.default == nil then
set_configvar(defname, defval or 1, {quote = opt.quote})
end
diff --git a/xmake/modules/lib/detect/check_cxsnippets.lua b/xmake/modules/lib/detect/check_cxsnippets.lua
index 912345909..987e7f10e 100644
--- a/xmake/modules/lib/detect/check_cxsnippets.lua
+++ b/xmake/modules/lib/detect/check_cxsnippets.lua
@@ -240,7 +240,7 @@ function main(snippets, opt)
cprint("${dim}> %s", compiler.compcmd(sourcefile, objectfile, opt))
end
compiler.compile(sourcefile, objectfile, opt)
- if #links > 0 or opt.tryrun or opt.binaryfind then
+ if #links > 0 or opt.tryrun or opt.binary_match then
if option.get("diagnosis") then
cprint("${dim}> %s", linker.linkcmd("binary", {"cc", "cxx"}, objectfile, binaryfile, opt))
end
@@ -257,10 +257,11 @@ function main(snippets, opt)
os.vrun(binaryfile)
end
end
- if opt.binaryfind then
+ local binary_match = opt.binary_match
+ if binary_match then
local content = io.readfile(binaryfile, {encoding = "binary"})
- local match = content:match(opt.binaryfind)
- if match then
+ local match = type(binary_match) == "function" and binary_match(content) or content:match(binary_match)
+ if match ~= nil then
return true, match
end
end