summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2023-11-02 10:07:08 -0500
committerGitHub <[email protected]>2023-11-02 10:07:08 -0500
commit0f6e9d8f999137b5704299d0ed99ee42193ee55e (patch)
treee78a5abeec27c6508cd81255fdfcfdf263909cb5
parent0d1fd550f52288d784fdf1295fab63ac97197c0a (diff)
parentc63207ba0564b1ad87b7d31df738da26c421e796 (diff)
Merge pull request #4352 from xmake-io/check
Add target:check_sizeof
-rw-r--r--tests/apis/check_xxx/xmake.lua1
-rw-r--r--xmake/core/project/option.lua18
-rw-r--r--xmake/core/project/target.lua13
-rw-r--r--xmake/includes/check/check_sizeof.lua17
-rw-r--r--xmake/modules/lib/detect/check_cxsnippets.lua9
-rw-r--r--xmake/modules/lib/detect/check_sizeof.lua73
6 files changed, 113 insertions, 18 deletions
diff --git a/tests/apis/check_xxx/xmake.lua b/tests/apis/check_xxx/xmake.lua
index c670d0ee1..fdef4b472 100644
--- a/tests/apis/check_xxx/xmake.lua
+++ b/tests/apis/check_xxx/xmake.lua
@@ -19,6 +19,7 @@ target("foo")
}]], {tryrun = true})
check_csnippets("INT_SIZE", 'printf("%d", sizeof(int)); return 0;', {output = true, number = true})
check_sizeof("LONG_SIZE", "long")
+ check_sizeof("STRING_SIZE", "std::string", {includes = "string"})
configvar_check_cincludes("HAS_STRING_AND_STDIO_H", {"string.h", "stdio.h"})
configvar_check_ctypes("HAS_WCHAR_AND_FLOAT", {"wchar_t", "float"})
configvar_check_links("HAS_PTHREAD", {"pthread", "m", "dl"})
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/core/project/target.lua b/xmake/core/project/target.lua
index 17a7dad9c..32fc41596 100644
--- a/xmake/core/project/target.lua
+++ b/xmake/core/project/target.lua
@@ -2604,6 +2604,19 @@ function _instance:has_features(features, opt)
return sandbox_module.import("core.tool.compiler", {anonymous = true}).has_features(features, opt)
end
+-- check the size of type
+--
+-- @param typename the typename
+-- @param opt the argument options, e.g. {includes = "xxx.h", configs = {defines = ""}}
+--
+-- @return the type size
+--
+function _instance:check_sizeof(typename, opt)
+ opt = opt or {}
+ opt.target = self
+ return sandbox_module.import("lib.detect.check_sizeof", {anonymous = true})(typename, opt)
+end
+
-- check the given c snippets?
--
-- @param snippets the snippets
diff --git a/xmake/includes/check/check_sizeof.lua b/xmake/includes/check/check_sizeof.lua
index c4921fbf9..f04efa566 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,12 +65,12 @@ 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_cxxsnippets(definition, check_sizeof_template:gsub('${TYPE}', typename), {binary_match = _binary_match})
if opt.links then
add_links(opt.links)
end
if opt.includes then
- add_cincludes(opt.includes)
+ add_cxxincludes(opt.includes)
end
if opt.languages then
set_languages(opt.languages)
@@ -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_cxxsnippets(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
@@ -115,7 +122,7 @@ function configvar_check_sizeof(definition, typename, opt)
add_links(opt.links)
end
if opt.includes then
- add_cincludes(opt.includes)
+ add_cxxincludes(opt.includes)
end
if opt.languages then
set_languages(opt.languages)
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
diff --git a/xmake/modules/lib/detect/check_sizeof.lua b/xmake/modules/lib/detect/check_sizeof.lua
new file mode 100644
index 000000000..0b5050076
--- /dev/null
+++ b/xmake/modules/lib/detect/check_sizeof.lua
@@ -0,0 +1,73 @@
+--!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, TBOOX Open Source Group.
+--
+-- @author ruki
+-- @file check_sizeof.lua
+--
+
+-- imports
+import("lib.detect.check_cxxsnippets")
+
+local binary_match_pattern = 'INFO:size%[(%d+)%]'
+
+local check_sizeof_template = [[
+#define SIZE (sizeof(${TYPE}))
+static char info_size[] = {'I', 'N', 'F', 'O', ':', 's','i','z','e','[',
+ ('0' + ((SIZE / 10000)%10)),
+ ('0' + ((SIZE / 1000)%10)),
+ ('0' + ((SIZE / 100)%10)),
+ ('0' + ((SIZE / 10)%10)),
+ ('0' + (SIZE % 10)),
+ ']',
+ '\0'};
+
+int main(int argc, char *argv[]) {
+ int require = 0;
+ require += info_size[argc];
+ (void)argv;
+ return require;
+}]]
+
+function _binary_match(content)
+ local match = content:match(binary_match_pattern)
+ if match then
+ return match:ltrim("0")
+ end
+end
+
+-- check the size of type
+--
+-- @param typename the typename
+-- @param opt the argument options
+-- e.g.
+-- { verbose = false, target = [target|option], includes = "stdio.h"
+-- , configs = {defines = "xx", cxflags = ""}}
+--
+-- @return the type size
+--
+-- @code
+-- local size = check_sizeof("long")
+-- local size = check_sizeof("std::string", {includes = "string"})
+-- @endcode
+--
+function main(typename, opt)
+ local snippets = check_sizeof_template:gsub('${TYPE}', typename)
+ local ok, size = check_cxxsnippets(snippets, table.join(table.wrap(opt), {binary_match = _binary_match}))
+ if ok then
+ return size
+ end
+end
+