summaryrefslogtreecommitdiffstats
path: root/config/external/wasm2c_sandbox_compiler/preprocess_wasm2c_config.py
diff options
context:
space:
mode:
Diffstat (limited to 'config/external/wasm2c_sandbox_compiler/preprocess_wasm2c_config.py')
-rw-r--r--config/external/wasm2c_sandbox_compiler/preprocess_wasm2c_config.py139
1 files changed, 139 insertions, 0 deletions
diff --git a/config/external/wasm2c_sandbox_compiler/preprocess_wasm2c_config.py b/config/external/wasm2c_sandbox_compiler/preprocess_wasm2c_config.py
new file mode 100644
index 0000000000..3edb8f4e06
--- /dev/null
+++ b/config/external/wasm2c_sandbox_compiler/preprocess_wasm2c_config.py
@@ -0,0 +1,139 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Souce Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distibuted with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+import itertools
+
+# The wasm2c source relies on CMAKE to generate a config file to be used to build the project
+# Since we do not use cmake, this script automates the generation of a similar config suitable
+# for firefox builds
+# The script has a list of known variables it can replace and throws an error if it encounters a
+# new variable (for instance when the in-tree source is updated)
+
+# This python script knows how to replace the following variables normally configured by cmake for
+# the wasm2c source
+known_vars = [
+ '#cmakedefine WABT_VERSION_STRING "@WABT_VERSION_STRING@"',
+ "#cmakedefine WABT_DEBUG @WABT_DEBUG@",
+ "#cmakedefine01 HAVE_ALLOCA_H",
+ "#cmakedefine01 HAVE_UNISTD_H",
+ "#cmakedefine01 HAVE_SNPRINTF",
+ "#cmakedefine01 HAVE_SSIZE_T",
+ "#cmakedefine01 HAVE_STRCASECMP",
+ "#cmakedefine01 HAVE_WIN32_VT100",
+ "#cmakedefine01 WABT_BIG_ENDIAN",
+ "#cmakedefine01 HAVE_OPENSSL_SHA_H",
+ "#cmakedefine01 COMPILER_IS_CLANG",
+ "#cmakedefine01 COMPILER_IS_GNU",
+ "#cmakedefine01 COMPILER_IS_MSVC",
+ "#cmakedefine01 WITH_EXCEPTIONS",
+ "#define SIZEOF_SIZE_T @SIZEOF_SIZE_T@",
+]
+
+# The above variables are replaced with the code shown below
+replaced_variables = """
+// mozilla-config.h defines the following which is used
+// - HAVE_ALLOCA_H
+// - HAVE_UNISTD_H
+#include "mozilla-config.h"
+
+#define WABT_VERSION_STRING "Firefox-in-tree-version"
+
+#define WABT_DEBUG 0
+
+/* We don't require color printing of wasm2c errors on any platform */
+#define HAVE_WIN32_VT100 0
+
+#ifdef _WIN32
+ // Ignore whatever is set in mozilla-config.h wrt alloca because it is
+ // wrong when cross-compiling on Windows.
+ #undef HAVE_ALLOCA_H
+ // It is wrong when cross-compiling on Windows.
+ #undef HAVE_UNISTD_H
+ /* Whether ssize_t is defined by stddef.h */
+ #define HAVE_SSIZE_T 0
+ /* Whether strcasecmp is defined by strings.h */
+ #define HAVE_STRCASECMP 0
+#else
+ #define HAVE_SSIZE_T 1
+ #define HAVE_STRCASECMP 1
+#endif
+
+#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && defined(__ORDER_BIG_ENDIAN__)
+# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+# define WABT_BIG_ENDIAN 0
+# elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+# define WABT_BIG_ENDIAN 1
+# else
+# error "Can't handle mixed-endian architectures"
+# endif
+#else
+# error "Don't know how to determine endianness"
+#endif
+
+/* Use internal Pico-SHA. Never use OpenSSL */
+#define HAVE_OPENSSL_SHA_H 0
+
+/* Whether snprintf is defined by stdio.h */
+#define HAVE_SNPRINTF 1
+
+#if defined(_MSC_VER)
+ #define COMPILER_IS_GNU 0
+ #define COMPILER_IS_CLANG 0
+ #define COMPILER_IS_MSVC 1
+#elif defined(__GNUC__)
+ #if defined(__clang__)
+ #define COMPILER_IS_GNU 0
+ #define COMPILER_IS_CLANG 1
+ #define COMPILER_IS_MSVC 0
+ #else
+ #define COMPILER_IS_GNU 1
+ #define COMPILER_IS_CLANG 0
+ #define COMPILER_IS_MSVC 0
+ #endif
+#else
+ #error "Unknown compiler"
+#endif
+
+#define WITH_EXCEPTIONS 0
+
+#if SIZE_MAX == 0xffffffffffffffff
+ #define SIZEOF_SIZE_T 8
+#elif SIZE_MAX == 0xffffffff
+ #define SIZEOF_SIZE_T 4
+#else
+ #error "Unknown size of size_t"
+#endif
+"""
+
+
+def generate_config(output, config_h_in):
+ file_config_h_in = open(config_h_in, "r")
+ lines = file_config_h_in.readlines()
+
+ # Remove the known cmake variables
+ for known_var in known_vars:
+ lines = [x for x in lines if not x.startswith(known_var)]
+
+ # Do a sanity check to make sure there are no unknown variables
+ remaining_vars = [x for x in lines if x.startswith("#cmakedefine") or "@" in x]
+ if len(remaining_vars) > 0:
+ raise BaseException("Unknown cmake variables: " + str(remaining_vars))
+
+ pos = lines.index("#define WABT_CONFIG_H_\n")
+ skipped = itertools.takewhile(
+ lambda x: not (x.strip()) or x.startswith("#include "), lines[pos + 1 :]
+ )
+ pos += len(list(skipped))
+ pre_include_lines = lines[0:pos]
+ post_include_lines = lines[pos:]
+ output_str = (
+ "".join(pre_include_lines)
+ + "\n"
+ + replaced_variables
+ + "\n"
+ + "".join(post_include_lines)
+ )
+ output.write(output_str)