2014-02-10 02:10:30 +01:00
import os
2016-10-30 19:05:14 +01:00
2014-02-10 02:10:30 +01:00
def is_active ( ) :
2016-10-30 18:44:57 +01:00
return True
2016-04-02 20:26:12 +02:00
2016-10-30 19:05:14 +01:00
2014-02-10 02:10:30 +01:00
def get_name ( ) :
2020-03-30 08:28:32 +02:00
return " JavaScript "
2014-02-10 02:10:30 +01:00
2016-10-30 19:05:14 +01:00
2014-02-10 02:10:30 +01:00
def can_build ( ) :
2020-03-30 08:28:32 +02:00
return " EM_CONFIG " in os . environ or os . path . exists ( os . path . expanduser ( " ~/.emscripten " ) )
2014-02-10 02:10:30 +01:00
2016-10-30 19:05:14 +01:00
2014-02-10 02:10:30 +01:00
def get_opts ( ) :
2017-09-25 06:37:17 +02:00
from SCons . Variables import BoolVariable
2020-03-30 08:28:32 +02:00
2016-10-30 18:44:57 +01:00
return [
2018-03-21 15:51:44 +01:00
# eval() can be a security concern, so it can be disabled.
2020-03-30 08:28:32 +02:00
BoolVariable ( " javascript_eval " , " Enable JavaScript eval interface " , True ) ,
2016-10-30 18:44:57 +01:00
]
2014-02-10 02:10:30 +01:00
2016-10-30 19:05:14 +01:00
2014-02-10 02:10:30 +01:00
def get_flags ( ) :
2016-10-30 18:44:57 +01:00
return [
2020-03-30 08:28:32 +02:00
( " tools " , False ) ,
( " builtin_pcre2_with_jit " , False ) ,
2018-02-08 22:00:55 +01:00
# Disabling the mbedtls module reduces file size.
2018-01-25 09:07:07 +01:00
# The module has little use due to the limited networking functionality
# in this platform. For the available networking methods, the browser
# manages TLS.
2020-03-30 08:28:32 +02:00
( " module_mbedtls_enabled " , False ) ,
2016-10-30 18:44:57 +01:00
]
2014-02-10 02:10:30 +01:00
def configure ( env ) :
2016-06-14 16:27:16 +02:00
2017-06-30 19:21:38 +02:00
## Build type
2020-03-30 08:28:32 +02:00
if env [ " target " ] != " debug " :
2018-01-07 00:13:04 +01: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.
2020-03-30 08:28:32 +02:00
env . Append ( CCFLAGS = [ " -Os " ] )
env . Append ( LINKFLAGS = [ " -Os " ] )
if env [ " target " ] == " release_debug " :
env . Append ( CPPDEFINES = [ " DEBUG_ENABLED " ] )
2018-05-14 15:11:42 +02:00
# Retain function names for backtraces at the cost of file size.
2020-03-30 08:28:32 +02:00
env . Append ( LINKFLAGS = [ " --profiling-funcs " ] )
2018-05-14 15:11:42 +02:00
else :
2020-03-30 08:28:32 +02:00
env . Append ( CPPDEFINES = [ " DEBUG_ENABLED " ] )
env . Append ( CCFLAGS = [ " -O1 " , " -g " ] )
env . Append ( LINKFLAGS = [ " -O1 " , " -g " ] )
env . Append ( LINKFLAGS = [ " -s " , " ASSERTIONS=1 " ] )
2017-06-30 19:21:38 +02:00
## Compiler configuration
2020-03-30 08:28:32 +02:00
env [ " ENV " ] = os . environ
2018-03-28 06:10:11 +02:00
2020-03-30 08:28:32 +02:00
em_config_file = os . getenv ( " EM_CONFIG " ) or os . path . expanduser ( " ~/.emscripten " )
2018-03-28 06:10:11 +02:00
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 ) )
2020-03-30 08:28:32 +02:00
if " BINARYEN_ROOT " in em_config and os . path . isdir ( os . path . join ( em_config . get ( " BINARYEN_ROOT " ) , " emscripten " ) ) :
2019-07-09 18:57:26 +02:00
# New style, emscripten path as a subfolder of BINARYEN_ROOT
2020-03-30 08:28:32 +02:00
env . PrependENVPath ( " PATH " , os . path . join ( em_config . get ( " BINARYEN_ROOT " ) , " emscripten " ) )
elif " EMSCRIPTEN_ROOT " in em_config :
2019-07-09 18:57:26 +02:00
# Old style (but can be there as a result from previous activation, so do last)
2020-03-30 08:28:32 +02:00
env . PrependENVPath ( " PATH " , em_config . get ( " EMSCRIPTEN_ROOT " ) )
2019-07-09 18:57:26 +02:00
else :
2020-03-30 08:28:32 +02:00
raise RuntimeError (
" ' BINARYEN_ROOT ' or ' EMSCRIPTEN_ROOT ' missing in Emscripten configuration file ' %s ' " % em_config_file
)
2017-06-30 19:21:38 +02:00
2020-03-30 08:28:32 +02:00
env [ " CC " ] = " emcc "
env [ " CXX " ] = " em++ "
env [ " LINK " ] = " emcc "
2015-03-20 03:17:06 +01:00
2020-03-30 08:28:32 +02:00
env [ " AR " ] = " emar "
env [ " RANLIB " ] = " emranlib "
2018-03-21 15:51:44 +01:00
# Use TempFileMunge since some AR invocations are too long for cmd.exe.
# Use POSIX-style paths, required with TempFileMunge.
2020-03-30 08:28:32 +02:00
env [ " ARCOM_POSIX " ] = env [ " ARCOM " ] . replace ( " $TARGET " , " $TARGET.posix " ) . replace ( " $SOURCES " , " $SOURCES.posix " )
env [ " ARCOM " ] = " $ { TEMPFILE(ARCOM_POSIX)} "
2018-03-21 15:51:44 +01:00
# All intermediate files are just LLVM bitcode.
2020-03-30 08:28:32 +02:00
env [ " OBJPREFIX " ] = " "
env [ " OBJSUFFIX " ] = " .bc "
env [ " PROGPREFIX " ] = " "
2018-03-21 15:51:44 +01:00
# Program() output consists of multiple files, so specify suffixes manually at builder.
2020-03-30 08:28:32 +02:00
env [ " PROGSUFFIX " ] = " "
env [ " LIBPREFIX " ] = " lib "
env [ " LIBSUFFIX " ] = " .bc "
env [ " LIBPREFIXES " ] = [ " $LIBPREFIX " ]
env [ " LIBSUFFIXES " ] = [ " $LIBSUFFIX " ]
2015-03-20 03:17:06 +01:00
2017-06-30 19:21:38 +02:00
## Compile flags
2016-10-30 18:44:57 +01:00
2020-03-30 08:28:32 +02:00
env . Prepend ( CPPPATH = [ " #platform/javascript " ] )
env . Append ( CPPDEFINES = [ " JAVASCRIPT_ENABLED " , " UNIX_ENABLED " ] )
2016-10-30 18:44:57 +01:00
2018-03-21 15:51:44 +01:00
# No multi-threading (SharedArrayBuffer) available yet,
# once feasible also consider memory buffer size issues.
2020-03-30 08:28:32 +02:00
env . Append ( CPPDEFINES = [ " NO_THREADS " ] )
2018-03-21 15:51:44 +01:00
2019-05-20 16:47:32 +02:00
# Disable exceptions and rtti on non-tools (template) builds
2020-03-30 08:28:32 +02:00
if not env [ " tools " ] :
2019-05-20 16:47:32 +02:00
# These flags help keep the file size down.
2020-03-30 08:28:32 +02:00
env . Append ( CCFLAGS = [ " -fno-exceptions " , " -fno-rtti " ] )
2019-05-20 16:47:32 +02:00
# Don't use dynamic_cast, necessary with no-rtti.
2020-03-30 08:28:32 +02:00
env . Append ( CPPDEFINES = [ " NO_SAFE_CAST " ] )
2017-06-30 19:21:38 +02:00
2020-03-30 08:28:32 +02:00
if env [ " javascript_eval " ] :
env . Append ( CPPDEFINES = [ " JAVASCRIPT_EVAL_ENABLED " ] )
2017-06-30 19:21:38 +02:00
## Link flags
2019-11-19 09:44:04 +01:00
# We use IDBFS in javascript_main.cpp. Since Emscripten 1.39.1 it needs to
# be linked explicitly.
2020-03-30 08:28:32 +02:00
env . Append ( LIBS = [ " idbfs.js " ] )
2019-11-19 09:44:04 +01:00
2020-03-30 08:28:32 +02:00
env . Append ( LINKFLAGS = [ " -s " , " BINARYEN=1 " ] )
2018-03-21 15:51:44 +01:00
2020-01-22 22:18:02 +01:00
# Only include the JavaScript support code for the web environment
# (i.e. exclude Node.js and other unused environments).
# This makes the JavaScript support code about 4 KB smaller.
2020-03-30 08:28:32 +02:00
env . Append ( LINKFLAGS = [ " -s " , " ENVIRONMENT=web " ] )
2020-01-22 22:18:02 +01:00
2019-12-02 14:10:46 +01: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.
2020-03-30 08:28:32 +02:00
if not " upstream " in em_config [ " EMSCRIPTEN_ROOT " ] :
env . Append ( LINKFLAGS = [ " -s " , " BINARYEN_TRAP_MODE= ' clamp ' " ] )
2019-12-02 14:10:46 +01:00
2018-03-21 15:51:44 +01: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.
2020-03-30 08:28:32 +02:00
env . Append ( LINKFLAGS = [ " -s " , " ALLOW_MEMORY_GROWTH=1 " ] )
2018-03-21 15:51:44 +01:00
# This setting just makes WebGL 2 APIs available, it does NOT disable WebGL 1.
2020-03-30 08:28:32 +02:00
env . Append ( LINKFLAGS = [ " -s " , " USE_WEBGL2=1 " ] )
2018-03-21 15:51:44 +01:00
2020-03-30 08:28:32 +02:00
env . Append ( LINKFLAGS = [ " -s " , " INVOKE_RUN=0 " ] )
2018-03-21 15:51:44 +01:00
# TODO: Reevaluate usage of this setting now that engine.js manages engine runtime.
2020-03-30 08:28:32 +02:00
env . Append ( LINKFLAGS = [ " -s " , " NO_EXIT_RUNTIME=1 " ] )
2019-08-12 20:59:27 +02:00
2020-03-30 08:28:32 +02: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 " ] ' ] )