summaryrefslogtreecommitdiff
path: root/xmake/modules/lib/detect/check_bigendian.lua
diff options
context:
space:
mode:
authorCarbene Hu <[email protected]>2024-03-17 14:59:02 +0800
committerCarbene Hu <[email protected]>2024-03-17 14:59:02 +0800
commit097a6d25fe308683161920f3cd9292063cddab14 (patch)
tree115b697afc1b19a5d67207ed41a0ffb581fe1424 /xmake/modules/lib/detect/check_bigendian.lua
parent9eb1a7489b99e05c65c62ccb651c65c02dc9b216 (diff)
feat: Add check_bigendian #4843
Diffstat (limited to 'xmake/modules/lib/detect/check_bigendian.lua')
-rw-r--r--xmake/modules/lib/detect/check_bigendian.lua71
1 files changed, 71 insertions, 0 deletions
diff --git a/xmake/modules/lib/detect/check_bigendian.lua b/xmake/modules/lib/detect/check_bigendian.lua
new file mode 100644
index 000000000..13b0f96b1
--- /dev/null
+++ b/xmake/modules/lib/detect/check_bigendian.lua
@@ -0,0 +1,71 @@
+--!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 CarbeneHu
+-- @file check_bigendian.lua
+--
+
+-- imports
+import("lib.detect.check_cxxsnippets")
+
+local check_bigendian_template = [[
+#include <inttypes.h>
+/* A 16 bit integer is required. */
+typedef uint16_t byteorder_int16_t;
+
+/* On a little endian machine, these 16bit ints will give "THIS IS LITTLE ENDIAN."
+ On a big endian machine the characters will be exchanged pairwise. */
+const byteorder_int16_t info_little[] = {0x4854, 0x5349, 0x4920, 0x2053, 0x494c, 0x5454, 0x454c, 0x4520, 0x444e, 0x4149, 0x2e4e, 0x0000};
+
+/* on a big endian machine, these 16bit ints will give "THIS IS BIG ENDIAN."
+ On a little endian machine the characters will be exchanged pairwise. */
+const byteorder_int16_t info_big[] = {0x5448, 0x4953, 0x2049, 0x5320, 0x4249, 0x4720, 0x454e, 0x4449, 0x414e, 0x2e2e, 0x0000};
+
+int main(int argc, char *argv[])
+{
+ int require = 0;
+ require += info_little[argc];
+ require += info_big[argc];
+ (void)argv;
+ return require;
+}]]
+
+local function _byteorder_binary_match(content)
+ local match = content:match("THIS IS BIG ENDIAN")
+ return match and true or false
+end
+
+-- check the endianness of the compiler
+--
+-- @param opt the argument options
+-- e.g.
+-- { verbose = false, target = [target|option], includes = "stdio.h"
+-- , configs = {defines = "xx", cxflags = ""}}
+--
+-- @return Boolean value whether the compiler is big-endian
+--
+-- @code
+-- local is_bigendian = check_bigendian()
+-- @endcode
+--
+function main(typename, opt)
+ local snippets = check_bigendian_template
+ local ok, is_bigendian = check_cxxsnippets(snippets, table.join(table.wrap(opt), {binary_match = _byteorder_binary_match}))
+ if ok then
+ return is_bigendian
+ end
+end
+