summaryrefslogtreecommitdiff
path: root/platform/javascript/detect.py
blob: a2988d9c6051dcba59f69b6d19496436270d6ea8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import os
import string
import sys


def is_active():
    return True


def get_name():
    return "JavaScript"


def can_build():

    return ("EMSCRIPTEN_ROOT" in os.environ or "EMSCRIPTEN" in os.environ)


def get_opts():
    from SCons.Variables import BoolVariable
    return [
        BoolVariable('wasm', 'Compile to WebAssembly', False),
        BoolVariable('javascript_eval', 'Enable JavaScript eval interface', True),
    ]


def get_flags():

    return [
        ('tools', False),
        ('module_theora_enabled', False),
    ]


def create(env):

    # remove Windows' .exe suffix
    return env.Clone(tools=['textfile', 'zip'], PROGSUFFIX='')


def escape_sources_backslashes(target, source, env, for_signature):
    return [path.replace('\\','\\\\') for path in env.GetBuildPath(source)]

def escape_target_backslashes(target, source, env, for_signature):
    return env.GetBuildPath(target[0]).replace('\\','\\\\')


def configure(env):

    ## Build type

    if (env["target"] == "release"):
        env.Append(CCFLAGS=['-O3'])
        env.Append(LINKFLAGS=['-O3'])

    elif (env["target"] == "release_debug"):
        env.Append(CCFLAGS=['-O2', '-DDEBUG_ENABLED'])
        env.Append(LINKFLAGS=['-O2', '-s', 'ASSERTIONS=1'])
        # retain function names at the cost of file size, for backtraces and profiling
        env.Append(LINKFLAGS=['--profiling-funcs'])

    elif (env["target"] == "debug"):
        env.Append(CCFLAGS=['-O1', '-D_DEBUG', '-g', '-DDEBUG_ENABLED'])
        env.Append(LINKFLAGS=['-O1', '-g'])

    ## Compiler configuration

    env['ENV'] = os.environ
    if ("EMSCRIPTEN_ROOT" in os.environ):
        env.PrependENVPath('PATH', os.environ['EMSCRIPTEN_ROOT'])
    elif ("EMSCRIPTEN" in os.environ):
        env.PrependENVPath('PATH', os.environ['EMSCRIPTEN'])
    env['CC']      = 'emcc'
    env['CXX']     = 'em++'
    env['LINK']    = 'emcc'
    env['RANLIB']  = 'emranlib'
    # Emscripten's ar has issues with duplicate file names, so use cc
    env['AR']      = 'emcc'
    env['ARFLAGS'] = '-o'

    if (os.name == 'nt'):
        # use TempFileMunge on Windows since some commands get too long for
        # cmd.exe even with spawn_fix
        # need to escape backslashes for this
        env['ESCAPED_SOURCES'] = escape_sources_backslashes
        env['ESCAPED_TARGET'] = escape_target_backslashes
        env['ARCOM'] = '${TEMPFILE("%s")}' % env['ARCOM'].replace('$SOURCES', '$ESCAPED_SOURCES').replace('$TARGET', '$ESCAPED_TARGET')

    env['OBJSUFFIX'] = '.bc'
    env['LIBSUFFIX'] = '.bc'

    ## Compile flags

    env.Append(CPPPATH=['#platform/javascript'])
    env.Append(CPPFLAGS=['-DJAVASCRIPT_ENABLED', '-DUNIX_ENABLED', '-DPTHREAD_NO_RENAME', '-DTYPED_METHOD_BIND', '-DNO_THREADS'])
    env.Append(CPPFLAGS=['-DGLES3_ENABLED'])

    # These flags help keep the file size down
    env.Append(CPPFLAGS=["-fno-exceptions", '-DNO_SAFE_CAST', '-fno-rtti'])

    if env['javascript_eval']:
        env.Append(CPPFLAGS=['-DJAVASCRIPT_EVAL_ENABLED'])

    ## Link flags

    env.Append(LINKFLAGS=['-s', 'EXTRA_EXPORTED_RUNTIME_METHODS="[\'FS\']"'])
    env.Append(LINKFLAGS=['-s', 'USE_WEBGL2=1'])

    if env['wasm']:
        env.Append(LINKFLAGS=['-s', 'BINARYEN=1'])
        # In contrast to asm.js, enabling memory growth on WebAssembly has no
        # major performance impact, and causes only a negligible increase in
        # memory size.
        env.Append(LINKFLAGS=['-s', 'ALLOW_MEMORY_GROWTH=1'])
        env.extra_suffix = '.webassembly' + env.extra_suffix
    else:
        env.Append(LINKFLAGS=['-s', 'ASM_JS=1'])
        env.Append(LINKFLAGS=['--separate-asm'])
        env.Append(LINKFLAGS=['--memory-init-file', '1'])

    # TODO: Move that to opus module's config
    if 'module_opus_enabled' in env and env['module_opus_enabled']:
        env.opus_fixed_point = "yes"