summaryrefslogtreecommitdiff
path: root/xmake/modules/lib
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 /xmake/modules/lib
parentd92d8ad1fda4d9605d08ae4c44271d9273642a93 (diff)
add check_sizeof for target
Diffstat (limited to 'xmake/modules/lib')
-rw-r--r--xmake/modules/lib/detect/check_sizeof.lua73
1 files changed, 73 insertions, 0 deletions
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
+