summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2023-11-03 00:41:08 +0800
committerruki <[email protected]>2023-11-03 00:41:08 +0800
commitc63207ba0564b1ad87b7d31df738da26c421e796 (patch)
tree2aef463a92deff57a071de5bf4b3a12c3633ebe6
parentd92d8ad1fda4d9605d08ae4c44271d9273642a93 (diff)
add check_sizeof for target
-rw-r--r--tests/apis/check_xxx/xmake.lua1
-rw-r--r--xmake/core/project/target.lua13
-rw-r--r--xmake/includes/check/check_sizeof.lua8
-rw-r--r--xmake/modules/lib/detect/check_sizeof.lua73
4 files changed, 91 insertions, 4 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/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 57db09205..f04efa566 100644
--- a/xmake/includes/check/check_sizeof.lua
+++ b/xmake/includes/check/check_sizeof.lua
@@ -65,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), {binary_match = _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)
@@ -114,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), {binary_match = _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
@@ -122,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_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
+