2014-02-09 22:10:30 -03:00
import os
import string
2017-06-30 19:21:38 +02:00
import sys
2014-02-09 22:10:30 -03:00
2016-10-30 19:05:14 +01:00
2014-02-09 22:10:30 -03: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-09 22:10:30 -03:00
def get_name ( ) :
2016-10-30 18:44:57 +01:00
return " JavaScript "
2014-02-09 22:10:30 -03:00
2016-10-30 19:05:14 +01:00
2014-02-09 22:10:30 -03:00
def can_build ( ) :
2017-06-30 19:21:38 +02:00
2017-10-28 16:24:44 -03:00
return ( " EMSCRIPTEN_ROOT " in os . environ or " EMSCRIPTEN " in os . environ )
2014-02-09 22:10:30 -03:00
2016-10-30 19:05:14 +01:00
2014-02-09 22:10:30 -03:00
def get_opts ( ) :
2017-09-25 00:37:17 -04:00
from SCons . Variables import BoolVariable
2016-10-30 18:44:57 +01:00
return [
2017-09-25 00:37:17 -04:00
BoolVariable ( ' javascript_eval ' , ' Enable JavaScript eval interface ' , True ) ,
2016-10-30 18:44:57 +01:00
]
2014-02-09 22:10:30 -03:00
2016-10-30 19:05:14 +01:00
2014-02-09 22:10:30 -03:00
def get_flags ( ) :
2016-10-30 18:44:57 +01:00
return [
2017-09-25 00:04:49 -04:00
( ' tools ' , False ) ,
2018-01-25 09:07:07 +01:00
# Disabling the OpenSSL module noticeably reduces file size.
# The module has little use due to the limited networking functionality
# in this platform. For the available networking methods, the browser
# manages TLS.
( ' module_openssl_enabled ' , False ) ,
2016-10-30 18:44:57 +01:00
]
2014-02-09 22:10:30 -03:00
2017-02-21 22:47:33 +01:00
def create ( env ) :
2017-06-30 19:21:38 +02:00
2017-02-21 22:47:33 +01:00
# remove Windows' .exe suffix
2017-03-10 05:09:54 +01:00
return env . Clone ( tools = [ ' textfile ' , ' zip ' ] , PROGSUFFIX = ' ' )
2017-02-21 22:47:33 +01:00
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 ( ' \\ ' , ' \\ \\ ' )
2014-02-09 22:10:30 -03:00
def configure ( env ) :
2016-06-14 11:27:16 -03:00
2017-06-30 19:21:38 +02:00
## Build type
if ( env [ " target " ] == " release " ) :
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.
env . Append ( CCFLAGS = [ ' -Os ' ] )
env . Append ( LINKFLAGS = [ ' -Os ' ] )
2015-03-20 07:47:06 +05:30
2017-06-30 19:21:38 +02:00
elif ( env [ " target " ] == " release_debug " ) :
env . Append ( CCFLAGS = [ ' -O2 ' , ' -DDEBUG_ENABLED ' ] )
2018-03-18 21:33:54 +01:00
env . Append ( LINKFLAGS = [ ' -O2 ' ] )
2017-06-30 19:21:38 +02:00
# 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 ' ] )
2018-03-18 21:33:54 +01:00
env . Append ( LINKFLAGS = [ ' -s ' , ' ASSERTIONS=1 ' ] )
2017-06-30 19:21:38 +02:00
## Compiler configuration
env [ ' ENV ' ] = os . environ
2017-10-28 16:24:44 -03:00
if ( " EMSCRIPTEN_ROOT " in os . environ ) :
env . PrependENVPath ( ' PATH ' , os . environ [ ' EMSCRIPTEN_ROOT ' ] )
elif ( " EMSCRIPTEN " in os . environ ) :
env . PrependENVPath ( ' PATH ' , os . environ [ ' EMSCRIPTEN ' ] )
2017-02-21 22:47:33 +01:00
env [ ' CC ' ] = ' emcc '
env [ ' CXX ' ] = ' em++ '
env [ ' LINK ' ] = ' emcc '
env [ ' RANLIB ' ] = ' emranlib '
2019-11-15 09:39:18 +01:00
env [ ' AR ' ] = ' emar '
2017-02-21 22:47:33 +01:00
env [ ' ARFLAGS ' ] = ' -o '
2017-06-30 19:21:38 +02:00
2017-02-21 22:47:33 +01:00
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 ' )
2015-03-20 07:47:06 +05:30
2017-02-20 13:36:54 +01:00
env [ ' OBJSUFFIX ' ] = ' .bc '
2017-02-21 22:47:33 +01:00
env [ ' LIBSUFFIX ' ] = ' .bc '
2015-03-20 07:47:06 +05:30
2017-06-30 19:21:38 +02:00
## Compile flags
2016-10-30 18:44:57 +01:00
2017-06-30 19:21:38 +02:00
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 ' ] )
2016-10-30 18:44:57 +01:00
2016-11-11 03:58:03 +01:00
# These flags help keep the file size down
2016-10-30 18:57:40 +01:00
env . Append ( CPPFLAGS = [ " -fno-exceptions " , ' -DNO_SAFE_CAST ' , ' -fno-rtti ' ] )
2017-06-30 19:21:38 +02:00
2017-09-25 00:37:17 -04:00
if env [ ' javascript_eval ' ] :
2017-06-30 19:21:38 +02:00
env . Append ( CPPFLAGS = [ ' -DJAVASCRIPT_EVAL_ENABLED ' ] )
## Link flags
2017-11-18 05:50:26 +01:00
env . Append ( LINKFLAGS = [ ' -s ' , ' BINARYEN=1 ' ] )
env . Append ( LINKFLAGS = [ ' -s ' , ' ALLOW_MEMORY_GROWTH=1 ' ] )
2017-11-19 15:30:09 +01:00
env . Append ( LINKFLAGS = [ ' -s ' , ' USE_WEBGL2=1 ' ] )
env . Append ( LINKFLAGS = [ ' -s ' , ' INVOKE_RUN=0 ' ] )
env . Append ( LINKFLAGS = [ ' -s ' , ' NO_EXIT_RUNTIME=1 ' ] )
2016-10-30 23:10:17 +01:00
2019-08-12 21:59:27 +03: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 " ] ' ] )
2017-06-30 19:21:38 +02:00
# TODO: Move that to opus module's config
2017-09-25 00:27:32 -04:00
if ' module_opus_enabled ' in env and env [ ' module_opus_enabled ' ] :
2017-06-30 19:21:38 +02:00
env . opus_fixed_point = " yes "