2014-02-10 01:10:30 +00:00
import os
2016-10-30 18:05:14 +00:00
2014-02-10 01:10:30 +00:00
def is_active ( ) :
2016-10-30 17:44:57 +00:00
return True
2016-04-02 18:26:12 +00:00
2016-10-30 18:05:14 +00:00
2014-02-10 01:10:30 +00:00
def get_name ( ) :
2018-03-21 14:51:44 +00:00
return ' JavaScript '
2014-02-10 01:10:30 +00:00
2016-10-30 18:05:14 +00:00
2014-02-10 01:10:30 +00:00
def can_build ( ) :
2018-03-28 04:10:11 +00:00
return ' EM_CONFIG ' in os . environ or os . path . exists ( os . path . expanduser ( ' ~/.emscripten ' ) )
2014-02-10 01:10:30 +00:00
2016-10-30 18:05:14 +00:00
2014-02-10 01:10:30 +00:00
def get_opts ( ) :
2017-09-25 04:37:17 +00:00
from SCons . Variables import BoolVariable
2016-10-30 17:44:57 +00:00
return [
2018-03-21 14:51:44 +00:00
# eval() can be a security concern, so it can be disabled.
2017-09-25 04:37:17 +00:00
BoolVariable ( ' javascript_eval ' , ' Enable JavaScript eval interface ' , True ) ,
2016-10-30 17:44:57 +00:00
]
2014-02-10 01:10:30 +00:00
2016-10-30 18:05:14 +00:00
2014-02-10 01:10:30 +00:00
def get_flags ( ) :
2016-10-30 17:44:57 +00:00
return [
2017-09-25 04:04:49 +00:00
( ' tools ' , False ) ,
2019-11-20 07:54:52 +00:00
( ' builtin_pcre2_with_jit ' , False ) ,
2018-02-08 21:00:55 +00:00
# Disabling the mbedtls module reduces file size.
2018-01-25 08:07:07 +00:00
# The module has little use due to the limited networking functionality
# in this platform. For the available networking methods, the browser
# manages TLS.
2018-02-08 21:00:55 +00:00
( ' module_mbedtls_enabled ' , False ) ,
2016-10-30 17:44:57 +00:00
]
2014-02-10 01:10:30 +00:00
def configure ( env ) :
2016-06-14 14:27:16 +00:00
2017-06-30 17:21:38 +00:00
## Build type
2018-05-14 13:11:42 +00:00
if env [ ' target ' ] != ' debug ' :
2018-01-06 23:13:04 +00:00
# Use -Os to prioritize optimizing for reduced file size. This is
# particularly valuable for the web platform because it directly
# decreases download time.
# -Os reduces file size by around 5 MiB over -O3. -Oz only saves about
# 100 KiB over -Os, which does not justify the negative impact on
# run-time performance.
env . Append ( CCFLAGS = [ ' -Os ' ] )
env . Append ( LINKFLAGS = [ ' -Os ' ] )
2018-05-14 13:11:42 +00:00
if env [ ' target ' ] == ' release_debug ' :
env . Append ( CPPDEFINES = [ ' DEBUG_ENABLED ' ] )
# Retain function names for backtraces at the cost of file size.
env . Append ( LINKFLAGS = [ ' --profiling-funcs ' ] )
else :
2018-03-21 14:51:44 +00:00
env . Append ( CPPDEFINES = [ ' DEBUG_ENABLED ' ] )
env . Append ( CCFLAGS = [ ' -O1 ' , ' -g ' ] )
2017-06-30 17:21:38 +00:00
env . Append ( LINKFLAGS = [ ' -O1 ' , ' -g ' ] )
2018-03-18 20:33:54 +00:00
env . Append ( LINKFLAGS = [ ' -s ' , ' ASSERTIONS=1 ' ] )
2017-06-30 17:21:38 +00:00
## Compiler configuration
env [ ' ENV ' ] = os . environ
2018-03-28 04:10:11 +00:00
em_config_file = os . getenv ( ' EM_CONFIG ' ) or os . path . expanduser ( ' ~/.emscripten ' )
if not os . path . exists ( em_config_file ) :
raise RuntimeError ( " Emscripten configuration file ' %s ' does not exist " % em_config_file )
with open ( em_config_file ) as f :
em_config = { }
try :
# Emscripten configuration file is a Python file with simple assignments.
exec ( f . read ( ) , em_config )
except StandardError as e :
raise RuntimeError ( " Emscripten configuration file ' %s ' is invalid: \n %s " % ( em_config_file , e ) )
2019-07-09 16:57:26 +00:00
if ' BINARYEN_ROOT ' in em_config and os . path . isdir ( os . path . join ( em_config . get ( ' BINARYEN_ROOT ' ) , ' emscripten ' ) ) :
# New style, emscripten path as a subfolder of BINARYEN_ROOT
env . PrependENVPath ( ' PATH ' , os . path . join ( em_config . get ( ' BINARYEN_ROOT ' ) , ' emscripten ' ) )
elif ' EMSCRIPTEN_ROOT ' in em_config :
# Old style (but can be there as a result from previous activation, so do last)
env . PrependENVPath ( ' PATH ' , em_config . get ( ' EMSCRIPTEN_ROOT ' ) )
else :
2019-06-04 16:45:49 +00:00
raise RuntimeError ( " ' BINARYEN_ROOT ' or ' EMSCRIPTEN_ROOT ' missing in Emscripten configuration file ' %s ' " % em_config_file )
2017-06-30 17:21:38 +00:00
2018-03-21 14:51:44 +00:00
env [ ' CC ' ] = ' emcc '
env [ ' CXX ' ] = ' em++ '
env [ ' LINK ' ] = ' emcc '
2015-03-20 02:17:06 +00:00
2019-11-15 08:39:18 +00:00
env [ ' AR ' ] = ' emar '
2018-03-21 14:51:44 +00:00
env [ ' RANLIB ' ] = ' emranlib '
# Use TempFileMunge since some AR invocations are too long for cmd.exe.
# Use POSIX-style paths, required with TempFileMunge.
env [ ' ARCOM_POSIX ' ] = env [ ' ARCOM ' ] . replace (
' $TARGET ' , ' $TARGET.posix ' ) . replace (
' $SOURCES ' , ' $SOURCES.posix ' )
env [ ' ARCOM ' ] = ' $ { TEMPFILE(ARCOM_POSIX)} '
# All intermediate files are just LLVM bitcode.
env [ ' OBJPREFIX ' ] = ' '
2017-02-20 12:36:54 +00:00
env [ ' OBJSUFFIX ' ] = ' .bc '
2018-03-21 14:51:44 +00:00
env [ ' PROGPREFIX ' ] = ' '
# Program() output consists of multiple files, so specify suffixes manually at builder.
env [ ' PROGSUFFIX ' ] = ' '
env [ ' LIBPREFIX ' ] = ' lib '
2017-02-21 21:47:33 +00:00
env [ ' LIBSUFFIX ' ] = ' .bc '
2018-03-21 14:51:44 +00:00
env [ ' LIBPREFIXES ' ] = [ ' $LIBPREFIX ' ]
env [ ' LIBSUFFIXES ' ] = [ ' $LIBSUFFIX ' ]
2015-03-20 02:17:06 +00:00
2017-06-30 17:21:38 +00:00
## Compile flags
2016-10-30 17:44:57 +00:00
2019-04-30 11:12:02 +00:00
env . Prepend ( CPPPATH = [ ' #platform/javascript ' ] )
2018-03-21 14:51:44 +00:00
env . Append ( CPPDEFINES = [ ' JAVASCRIPT_ENABLED ' , ' UNIX_ENABLED ' ] )
2016-10-30 17:44:57 +00:00
2018-03-21 14:51:44 +00:00
# No multi-threading (SharedArrayBuffer) available yet,
# once feasible also consider memory buffer size issues.
env . Append ( CPPDEFINES = [ ' NO_THREADS ' ] )
2019-05-20 14:47:32 +00:00
# Disable exceptions and rtti on non-tools (template) builds
if not env [ ' tools ' ] :
# These flags help keep the file size down.
env . Append ( CCFLAGS = [ ' -fno-exceptions ' , ' -fno-rtti ' ] )
# Don't use dynamic_cast, necessary with no-rtti.
env . Append ( CPPDEFINES = [ ' NO_SAFE_CAST ' ] )
2017-06-30 17:21:38 +00:00
2017-09-25 04:37:17 +00:00
if env [ ' javascript_eval ' ] :
2018-03-21 14:51:44 +00:00
env . Append ( CPPDEFINES = [ ' JAVASCRIPT_EVAL_ENABLED ' ] )
2017-06-30 17:21:38 +00:00
## Link flags
2019-11-19 08:44:04 +00:00
# We use IDBFS in javascript_main.cpp. Since Emscripten 1.39.1 it needs to
# be linked explicitly.
env . Append ( LIBS = [ ' idbfs.js ' ] )
2017-11-18 04:50:26 +00:00
env . Append ( LINKFLAGS = [ ' -s ' , ' BINARYEN=1 ' ] )
2018-03-21 14:51:44 +00:00
2019-12-02 13:10:46 +00:00
# This needs to be defined for Emscripten using 'fastcomp' (default pre-1.39.0)
# and undefined if using 'upstream'. And to make things simple, earlier
# Emscripten versions didn't include 'fastcomp' in their path, so we check
# against the presence of 'upstream' to conditionally add the flag.
if not " upstream " in em_config [ ' EMSCRIPTEN_ROOT ' ] :
env . Append ( LINKFLAGS = [ ' -s ' , ' BINARYEN_TRAP_MODE= \' clamp \' ' ] )
2018-03-21 14:51:44 +00:00
# Allow increasing memory buffer size during runtime. This is efficient
# when using WebAssembly (in comparison to asm.js) and works well for
# us since we don't know requirements at compile-time.
2017-11-18 04:50:26 +00:00
env . Append ( LINKFLAGS = [ ' -s ' , ' ALLOW_MEMORY_GROWTH=1 ' ] )
2018-03-21 14:51:44 +00:00
# This setting just makes WebGL 2 APIs available, it does NOT disable WebGL 1.
2017-11-19 14:30:09 +00:00
env . Append ( LINKFLAGS = [ ' -s ' , ' USE_WEBGL2=1 ' ] )
2018-03-21 14:51:44 +00:00
2017-11-19 14:30:09 +00:00
env . Append ( LINKFLAGS = [ ' -s ' , ' INVOKE_RUN=0 ' ] )
2018-03-21 14:51:44 +00:00
# TODO: Reevaluate usage of this setting now that engine.js manages engine runtime.
2017-11-19 14:30:09 +00:00
env . Append ( LINKFLAGS = [ ' -s ' , ' NO_EXIT_RUNTIME=1 ' ] )
2019-08-12 18:59:27 +00:00
#adding flag due to issue with emscripten 1.38.41 callMain method https://github.com/emscripten-core/emscripten/blob/incoming/ChangeLog.md#v13841-08072019
env . Append ( LINKFLAGS = [ ' -s ' , ' EXTRA_EXPORTED_RUNTIME_METHODS=[ " callMain " ] ' ] )