tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

preprocess_wasm2c_config.py (4375B)


      1 # -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
      2 # vim: set filetype=python:
      3 # This Source Code Form is subject to the terms of the Mozilla Public
      4 # License, v. 2.0. If a copy of the MPL was not distibuted with this
      5 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
      6 
      7 import itertools
      8 
      9 # The wasm2c source relies on CMAKE to generate a config file to be used to build the project
     10 # Since we do not use cmake, this script automates the generation of a similar config suitable
     11 # for firefox builds
     12 # The script has a list of known variables it can replace and throws an error if it encounters a
     13 # new variable (for instance when the in-tree source is updated)
     14 
     15 # This python script knows how to replace the following variables normally configured by cmake for
     16 # the wasm2c source
     17 known_vars = [
     18    '#cmakedefine WABT_VERSION_STRING "@WABT_VERSION_STRING@"',
     19    "#cmakedefine WABT_DEBUG @WABT_DEBUG@",
     20    "#cmakedefine01 HAVE_ALLOCA_H",
     21    "#cmakedefine01 HAVE_UNISTD_H",
     22    "#cmakedefine01 HAVE_SNPRINTF",
     23    "#cmakedefine01 HAVE_SSIZE_T",
     24    "#cmakedefine01 HAVE_STRCASECMP",
     25    "#cmakedefine01 HAVE_WIN32_VT100",
     26    "#cmakedefine01 WABT_BIG_ENDIAN",
     27    "#cmakedefine01 HAVE_OPENSSL_SHA_H",
     28    "#cmakedefine01 COMPILER_IS_CLANG",
     29    "#cmakedefine01 COMPILER_IS_GNU",
     30    "#cmakedefine01 COMPILER_IS_MSVC",
     31    "#cmakedefine01 WITH_EXCEPTIONS",
     32    "#define SIZEOF_SIZE_T @SIZEOF_SIZE_T@",
     33 ]
     34 
     35 # The above variables are replaced with the code shown below
     36 replaced_variables = """
     37 // mozilla-config.h defines the following which is used
     38 // - HAVE_ALLOCA_H
     39 // - HAVE_UNISTD_H
     40 #include "mozilla-config.h"
     41 
     42 #define WABT_VERSION_STRING "Firefox-in-tree-version"
     43 
     44 #define WABT_DEBUG 0
     45 
     46 /* We don't require color printing of wasm2c errors on any platform */
     47 #define HAVE_WIN32_VT100 0
     48 
     49 #ifdef _WIN32
     50  // Ignore whatever is set in mozilla-config.h wrt alloca because it is
     51  // wrong when cross-compiling on Windows.
     52  #undef HAVE_ALLOCA_H
     53  // It is wrong when cross-compiling on Windows.
     54  #undef HAVE_UNISTD_H
     55  /* Whether ssize_t is defined by stddef.h */
     56  #define HAVE_SSIZE_T 0
     57  /* Whether strcasecmp is defined by strings.h */
     58  #define HAVE_STRCASECMP 0
     59 #else
     60  #define HAVE_SSIZE_T 1
     61  #define HAVE_STRCASECMP 1
     62 #endif
     63 
     64 #if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && defined(__ORDER_BIG_ENDIAN__)
     65 #  if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
     66 #    define WABT_BIG_ENDIAN 0
     67 #  elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
     68 #    define WABT_BIG_ENDIAN 1
     69 #  else
     70 #    error "Can't handle mixed-endian architectures"
     71 #  endif
     72 #else
     73 #  error "Don't know how to determine endianness"
     74 #endif
     75 
     76 /* Use internal Pico-SHA. Never use OpenSSL */
     77 #define HAVE_OPENSSL_SHA_H 0
     78 
     79 /* Whether snprintf is defined by stdio.h */
     80 #define HAVE_SNPRINTF 1
     81 
     82 #if defined(_MSC_VER)
     83  #define COMPILER_IS_GNU 0
     84  #define COMPILER_IS_CLANG 0
     85  #define COMPILER_IS_MSVC 1
     86 #elif defined(__GNUC__)
     87  #if defined(__clang__)
     88    #define COMPILER_IS_GNU 0
     89    #define COMPILER_IS_CLANG 1
     90    #define COMPILER_IS_MSVC 0
     91  #else
     92    #define COMPILER_IS_GNU 1
     93    #define COMPILER_IS_CLANG 0
     94    #define COMPILER_IS_MSVC 0
     95  #endif
     96 #else
     97  #error "Unknown compiler"
     98 #endif
     99 
    100 #define WITH_EXCEPTIONS 0
    101 
    102 #if SIZE_MAX == 0xffffffffffffffff
    103  #define SIZEOF_SIZE_T 8
    104 #elif SIZE_MAX == 0xffffffff
    105  #define SIZEOF_SIZE_T 4
    106 #else
    107  #error "Unknown size of size_t"
    108 #endif
    109 """
    110 
    111 
    112 def generate_config(output, config_h_in):
    113    file_config_h_in = open(config_h_in)
    114    lines = file_config_h_in.readlines()
    115 
    116    # Remove the known cmake variables
    117    for known_var in known_vars:
    118        lines = [x for x in lines if not x.startswith(known_var)]
    119 
    120    # Do a sanity check to make sure there are no unknown variables
    121    remaining_vars = [x for x in lines if x.startswith("#cmakedefine") or "@" in x]
    122    if len(remaining_vars) > 0:
    123        raise BaseException("Unknown cmake variables: " + str(remaining_vars))
    124 
    125    pos = lines.index("#define WABT_CONFIG_H_\n")
    126    skipped = itertools.takewhile(
    127        lambda x: not (x.strip()) or x.startswith("#include "), lines[pos + 1 :]
    128    )
    129    pos += len(list(skipped))
    130    pre_include_lines = lines[0:pos]
    131    post_include_lines = lines[pos:]
    132    output_str = (
    133        "".join(pre_include_lines)
    134        + "\n"
    135        + replaced_variables
    136        + "\n"
    137        + "".join(post_include_lines)
    138    )
    139    output.write(output_str)