2016-04-02 20:26:12 +02:00
#
2015-10-01 21:25:36 +02:00
# tested on | Windows native | Linux cross-compilation
# ------------------------+-------------------+---------------------------
# MSVS C++ 2010 Express | WORKS | n/a
# Mingw-w64 | WORKS | WORKS
# Mingw-w32 | WORKS | WORKS
# MinGW | WORKS | untested
#
#####
# Notes about MSVS C++ :
#
# - MSVC2010-Express compiles to 32bits only.
#
#####
# Notes about Mingw-w64 and Mingw-w32 under Windows :
#
# - both can be installed using the official installer :
# http://mingw-w64.sourceforge.net/download.php#mingw-builds
#
# - if you want to compile both 32bits and 64bits, don't forget to
# run the installer twice to install them both.
#
# - install them into a path that does not contain spaces
# ( example : "C:/Mingw-w32", "C:/Mingw-w64" )
#
# - if you want to compile faster using the "-j" option, don't forget
2016-04-02 20:26:12 +02:00
# to install the appropriate version of the Pywin32 python extension
2015-10-01 21:25:36 +02:00
# available from : http://sourceforge.net/projects/pywin32/files/
#
2016-04-02 20:26:12 +02:00
# - before running scons, you must add into the environment path
# the path to the "/bin" directory of the Mingw version you want
2015-10-01 21:25:36 +02:00
# to use :
#
# set PATH=C:/Mingw-w32/bin;%PATH%
#
# - then, scons should be able to detect gcc.
# - Mingw-w32 only compiles 32bits.
# - Mingw-w64 only compiles 64bits.
#
2016-04-02 20:26:12 +02:00
# - it is possible to add them both at the same time into the PATH env,
# if you also define the MINGW32_PREFIX and MINGW64_PREFIX environment
# variables.
2015-10-01 21:25:36 +02:00
# For instance, you could store that set of commands into a .bat script
# that you would run just before scons :
#
# set PATH=C:\mingw-w32\bin;%PATH%
# set PATH=C:\mingw-w64\bin;%PATH%
# set MINGW32_PREFIX=C:\mingw-w32\bin\
# set MINGW64_PREFIX=C:\mingw-w64\bin\
#
#####
# Notes about Mingw, Mingw-w64 and Mingw-w32 under Linux :
#
# - default toolchain prefixes are :
# "i586-mingw32msvc-" for MinGW
# "i686-w64-mingw32-" for Mingw-w32
# "x86_64-w64-mingw32-" for Mingw-w64
#
# - if both MinGW and Mingw-w32 are installed on your system
# Mingw-w32 should take the priority over MinGW.
#
# - it is possible to manually override prefixes by defining
# the MINGW32_PREFIX and MINGW64_PREFIX environment variables.
2016-04-02 20:26:12 +02:00
#
2015-10-01 21:25:36 +02:00
#####
# Notes about Mingw under Windows :
#
2016-04-02 20:26:12 +02:00
# - this is the MinGW version from http://mingw.org/
2015-10-01 21:25:36 +02:00
# - install it into a path that does not contain spaces
# ( example : "C:/MinGW" )
2016-04-02 20:26:12 +02:00
# - several DirectX headers might be missing. You can copy them into
2015-10-01 21:25:36 +02:00
# the C:/MinGW/include" directory from this page :
# https://code.google.com/p/mingw-lib/source/browse/trunk/working/avcodec_to_widget_5/directx_include/
# - before running scons, add the path to the "/bin" directory :
# set PATH=C:/MinGW/bin;%PATH%
# - scons should be able to detect gcc.
#
#####
# TODO :
#
# - finish to cleanup this script to remove all the remains of previous hacks and workarounds
# - make it work with the Windows7 SDK that is supposed to enable 64bits compilation for MSVC2010-Express
# - confirm it works well with other Visual Studio versions.
# - update the wiki about the pywin32 extension required for the "-j" option under Windows.
# - update the wiki to document MINGW32_PREFIX and MINGW64_PREFIX
2016-04-02 20:26:12 +02:00
#
2015-10-01 21:25:36 +02:00
import os
2015-11-08 23:53:58 +01:00
import sys
2015-10-01 21:25:36 +02:00
def is_active ( ) :
2016-11-02 22:26:55 +01:00
return True
2016-04-02 20:26:12 +02:00
2016-11-02 22:29:36 +01:00
2015-10-01 21:25:36 +02:00
def get_name ( ) :
2016-11-02 22:26:55 +01:00
return " Windows "
2015-10-01 21:25:36 +02:00
2016-11-02 22:29:36 +01:00
2015-10-01 21:25:36 +02:00
def can_build ( ) :
2016-04-02 20:26:12 +02:00
2016-11-02 22:28:28 +01:00
if ( os . name == " nt " ) :
# building natively on windows!
2016-11-02 22:26:55 +01:00
if ( os . getenv ( " VSINSTALLDIR " ) ) :
return True
else :
print ( " \n MSVC not detected, attempting Mingw. " )
mingw32 = " "
mingw64 = " "
2016-11-02 22:28:28 +01:00
if ( os . getenv ( " MINGW32_PREFIX " ) ) :
2016-11-02 22:26:55 +01:00
mingw32 = os . getenv ( " MINGW32_PREFIX " )
2016-11-02 22:28:28 +01:00
if ( os . getenv ( " MINGW64_PREFIX " ) ) :
2016-11-02 22:26:55 +01:00
mingw64 = os . getenv ( " MINGW64_PREFIX " )
test = " gcc --version > NUL 2>&1 "
2016-11-02 22:28:28 +01:00
if os . system ( test ) != 0 and os . system ( mingw32 + test ) != 0 and os . system ( mingw64 + test ) != 0 :
2016-11-02 22:26:55 +01:00
print ( " - could not detect gcc. " )
print ( " Please, make sure a path to a Mingw /bin directory is accessible into the environment PATH. \n " )
return False
else :
print ( " - gcc detected. " )
return True
2016-11-02 22:28:28 +01:00
if ( os . name == " posix " ) :
2016-11-02 22:26:55 +01:00
mingw = " i586-mingw32msvc- "
mingw64 = " x86_64-w64-mingw32- "
mingw32 = " i686-w64-mingw32- "
if ( os . getenv ( " MINGW32_PREFIX " ) ) :
2016-11-02 22:28:28 +01:00
mingw32 = os . getenv ( " MINGW32_PREFIX " )
2016-11-02 22:26:55 +01:00
mingw = mingw32
if ( os . getenv ( " MINGW64_PREFIX " ) ) :
2016-11-02 22:28:28 +01:00
mingw64 = os . getenv ( " MINGW64_PREFIX " )
2016-11-02 22:26:55 +01:00
test = " gcc --version &>/dev/null "
2016-11-02 22:28:28 +01:00
if ( os . system ( mingw + test ) == 0 or os . system ( mingw64 + test ) == 0 or os . system ( mingw32 + test ) == 0 ) :
2016-11-02 22:26:55 +01:00
return True
return False
2016-04-02 20:26:12 +02:00
2016-11-02 22:29:36 +01:00
2015-10-01 21:25:36 +02:00
def get_opts ( ) :
2016-11-02 22:28:28 +01:00
mingw = " "
mingw32 = " "
mingw64 = " "
if ( os . name == " posix " ) :
2016-11-02 22:26:55 +01:00
mingw = " i586-mingw32msvc- "
mingw32 = " i686-w64-mingw32- "
mingw64 = " x86_64-w64-mingw32- "
2016-04-02 20:26:12 +02:00
2016-11-02 22:28:28 +01:00
if os . system ( mingw32 + " gcc --version &>/dev/null " ) != 0 :
2016-11-02 22:26:55 +01:00
mingw32 = mingw
2016-04-02 20:26:12 +02:00
2016-11-02 22:26:55 +01:00
if ( os . getenv ( " MINGW32_PREFIX " ) ) :
2016-11-02 22:28:28 +01:00
mingw32 = os . getenv ( " MINGW32_PREFIX " )
2016-11-02 22:26:55 +01:00
mingw = mingw32
if ( os . getenv ( " MINGW64_PREFIX " ) ) :
2016-11-02 22:28:28 +01:00
mingw64 = os . getenv ( " MINGW64_PREFIX " )
2015-10-01 21:25:36 +02:00
2016-11-02 22:26:55 +01:00
return [
2016-11-02 22:28:28 +01:00
( ' mingw_prefix ' , ' Mingw Prefix ' , mingw32 ) ,
( ' mingw_prefix_64 ' , ' Mingw Prefix 64 bits ' , mingw64 ) ,
2016-11-02 22:26:55 +01:00
]
2016-04-02 20:26:12 +02:00
2016-11-02 22:29:36 +01:00
2015-10-01 21:25:36 +02:00
def get_flags ( ) :
2016-11-02 22:26:55 +01:00
return [
]
2016-04-02 20:26:12 +02:00
2016-11-02 22:29:36 +01:00
2016-11-02 22:28:28 +01:00
def build_res_file ( target , source , env ) :
2015-10-01 21:25:36 +02:00
2016-11-02 22:26:55 +01:00
cmdbase = " "
if ( env [ " bits " ] == " 32 " ) :
cmdbase = env [ ' mingw_prefix ' ]
else :
cmdbase = env [ ' mingw_prefix_64 ' ]
CPPPATH = env [ ' CPPPATH ' ]
cmdbase = cmdbase + ' windres --include-dir . '
import subprocess
for x in range ( len ( source ) ) :
cmd = cmdbase + ' -i ' + str ( source [ x ] ) + ' -o ' + str ( target [ x ] )
try :
2016-11-02 22:28:28 +01:00
out = subprocess . Popen ( cmd , shell = True , stderr = subprocess . PIPE ) . communicate ( )
2016-11-02 22:26:55 +01:00
if len ( out [ 1 ] ) :
return 1
except :
return 1
return 0
2015-10-01 21:25:36 +02:00
2016-11-02 22:29:36 +01:00
2015-10-01 21:25:36 +02:00
def configure ( env ) :
2016-11-02 22:26:55 +01:00
env . Append ( CPPPATH = [ ' #platform/windows ' ] )
2016-11-02 22:28:28 +01:00
env [ ' is_mingw ' ] = False
if ( os . name == " nt " and os . getenv ( " VSINSTALLDIR " ) != None ) :
# build using visual studio
2016-11-02 22:26:55 +01:00
env [ ' ENV ' ] [ ' TMP ' ] = os . environ [ ' TMP ' ]
env . Append ( CPPPATH = [ ' #platform/windows/include ' ] )
env . Append ( LIBPATH = [ ' #platform/windows/lib ' ] )
2016-11-02 22:28:28 +01:00
if ( env [ " target " ] == " release " ) :
2016-11-02 22:26:55 +01:00
env . Append ( CCFLAGS = [ ' /O2 ' ] )
env . Append ( LINKFLAGS = [ ' /SUBSYSTEM:WINDOWS ' ] )
env . Append ( LINKFLAGS = [ ' /ENTRY:mainCRTStartup ' ] )
2016-11-02 22:28:28 +01:00
elif ( env [ " target " ] == " release_debug " ) :
2016-11-02 22:26:55 +01:00
2016-11-02 22:28:28 +01:00
env . Append ( CCFLAGS = [ ' /O2 ' , ' /DDEBUG_ENABLED ' ] )
2016-11-02 22:26:55 +01:00
env . Append ( LINKFLAGS = [ ' /SUBSYSTEM:CONSOLE ' ] )
2016-11-02 22:28:28 +01:00
elif ( env [ " target " ] == " debug_release " ) :
2016-11-02 22:26:55 +01:00
2016-11-02 22:28:28 +01:00
env . Append ( CCFLAGS = [ ' /Z7 ' , ' /Od ' ] )
2016-11-02 22:26:55 +01:00
env . Append ( LINKFLAGS = [ ' /DEBUG ' ] )
env . Append ( LINKFLAGS = [ ' /SUBSYSTEM:WINDOWS ' ] )
env . Append ( LINKFLAGS = [ ' /ENTRY:mainCRTStartup ' ] )
2016-11-02 22:28:28 +01:00
elif ( env [ " target " ] == " debug " ) :
2016-11-02 22:26:55 +01:00
2016-11-02 22:28:28 +01:00
env . Append ( CCFLAGS = [ ' /Z7 ' , ' /DDEBUG_ENABLED ' , ' /DDEBUG_MEMORY_ENABLED ' , ' /DD3D_DEBUG_INFO ' , ' /Od ' ] )
2016-11-02 22:26:55 +01:00
env . Append ( LINKFLAGS = [ ' /SUBSYSTEM:CONSOLE ' ] )
env . Append ( LINKFLAGS = [ ' /DEBUG ' ] )
2016-11-02 22:28:28 +01:00
env . Append ( CCFLAGS = [ ' /MT ' , ' /Gd ' , ' /GR ' , ' /nologo ' ] )
2016-11-02 22:26:55 +01:00
env . Append ( CXXFLAGS = [ ' /TP ' ] )
env . Append ( CPPFLAGS = [ ' /DMSVC ' , ' /GR ' , ] )
2016-11-02 22:28:28 +01:00
env . Append ( CCFLAGS = [ ' /I ' + os . getenv ( " WindowsSdkDir " ) + " /Include " ] )
2016-11-02 22:26:55 +01:00
env . Append ( CCFLAGS = [ ' /DWINDOWS_ENABLED ' ] )
env . Append ( CCFLAGS = [ ' /DRTAUDIO_ENABLED ' ] )
env . Append ( CCFLAGS = [ ' /DWIN32 ' ] )
env . Append ( CCFLAGS = [ ' /DTYPED_METHOD_BIND ' ] )
env . Append ( CCFLAGS = [ ' /DGLES2_ENABLED ' ] )
2016-11-02 22:28:28 +01:00
LIBS = [ ' winmm ' , ' opengl32 ' , ' dsound ' , ' kernel32 ' , ' ole32 ' , ' oleaut32 ' , ' user32 ' , ' gdi32 ' , ' IPHLPAPI ' , ' Shlwapi ' , ' wsock32 ' , ' shell32 ' , ' advapi32 ' , ' dinput8 ' , ' dxguid ' ]
env . Append ( LINKFLAGS = [ p + env [ " LIBSUFFIX " ] for p in LIBS ] )
2016-04-02 20:26:12 +02:00
2016-11-02 22:28:28 +01:00
env . Append ( LIBPATH = [ os . getenv ( " WindowsSdkDir " ) + " /Lib " ] )
2016-11-02 22:26:55 +01:00
if ( os . getenv ( " DXSDK_DIR " ) ) :
2016-11-02 22:28:28 +01:00
DIRECTX_PATH = os . getenv ( " DXSDK_DIR " )
2016-11-02 22:26:55 +01:00
else :
2016-11-02 22:28:28 +01:00
DIRECTX_PATH = " C:/Program Files/Microsoft DirectX SDK (March 2009) "
2015-10-01 21:25:36 +02:00
2016-11-02 22:26:55 +01:00
if ( os . getenv ( " VCINSTALLDIR " ) ) :
2016-11-02 22:28:28 +01:00
VC_PATH = os . getenv ( " VCINSTALLDIR " )
2016-11-02 22:26:55 +01:00
else :
2016-11-02 22:28:28 +01:00
VC_PATH = " "
2015-10-01 21:25:36 +02:00
2016-11-02 22:26:55 +01:00
env . Append ( CCFLAGS = [ " /I " + p for p in os . getenv ( " INCLUDE " ) . split ( " ; " ) ] )
env . Append ( LIBPATH = [ p for p in os . getenv ( " LIB " ) . split ( " ; " ) ] )
2016-11-02 22:28:28 +01:00
env . Append ( CCFLAGS = [ " /I " + DIRECTX_PATH + " /Include " ] )
env . Append ( LIBPATH = [ DIRECTX_PATH + " /Lib/x86 " ] )
2016-11-02 22:30:34 +01:00
env [ ' ENV ' ] = os . environ
2016-04-10 02:59:51 +02:00
2016-11-02 22:26:55 +01:00
# This detection function needs the tools env (that is env['ENV'], not SCons's env), and that is why it's this far bellow in the code
compiler_version_str = detect_visual_c_compiler_version ( env [ ' ENV ' ] )
2016-04-10 02:59:51 +02:00
2016-11-02 22:26:55 +01:00
# Note: this detection/override code from here onward should be here instead of in SConstruct because it's platform and compiler specific (MSVC/Windows)
if ( env [ " bits " ] != " default " ) :
print " Error: bits argument is disabled for MSVC "
print ( " Bits argument is not supported for MSVC compilation. Architecture depends on the Native/Cross Compile Tools Prompt/Developer Console (or Visual Studio settings) "
2016-11-02 22:28:28 +01:00
+ " that is being used to run SCons. As a consequence, bits argument is disabled. Run scons again without bits argument (example: scons p=windows) and SCons will attempt to detect what MSVC compiler "
+ " will be executed and inform you. " )
2016-11-02 22:26:55 +01:00
sys . exit ( )
2016-04-10 02:59:51 +02:00
2016-11-02 22:26:55 +01:00
# Forcing bits argument because MSVC does not have a flag to set this through SCons... it's different compilers (cl.exe's) called from the propper command prompt
# that decide the architecture that is build for. Scons can only detect the os.getenviron (because vsvarsall.bat sets a lot of stuff for cl.exe to work with)
2016-11-02 22:28:28 +01:00
env [ " bits " ] = " 32 "
env [ " x86_libtheora_opt_vc " ] = True
2016-10-16 22:22:21 +02:00
2016-11-02 22:28:28 +01:00
print " Detected MSVC compiler: " + compiler_version_str
2016-11-02 22:26:55 +01:00
# If building for 64bit architecture, disable assembly optimisations for 32 bit builds (theora as of writting)... vc compiler for 64bit can not compile _asm
if ( compiler_version_str == " amd64 " or compiler_version_str == " x86_amd64 " ) :
2016-11-02 22:28:28 +01:00
env [ " bits " ] = " 64 "
env [ " x86_libtheora_opt_vc " ] = False
2016-11-02 22:26:55 +01:00
print " Compiled program architecture will be a 64 bit executable (forcing bits=64). "
2016-11-02 22:28:28 +01:00
elif ( compiler_version_str == " x86 " or compiler_version_str == " amd64_x86 " ) :
2016-11-02 22:26:55 +01:00
print " Compiled program architecture will be a 32 bit executable. (forcing bits=32). "
else :
2016-11-02 22:28:28 +01:00
print " Failed to detect MSVC compiler architecture version... Defaulting to 32bit executable settings (forcing bits=32). Compilation attempt will continue, but SCons can not detect for what architecture this build is compiled for. You should check your settings/compilation setup. "
if env [ " bits " ] == " 64 " :
2016-11-02 22:26:55 +01:00
env . Append ( CCFLAGS = [ ' /D_WIN64 ' ] )
else :
2015-10-01 21:25:36 +02:00
2016-11-02 22:26:55 +01:00
# Workaround for MinGW. See:
# http://www.scons.org/wiki/LongCmdLinesOnWin32
env . use_windows_spawn_fix ( )
2015-10-01 21:25:36 +02:00
2016-11-02 22:28:28 +01:00
# build using mingw
if ( os . name == " nt " ) :
env [ ' ENV ' ] [ ' TMP ' ] = os . environ [ ' TMP ' ] # way to go scons, you can be so stupid sometimes
2016-11-02 22:26:55 +01:00
else :
2016-11-02 22:28:28 +01:00
env [ " PROGSUFFIX " ] = env [ " PROGSUFFIX " ] + " .exe " # for linux cross-compilation
2015-10-01 21:25:36 +02:00
2016-11-02 22:28:28 +01:00
mingw_prefix = " "
2015-10-01 21:25:36 +02:00
2016-11-02 22:28:28 +01:00
if ( env [ " bits " ] == " default " ) :
env [ " bits " ] = " 32 "
2015-10-01 21:25:36 +02:00
2016-11-02 22:28:28 +01:00
if ( env [ " bits " ] == " 32 " ) :
2016-11-02 22:26:55 +01:00
env . Append ( LINKFLAGS = [ ' -static ' ] )
env . Append ( LINKFLAGS = [ ' -static-libgcc ' ] )
env . Append ( LINKFLAGS = [ ' -static-libstdc++ ' ] )
2016-11-02 22:30:34 +01:00
mingw_prefix = env [ " mingw_prefix " ]
2016-11-02 22:26:55 +01:00
else :
env . Append ( LINKFLAGS = [ ' -static ' ] )
2016-11-02 22:30:34 +01:00
mingw_prefix = env [ " mingw_prefix_64 " ]
2015-10-01 21:25:36 +02:00
2016-11-02 22:28:28 +01:00
nulstr = " "
2015-10-01 21:25:36 +02:00
2016-11-02 22:28:28 +01:00
if ( os . name == " posix " ) :
nulstr = " >/dev/null "
2016-11-02 22:26:55 +01:00
else :
2016-11-02 22:28:28 +01:00
nulstr = " >nul "
2015-10-01 21:25:36 +02:00
2016-11-02 22:26:55 +01:00
# if os.system(mingw_prefix+"gcc --version"+nulstr)!=0:
# #not really super consistent but..
# print("Can't find Windows compiler: "+mingw_prefix)
# sys.exit(255)
2015-10-01 21:25:36 +02:00
2016-11-02 22:28:28 +01:00
if ( env [ " target " ] == " release " ) :
2016-04-02 20:26:12 +02:00
2016-11-02 22:26:55 +01:00
env . Append ( CCFLAGS = [ ' -msse2 ' ] )
2016-01-16 16:52:40 +01:00
2016-11-02 22:28:28 +01:00
if ( env [ " bits " ] == " 64 " ) :
2016-11-02 22:26:55 +01:00
env . Append ( CCFLAGS = [ ' -O3 ' ] )
else :
env . Append ( CCFLAGS = [ ' -O2 ' ] )
2016-01-16 16:52:40 +01:00
2016-11-02 22:26:55 +01:00
env . Append ( LINKFLAGS = [ ' -Wl,--subsystem,windows ' ] )
2015-10-01 21:25:36 +02:00
2016-11-02 22:28:28 +01:00
elif ( env [ " target " ] == " release_debug " ) :
2015-10-01 21:25:36 +02:00
2016-11-02 22:28:28 +01:00
env . Append ( CCFLAGS = [ ' -O2 ' , ' -DDEBUG_ENABLED ' ] )
2015-10-01 21:25:36 +02:00
2016-11-02 22:28:28 +01:00
elif ( env [ " target " ] == " debug " ) :
2016-04-02 20:26:12 +02:00
2016-11-02 22:28:28 +01:00
env . Append ( CCFLAGS = [ ' -g ' , ' -Wall ' , ' -DDEBUG_ENABLED ' , ' -DDEBUG_MEMORY_ENABLED ' ] )
2015-10-01 21:25:36 +02:00
2016-11-02 22:28:28 +01:00
env [ " CC " ] = mingw_prefix + " gcc "
env [ ' AS ' ] = mingw_prefix + " as "
env [ ' CXX ' ] = mingw_prefix + " g++ "
env [ ' AR ' ] = mingw_prefix + " ar "
env [ ' RANLIB ' ] = mingw_prefix + " ranlib "
env [ ' LD ' ] = mingw_prefix + " g++ "
env [ " x86_libtheora_opt_gcc " ] = True
2015-10-01 21:25:36 +02:00
2016-11-02 22:26:55 +01:00
#env['CC'] = "winegcc"
#env['CXX'] = "wineg++"
2015-10-01 21:25:36 +02:00
2016-11-02 22:28:28 +01:00
env . Append ( CCFLAGS = [ ' -DWINDOWS_ENABLED ' , ' -mwindows ' ] )
2016-11-02 22:26:55 +01:00
env . Append ( CPPFLAGS = [ ' -DRTAUDIO_ENABLED ' ] )
env . Append ( CCFLAGS = [ ' -DGLES2_ENABLED ' ] )
2016-11-02 22:28:28 +01:00
env . Append ( LIBS = [ ' mingw32 ' , ' opengl32 ' , ' dsound ' , ' ole32 ' , ' d3d9 ' , ' winmm ' , ' gdi32 ' , ' iphlpapi ' , ' shlwapi ' , ' wsock32 ' , ' kernel32 ' , ' oleaut32 ' , ' dinput8 ' , ' dxguid ' ] )
2015-10-01 21:25:36 +02:00
2016-11-02 22:26:55 +01:00
# if (env["bits"]=="32"):
# env.Append(LIBS=['gcc_s'])
# #--with-arch=i686
# env.Append(CPPFLAGS=['-march=i686'])
# env.Append(LINKFLAGS=['-march=i686'])
2015-10-01 21:25:36 +02:00
2016-11-02 22:26:55 +01:00
#'d3dx9d'
env . Append ( CPPFLAGS = [ ' -DMINGW_ENABLED ' ] )
2016-11-02 22:28:28 +01:00
# env.Append(LINKFLAGS=['-g'])
2015-10-01 21:25:36 +02:00
2016-11-02 22:26:55 +01:00
# resrc
2016-11-02 22:28:28 +01:00
env [ ' is_mingw ' ] = True
env . Append ( BUILDERS = { ' RES ' : env . Builder ( action = build_res_file , suffix = ' .o ' , src_suffix = ' .rc ' ) } )
2015-11-08 23:53:58 +01:00
2016-11-02 22:26:55 +01:00
import methods
2016-11-02 22:28:28 +01:00
env . Append ( BUILDERS = { ' GLSL120 ' : env . Builder ( action = methods . build_legacygl_headers , suffix = ' glsl.h ' , src_suffix = ' .glsl ' ) } )
env . Append ( BUILDERS = { ' GLSL ' : env . Builder ( action = methods . build_glsl_headers , suffix = ' glsl.h ' , src_suffix = ' .glsl ' ) } )
env . Append ( BUILDERS = { ' HLSL9 ' : env . Builder ( action = methods . build_hlsl_dx9_headers , suffix = ' hlsl.h ' , src_suffix = ' .hlsl ' ) } )
env . Append ( BUILDERS = { ' GLSL120GLES ' : env . Builder ( action = methods . build_gles2_headers , suffix = ' glsl.h ' , src_suffix = ' .glsl ' ) } )
2015-10-01 21:25:36 +02:00
2016-11-02 22:29:36 +01:00
2016-04-10 02:59:51 +02:00
def detect_visual_c_compiler_version ( tools_env ) :
2016-11-02 22:26:55 +01:00
# tools_env is the variable scons uses to call tools that execute tasks, SCons's env['ENV'] that executes tasks...
# (see the SCons documentation for more information on what it does)...
# in order for this function to be well encapsulated i choose to force it to recieve SCons's TOOLS env (env['ENV']
# and not scons setup environment (env)... so make sure you call the right environment on it or it will fail to detect
# the propper vc version that will be called
# These is no flag to give to visual c compilers to set the architecture, ie scons bits argument (32,64,ARM etc)
# There are many different cl.exe files that are run, and each one compiles & links to a different architecture
# As far as I know, the only way to figure out what compiler will be run when Scons calls cl.exe via Program()
# is to check the PATH varaible and figure out which one will be called first. Code bellow does that and returns:
# the following string values:
# "" Compiler not detected
# "amd64" Native 64 bit compiler
# "amd64_x86" 64 bit Cross Compiler for 32 bit
# "x86" Native 32 bit compiler
# "x86_amd64" 32 bit Cross Compiler for 64 bit
# There are other architectures, but Godot does not support them currently, so this function does not detect arm/amd64_arm
# and similar architectures/compilers
# Set chosen compiler to "not detected"
vc_chosen_compiler_index = - 1
vc_chosen_compiler_str = " "
# find() works with -1 so big ifs bellow are needed... the simplest solution, in fact
# First test if amd64 and amd64_x86 compilers are present in the path
2016-11-02 22:28:28 +01:00
vc_amd64_compiler_detection_index = tools_env [ " PATH " ] . find ( tools_env [ " VCINSTALLDIR " ] + " BIN \\ amd64; " )
2016-11-02 22:26:55 +01:00
if ( vc_amd64_compiler_detection_index > - 1 ) :
vc_chosen_compiler_index = vc_amd64_compiler_detection_index
vc_chosen_compiler_str = " amd64 "
2016-11-02 22:28:28 +01:00
vc_amd64_x86_compiler_detection_index = tools_env [ " PATH " ] . find ( tools_env [ " VCINSTALLDIR " ] + " BIN \\ amd64_x86; " )
2016-11-02 22:26:55 +01:00
if ( vc_amd64_x86_compiler_detection_index > - 1
and ( vc_chosen_compiler_index == - 1
or vc_chosen_compiler_index > vc_amd64_x86_compiler_detection_index ) ) :
vc_chosen_compiler_index = vc_amd64_x86_compiler_detection_index
vc_chosen_compiler_str = " amd64_x86 "
# Now check the 32 bit compilers
2016-11-02 22:28:28 +01:00
vc_x86_compiler_detection_index = tools_env [ " PATH " ] . find ( tools_env [ " VCINSTALLDIR " ] + " BIN; " )
2016-11-02 22:26:55 +01:00
if ( vc_x86_compiler_detection_index > - 1
and ( vc_chosen_compiler_index == - 1
or vc_chosen_compiler_index > vc_x86_compiler_detection_index ) ) :
vc_chosen_compiler_index = vc_x86_compiler_detection_index
vc_chosen_compiler_str = " x86 "
2016-11-02 22:28:28 +01:00
vc_x86_amd64_compiler_detection_index = tools_env [ " PATH " ] . find ( tools_env [ ' VCINSTALLDIR ' ] + " BIN \\ x86_amd64; " )
2016-11-02 22:26:55 +01:00
if ( vc_x86_amd64_compiler_detection_index > - 1
and ( vc_chosen_compiler_index == - 1
or vc_chosen_compiler_index > vc_x86_amd64_compiler_detection_index ) ) :
vc_chosen_compiler_index = vc_x86_amd64_compiler_detection_index
vc_chosen_compiler_str = " x86_amd64 "
# debug help
2016-11-02 22:28:28 +01:00
# print vc_amd64_compiler_detection_index
# print vc_amd64_x86_compiler_detection_index
# print vc_x86_compiler_detection_index
# print vc_x86_amd64_compiler_detection_index
# print "chosen "+str(vc_chosen_compiler_index)+ " | "+str(vc_chosen_compiler_str)
2016-11-02 22:26:55 +01:00
return vc_chosen_compiler_str