2017-06-30 19:21:38 +02:00
import methods
2015-10-01 21:25:36 +02:00
import os
2020-03-17 18:17:41 +01:00
# To match other platforms
STACK_SIZE = 8388608
2016-10-30 19:05:14 +01:00
2015-10-01 21:25:36 +02: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
2015-10-01 21:25:36 +02:00
def get_name ( ) :
2016-10-30 18:44:57 +01:00
return " Windows "
2015-10-01 21:25:36 +02:00
2016-10-30 19:05:14 +01:00
2015-10-01 21:25:36 +02:00
def can_build ( ) :
2020-03-30 08:28:32 +02:00
if os . name == " nt " :
2017-08-18 21:45:52 +02:00
# Building natively on Windows
2018-03-02 20:51:29 +01:00
# If VCINSTALLDIR is set in the OS environ, use traditional Godot logic to set up MSVC
2020-03-30 08:28:32 +02:00
if os . getenv ( " VCINSTALLDIR " ) : # MSVC, manual setup
2016-10-30 18:44:57 +01:00
return True
2018-03-02 20:51:29 +01:00
# Otherwise, let SCons find MSVC if installed, or else Mingw.
# Since we're just returning True here, if there's no compiler
# installed, we'll get errors when it tries to build with the
# null compiler.
return True
2016-10-30 18:44:57 +01:00
2020-03-30 08:28:32 +02:00
if os . name == " posix " :
2017-08-18 21:45:52 +02:00
# Cross-compiling with MinGW-w64 (old MinGW32 is not supported)
2016-10-30 18:44:57 +01:00
mingw32 = " i686-w64-mingw32- "
2017-08-18 21:45:52 +02:00
mingw64 = " x86_64-w64-mingw32- "
2016-10-30 18:44:57 +01:00
2020-03-30 08:28:32 +02:00
if os . getenv ( " MINGW32_PREFIX " ) :
2016-10-30 18:57:40 +01:00
mingw32 = os . getenv ( " MINGW32_PREFIX " )
2020-03-30 08:28:32 +02:00
if os . getenv ( " MINGW64_PREFIX " ) :
2016-10-30 18:57:40 +01:00
mingw64 = os . getenv ( " MINGW64_PREFIX " )
2016-10-30 18:44:57 +01:00
2017-07-25 20:44:16 +02:00
test = " gcc --version > /dev/null 2>&1 "
2020-03-30 08:28:32 +02:00
if os . system ( mingw64 + test ) == 0 or os . system ( mingw32 + test ) == 0 :
2016-10-30 18:44:57 +01:00
return True
return False
2016-04-02 20:26:12 +02:00
2016-10-30 19:05:14 +01:00
2015-10-01 21:25:36 +02:00
def get_opts ( ) :
2017-09-25 06:37:17 +02:00
from SCons . Variables import BoolVariable , EnumVariable
2015-10-01 21:25:36 +02:00
2016-10-30 18:57:40 +01:00
mingw32 = " "
mingw64 = " "
2020-03-30 08:28:32 +02:00
if os . name == " posix " :
2016-10-30 18:44:57 +01:00
mingw32 = " i686-w64-mingw32- "
mingw64 = " x86_64-w64-mingw32- "
2016-04-02 20:26:12 +02:00
2020-03-30 08:28:32 +02:00
if os . getenv ( " MINGW32_PREFIX " ) :
2016-10-30 18:57:40 +01:00
mingw32 = os . getenv ( " MINGW32_PREFIX " )
2020-03-30 08:28:32 +02:00
if os . getenv ( " MINGW64_PREFIX " ) :
2016-10-30 18:57:40 +01:00
mingw64 = os . getenv ( " MINGW64_PREFIX " )
2015-10-01 21:25:36 +02:00
2016-10-30 18:44:57 +01:00
return [
2020-03-30 08:28:32 +02:00
( " mingw_prefix_32 " , " MinGW prefix (Win32) " , mingw32 ) ,
( " mingw_prefix_64 " , " MinGW prefix (Win64) " , mingw64 ) ,
2017-12-01 21:15:56 +01:00
# Targeted Windows version: 7 (and later), minimum supported version
# XP support dropped after EOL due to missing API for IPv6 and other issues
# Vista support dropped after EOL due to GH-10243
2020-03-30 08:28:32 +02:00
( " target_win_version " , " Targeted Windows version, >= 0x0601 (Windows 7) " , " 0x0601 " ) ,
2021-02-03 10:47:06 +01:00
BoolVariable ( " debug_symbols " , " Add debugging symbols to release/release_debug builds " , True ) ,
2022-01-29 20:42:03 +01:00
EnumVariable ( " windows_subsystem " , " Windows subsystem " , " gui " , ( " gui " , " console " ) ) ,
2020-03-30 08:28:32 +02:00
BoolVariable ( " separate_debug_symbols " , " Create a separate file containing debugging symbols " , False ) ,
( " msvc_version " , " MSVC version to use. Ignored if VCINSTALLDIR is set in shell env. " , None ) ,
2020-12-16 16:29:32 +01:00
BoolVariable ( " use_mingw " , " Use the Mingw compiler, even if MSVC is installed. " , False ) ,
2020-03-30 08:28:32 +02:00
BoolVariable ( " use_llvm " , " Use the LLVM compiler " , False ) ,
BoolVariable ( " use_thinlto " , " Use ThinLTO " , False ) ,
2020-11-26 22:19:23 +01:00
BoolVariable ( " use_static_cpp " , " Link MinGW/MSVC C++ runtime libraries statically " , True ) ,
2021-03-12 17:44:06 +01:00
BoolVariable ( " use_asan " , " Use address sanitizer (ASAN) " , False ) ,
2016-10-30 18:44:57 +01:00
]
2016-04-02 20:26:12 +02:00
2016-10-30 19:05:14 +01:00
2015-10-01 21:25:36 +02:00
def get_flags ( ) :
2020-03-30 08:28:32 +02:00
return [ ]
2016-04-02 20:26:12 +02:00
2016-10-30 19:05:14 +01:00
2016-10-30 18:57:40 +01:00
def build_res_file ( target , source , env ) :
2020-03-30 08:28:32 +02:00
if env [ " bits " ] == " 32 " :
cmdbase = env [ " mingw_prefix_32 " ]
2016-10-30 18:44:57 +01:00
else :
2020-03-30 08:28:32 +02:00
cmdbase = env [ " mingw_prefix_64 " ]
cmdbase = cmdbase + " windres --include-dir . "
2016-10-30 18:44:57 +01:00
import subprocess
2020-03-30 08:28:32 +02:00
2016-10-30 18:44:57 +01:00
for x in range ( len ( source ) ) :
2020-03-30 08:28:32 +02:00
cmd = cmdbase + " -i " + str ( source [ x ] ) + " -o " + str ( target [ x ] )
2016-10-30 18:44:57 +01:00
try :
2016-10-30 18:57:40 +01:00
out = subprocess . Popen ( cmd , shell = True , stderr = subprocess . PIPE ) . communicate ( )
2016-10-30 18:44:57 +01:00
if len ( out [ 1 ] ) :
return 1
2020-12-12 11:10:23 +01:00
except Exception :
2016-10-30 18:44:57 +01:00
return 1
return 0
2015-10-01 21:25:36 +02:00
2016-10-30 19:05:14 +01:00
2018-03-02 20:51:29 +01:00
def setup_msvc_manual ( env ) :
""" Set up env to use MSVC manually, using VCINSTALLDIR """
2020-03-30 08:28:32 +02:00
if env [ " bits " ] != " default " :
print (
"""
2018-03-02 20:51:29 +01:00
Bits argument is not supported for MSVC compilation . Architecture depends on the Native / Cross Compile Tools Prompt / Developer Console
( or Visual Studio settings ) 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 .
2020-03-30 08:28:32 +02:00
"""
)
2018-03-02 20:51:29 +01:00
raise SCons . Errors . UserError ( " Bits argument should not be used when using VCINSTALLDIR " )
# Force bits arg
# (Actually msys2 mingw can support 64-bit, we could detect that)
env [ " bits " ] = " 32 "
env [ " x86_libtheora_opt_vc " ] = True
# find compiler manually
2020-03-30 08:28:32 +02:00
compiler_version_str = methods . detect_visual_c_compiler_version ( env [ " ENV " ] )
2018-03-02 20:51:29 +01:00
print ( " Found MSVC compiler: " + compiler_version_str )
# If building for 64bit architecture, disable assembly optimisations for 32 bit builds (theora as of writing)... vc compiler for 64bit can not compile _asm
2020-03-30 08:28:32 +02:00
if compiler_version_str == " amd64 " or compiler_version_str == " x86_amd64 " :
2018-03-02 20:51:29 +01:00
env [ " bits " ] = " 64 "
env [ " x86_libtheora_opt_vc " ] = False
print ( " Compiled program architecture will be a 64 bit executable (forcing bits=64). " )
2020-03-30 08:28:32 +02:00
elif compiler_version_str == " x86 " or compiler_version_str == " amd64_x86 " :
2018-03-02 20:51:29 +01:00
print ( " Compiled program architecture will be a 32 bit executable. (forcing bits=32). " )
else :
2020-03-30 08:28:32 +02:00
print (
" Failed to manually 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, or avoid setting VCINSTALLDIR. "
)
2018-03-02 20:51:29 +01:00
def setup_msvc_auto ( env ) :
""" Set up MSVC using SCons ' s auto-detection logic """
# If MSVC_VERSION is set by SCons, we know MSVC is installed.
# But we may want a different version or target arch.
# The env may have already been set up with default MSVC tools, so
# reset a few things so we can set it up with the tools we want.
# (Ideally we'd decide on the tool config before configuring any
# environment, and just set the env up once, but this function runs
# on an existing env so this is the simplest way.)
2020-03-30 08:28:32 +02:00
env [ " MSVC_SETUP_RUN " ] = False # Need to set this to re-run the tool
env [ " MSVS_VERSION " ] = None
env [ " MSVC_VERSION " ] = None
env [ " TARGET_ARCH " ] = None
if env [ " bits " ] != " default " :
env [ " TARGET_ARCH " ] = { " 32 " : " x86 " , " 64 " : " x86_64 " } [ env [ " bits " ] ]
2021-08-01 10:08:20 +02:00
if " msvc_version " in env :
2020-03-30 08:28:32 +02:00
env [ " MSVC_VERSION " ] = env [ " msvc_version " ]
env . Tool ( " msvc " )
env . Tool ( " mssdk " ) # we want the MS SDK
2018-03-02 20:51:29 +01:00
# Note: actual compiler version can be found in env['MSVC_VERSION'], e.g. "14.1" for VS2015
# Get actual target arch into bits (it may be "default" at this point):
2020-03-30 08:28:32 +02:00
if env [ " TARGET_ARCH " ] in ( " amd64 " , " x86_64 " ) :
env [ " bits " ] = " 64 "
2018-03-02 20:51:29 +01:00
else :
2020-03-30 08:28:32 +02:00
env [ " bits " ] = " 32 "
print ( " Found MSVC version %s , arch %s , bits= %s " % ( env [ " MSVC_VERSION " ] , env [ " TARGET_ARCH " ] , env [ " bits " ] ) )
if env [ " TARGET_ARCH " ] in ( " amd64 " , " x86_64 " ) :
2018-03-02 20:51:29 +01:00
env [ " x86_libtheora_opt_vc " ] = False
2020-03-30 08:28:32 +02:00
2018-03-02 20:51:29 +01:00
def setup_mingw ( env ) :
""" Set up env for use with mingw """
# Nothing to do here
2019-12-09 19:22:08 +01:00
print ( " Using MinGW " )
2018-03-02 20:51:29 +01:00
2020-03-30 08:28:32 +02:00
2018-03-02 20:51:29 +01:00
def configure_msvc ( env , manual_msvc_config ) :
""" Configure env to work with MSVC """
# Build type
2020-03-30 08:28:32 +02:00
if env [ " target " ] == " release " :
2021-02-08 08:52:21 +01:00
if env [ " optimize " ] == " speed " : # optimize for speed (default)
env . Append ( CCFLAGS = [ " /O2 " ] )
2021-03-13 15:29:55 +01:00
env . Append ( LINKFLAGS = [ " /OPT:REF " ] )
elif env [ " optimize " ] == " size " : # optimize for size
2021-02-08 08:52:21 +01:00
env . Append ( CCFLAGS = [ " /O1 " ] )
2021-03-13 15:29:55 +01:00
env . Append ( LINKFLAGS = [ " /OPT:REF " ] )
2020-03-30 08:28:32 +02:00
elif env [ " target " ] == " release_debug " :
2021-02-08 08:52:21 +01:00
if env [ " optimize " ] == " speed " : # optimize for speed (default)
env . Append ( CCFLAGS = [ " /O2 " ] )
2021-03-13 15:29:55 +01:00
env . Append ( LINKFLAGS = [ " /OPT:REF " ] )
elif env [ " optimize " ] == " size " : # optimize for size
2021-02-08 08:52:21 +01:00
env . Append ( CCFLAGS = [ " /O1 " ] )
2021-03-13 15:29:55 +01:00
env . Append ( LINKFLAGS = [ " /OPT:REF " ] )
2020-03-30 08:28:32 +02:00
elif env [ " target " ] == " debug " :
2021-02-08 14:20:42 +01:00
env . AppendUnique ( CCFLAGS = [ " /Zi " , " /FS " , " /Od " , " /EHsc " ] )
2021-11-18 10:38:28 +01:00
# Allow big objects. Only needed for debug, see MinGW branch for rationale.
2020-03-30 08:28:32 +02:00
env . Append ( LINKFLAGS = [ " /DEBUG " ] )
2022-01-29 20:42:03 +01:00
if env [ " windows_subsystem " ] == " gui " :
env . Append ( LINKFLAGS = [ " /SUBSYSTEM:WINDOWS " ] )
else :
env . Append ( LINKFLAGS = [ " /SUBSYSTEM:CONSOLE " ] )
env . AppendUnique ( CPPDEFINES = [ " WINDOWS_SUBSYSTEM_CONSOLE " ] )
2021-12-16 12:08:09 +01:00
env . Append ( LINKFLAGS = [ " /ENTRY:mainCRTStartup " ] )
2021-02-08 08:52:21 +01:00
if env [ " debug_symbols " ] :
2021-02-08 14:20:42 +01:00
env . AppendUnique ( CCFLAGS = [ " /Zi " , " /FS " ] )
2020-03-30 08:28:32 +02:00
env . AppendUnique ( LINKFLAGS = [ " /DEBUG " ] )
2018-08-19 07:37:53 +02:00
2018-03-02 20:51:29 +01:00
## Compile/link flags
2020-11-26 22:19:23 +01:00
if env [ " use_static_cpp " ] :
env . AppendUnique ( CCFLAGS = [ " /MT " ] )
else :
env . AppendUnique ( CCFLAGS = [ " /MD " ] )
2021-02-08 14:20:42 +01:00
2020-11-26 22:19:23 +01:00
env . AppendUnique ( CCFLAGS = [ " /Gd " , " /GR " , " /nologo " ] )
2021-11-10 16:02:02 +01:00
env . AppendUnique ( CCFLAGS = [ " /utf-8 " ] ) # Force to use Unicode encoding.
2020-03-30 08:28:32 +02:00
env . AppendUnique ( CXXFLAGS = [ " /TP " ] ) # assume all sources are C++
2022-07-25 21:10:20 +02:00
# Once it was thought that only debug builds would be too large,
# but this has recently stopped being true. See the mingw function
# for notes on why this shouldn't be enabled for gcc
env . AppendUnique ( CCFLAGS = [ " /bigobj " ] )
2021-11-10 16:02:02 +01:00
2020-03-30 08:28:32 +02:00
if manual_msvc_config : # should be automatic if SCons found it
2018-05-07 00:42:12 +02:00
if os . getenv ( " WindowsSdkDir " ) is not None :
2019-04-30 13:12:02 +02:00
env . Prepend ( CPPPATH = [ os . getenv ( " WindowsSdkDir " ) + " /Include " ] )
2018-05-07 00:42:12 +02:00
else :
print ( " Missing environment variable: WindowsSdkDir " )
2018-03-02 20:51:29 +01:00
2020-03-30 08:28:32 +02:00
env . AppendUnique (
CPPDEFINES = [
" WINDOWS_ENABLED " ,
" OPENGL_ENABLED " ,
" WASAPI_ENABLED " ,
" WINMIDI_ENABLED " ,
" TYPED_METHOD_BIND " ,
" WIN32 " ,
" MSVC " ,
" WINVER= %s " % env [ " target_win_version " ] ,
" _WIN32_WINNT= %s " % env [ " target_win_version " ] ,
]
)
env . AppendUnique ( CPPDEFINES = [ " NOMINMAX " ] ) # disable bogus min/max WinDef.h macros
2018-03-02 20:51:29 +01:00
if env [ " bits " ] == " 64 " :
2020-03-30 08:28:32 +02:00
env . AppendUnique ( CPPDEFINES = [ " _WIN64 " ] )
2018-03-02 20:51:29 +01:00
## Libs
2020-03-30 08:28:32 +02:00
LIBS = [
" winmm " ,
" opengl32 " ,
" dsound " ,
" kernel32 " ,
" ole32 " ,
" oleaut32 " ,
2022-05-23 14:02:12 +02:00
" sapi " ,
2020-03-30 08:28:32 +02:00
" user32 " ,
" gdi32 " ,
" IPHLPAPI " ,
" Shlwapi " ,
" wsock32 " ,
" Ws2_32 " ,
" shell32 " ,
" advapi32 " ,
" dinput8 " ,
" dxguid " ,
" imm32 " ,
" bcrypt " ,
" Avrt " ,
" dwmapi " ,
]
2018-03-02 20:51:29 +01:00
env . Append ( LINKFLAGS = [ p + env [ " LIBSUFFIX " ] for p in LIBS ] )
if manual_msvc_config :
2018-05-07 00:42:12 +02:00
if os . getenv ( " WindowsSdkDir " ) is not None :
env . Append ( LIBPATH = [ os . getenv ( " WindowsSdkDir " ) + " /Lib " ] )
else :
print ( " Missing environment variable: WindowsSdkDir " )
2017-06-30 19:21:38 +02:00
2018-03-02 20:51:29 +01:00
## LTO
2017-06-30 19:21:38 +02:00
2020-03-30 08:28:32 +02:00
if env [ " use_lto " ] :
env . AppendUnique ( CCFLAGS = [ " /GL " ] )
env . AppendUnique ( ARFLAGS = [ " /LTCG " ] )
2018-03-02 20:51:29 +01:00
if env [ " progress " ] :
2020-03-30 08:28:32 +02:00
env . AppendUnique ( LINKFLAGS = [ " /LTCG:STATUS " ] )
2017-06-30 19:21:38 +02:00
else :
2020-03-30 08:28:32 +02:00
env . AppendUnique ( LINKFLAGS = [ " /LTCG " ] )
2017-06-30 19:21:38 +02:00
2018-03-02 20:51:29 +01:00
if manual_msvc_config :
2019-04-30 13:12:02 +02:00
env . Prepend ( CPPPATH = [ p for p in os . getenv ( " INCLUDE " ) . split ( " ; " ) ] )
2018-03-02 20:51:29 +01:00
env . Append ( LIBPATH = [ p for p in os . getenv ( " LIB " ) . split ( " ; " ) ] )
2017-06-30 19:21:38 +02:00
2021-03-12 17:44:06 +01:00
# Sanitizers
if env [ " use_asan " ] :
env . extra_suffix + = " .s "
env . Append ( LINKFLAGS = [ " /INFERASANLIBS " ] )
env . Append ( CCFLAGS = [ " /fsanitize=address " ] )
2018-03-02 20:51:29 +01:00
# Incremental linking fix
2020-03-30 08:28:32 +02:00
env [ " BUILDERS " ] [ " ProgramOriginal " ] = env [ " BUILDERS " ] [ " Program " ]
env [ " BUILDERS " ] [ " Program " ] = methods . precious_program
env . AppendUnique ( LINKFLAGS = [ " /STACK: " + str ( STACK_SIZE ) ] )
2017-06-30 19:21:38 +02:00
2020-03-17 18:17:41 +01:00
2018-03-02 20:51:29 +01:00
def configure_mingw ( env ) :
# Workaround for MinGW. See:
# http://www.scons.org/wiki/LongCmdLinesOnWin32
env . use_windows_spawn_fix ( )
2016-10-30 18:44:57 +01:00
2018-03-02 20:51:29 +01:00
## Build type
2016-10-30 18:44:57 +01:00
2020-03-30 08:28:32 +02:00
if env [ " target " ] == " release " :
env . Append ( CCFLAGS = [ " -msse2 " ] )
2015-10-01 21:25:36 +02:00
2020-03-30 08:28:32 +02:00
if env [ " optimize " ] == " speed " : # optimize for speed (default)
if env [ " bits " ] == " 64 " :
env . Append ( CCFLAGS = [ " -O3 " ] )
2018-07-21 22:26:14 +02:00
else :
2020-03-30 08:28:32 +02:00
env . Append ( CCFLAGS = [ " -O2 " ] )
else : # optimize for size
env . Prepend ( CCFLAGS = [ " -Os " ] )
2021-02-08 08:52:21 +01:00
if env [ " debug_symbols " ] :
2020-03-30 08:28:32 +02:00
env . Prepend ( CCFLAGS = [ " -g2 " ] )
elif env [ " target " ] == " release_debug " :
env . Append ( CCFLAGS = [ " -O2 " ] )
2021-02-08 08:52:21 +01:00
if env [ " debug_symbols " ] :
2020-03-30 08:28:32 +02:00
env . Prepend ( CCFLAGS = [ " -g2 " ] )
if env [ " optimize " ] == " speed " : # optimize for speed (default)
env . Append ( CCFLAGS = [ " -O2 " ] )
else : # optimize for size
env . Prepend ( CCFLAGS = [ " -Os " ] )
elif env [ " target " ] == " debug " :
env . Append ( CCFLAGS = [ " -g3 " ] )
2021-11-18 10:38:28 +01:00
# Allow big objects. It's supposed not to have drawbacks but seems to break
# GCC LTO, so enabling for debug builds only (which are not built with LTO
# and are the only ones with too big objects).
env . Append ( CCFLAGS = [ " -Wa,-mbig-obj " ] )
2017-06-30 19:21:38 +02:00
2022-01-29 20:42:03 +01:00
if env [ " windows_subsystem " ] == " gui " :
env . Append ( LINKFLAGS = [ " -Wl,--subsystem,windows " ] )
else :
env . Append ( LINKFLAGS = [ " -Wl,--subsystem,console " ] )
env . AppendUnique ( CPPDEFINES = [ " WINDOWS_SUBSYSTEM_CONSOLE " ] )
2021-12-16 12:08:09 +01:00
2018-03-02 20:51:29 +01:00
## Compiler configuration
2017-06-30 19:21:38 +02:00
2020-03-30 08:28:32 +02:00
if os . name == " nt " :
2019-12-09 19:22:08 +01:00
# Force splitting libmodules.a in multiple chunks to work around
# issues reaching the linker command line size limit, which also
# seem to induce huge slowdown for 'ar' (GH-30892).
2020-03-30 08:28:32 +02:00
env [ " split_libmodules " ] = True
2018-03-02 20:51:29 +01:00
else :
env [ " PROGSUFFIX " ] = env [ " PROGSUFFIX " ] + " .exe " # for linux cross-compilation
2017-09-13 19:32:24 +02:00
2020-03-30 08:28:32 +02:00
if env [ " bits " ] == " default " :
if os . name == " nt " :
2018-03-02 20:51:29 +01:00
env [ " bits " ] = " 64 " if " PROGRAMFILES(X86) " in os . environ else " 32 "
2020-03-30 08:28:32 +02:00
else : # default to 64-bit on Linux
2018-03-02 20:51:29 +01:00
env [ " bits " ] = " 64 "
2017-06-30 19:21:38 +02:00
2018-03-02 20:51:29 +01:00
mingw_prefix = " "
2017-06-30 19:21:38 +02:00
2020-03-30 08:28:32 +02:00
if env [ " bits " ] == " 32 " :
2020-11-26 22:19:23 +01:00
if env [ " use_static_cpp " ] :
env . Append ( LINKFLAGS = [ " -static " ] )
env . Append ( LINKFLAGS = [ " -static-libgcc " ] )
env . Append ( LINKFLAGS = [ " -static-libstdc++ " ] )
2018-03-02 20:51:29 +01:00
mingw_prefix = env [ " mingw_prefix_32 " ]
else :
2020-11-26 22:19:23 +01:00
if env [ " use_static_cpp " ] :
env . Append ( LINKFLAGS = [ " -static " ] )
2018-03-02 20:51:29 +01:00
mingw_prefix = env [ " mingw_prefix_64 " ]
2017-06-30 19:21:38 +02:00
2020-03-30 08:28:32 +02:00
if env [ " use_llvm " ] :
2019-10-22 11:47:12 +02:00
env [ " CC " ] = mingw_prefix + " clang "
env [ " CXX " ] = mingw_prefix + " clang++ "
2020-11-19 16:47:57 +01:00
env [ " AS " ] = mingw_prefix + " as "
2020-03-30 08:28:32 +02:00
env [ " AR " ] = mingw_prefix + " ar "
env [ " RANLIB " ] = mingw_prefix + " ranlib "
2019-10-22 11:47:12 +02:00
else :
env [ " CC " ] = mingw_prefix + " gcc "
2020-03-30 08:28:32 +02:00
env [ " CXX " ] = mingw_prefix + " g++ "
2020-11-19 16:47:57 +01:00
env [ " AS " ] = mingw_prefix + " as "
2020-03-30 08:28:32 +02:00
env [ " AR " ] = mingw_prefix + " gcc-ar "
env [ " RANLIB " ] = mingw_prefix + " gcc-ranlib "
2020-11-19 16:47:57 +01:00
2018-03-02 20:51:29 +01:00
env [ " x86_libtheora_opt_gcc " ] = True
2015-10-01 21:25:36 +02:00
2020-03-30 08:28:32 +02:00
if env [ " use_lto " ] :
if not env [ " use_llvm " ] and env . GetOption ( " num_jobs " ) > 1 :
env . Append ( CCFLAGS = [ " -flto " ] )
env . Append ( LINKFLAGS = [ " -flto= " + str ( env . GetOption ( " num_jobs " ) ) ] )
2019-10-22 11:47:12 +02:00
else :
2020-03-30 08:28:32 +02:00
if env [ " use_thinlto " ] :
env . Append ( CCFLAGS = [ " -flto=thin " ] )
env . Append ( LINKFLAGS = [ " -flto=thin " ] )
2019-10-22 11:47:12 +02:00
else :
2020-03-30 08:28:32 +02:00
env . Append ( CCFLAGS = [ " -flto " ] )
env . Append ( LINKFLAGS = [ " -flto " ] )
2017-09-13 22:36:15 +02:00
2020-03-30 08:28:32 +02:00
env . Append ( LINKFLAGS = [ " -Wl,--stack, " + str ( STACK_SIZE ) ] )
2015-10-01 21:25:36 +02:00
2018-03-02 20:51:29 +01:00
## Compile flags
2015-10-01 21:25:36 +02:00
2020-03-30 08:28:32 +02:00
env . Append ( CCFLAGS = [ " -mwindows " ] )
2021-03-29 14:33:05 +02:00
env . Append ( LINKFLAGS = [ " -Wl,--nxcompat " ] ) # DEP protection. Not enabling ASLR for now, Mono crashes.
2020-03-30 08:28:32 +02:00
env . Append ( CPPDEFINES = [ " WINDOWS_ENABLED " , " OPENGL_ENABLED " , " WASAPI_ENABLED " , " WINMIDI_ENABLED " ] )
env . Append ( CPPDEFINES = [ ( " WINVER " , env [ " target_win_version " ] ) , ( " _WIN32_WINNT " , env [ " target_win_version " ] ) ] )
env . Append (
LIBS = [
" mingw32 " ,
" opengl32 " ,
" dsound " ,
" ole32 " ,
" d3d9 " ,
" winmm " ,
" gdi32 " ,
" iphlpapi " ,
" shlwapi " ,
" wsock32 " ,
" ws2_32 " ,
" kernel32 " ,
" oleaut32 " ,
2022-05-23 14:02:12 +02:00
" sapi " ,
2020-03-30 08:28:32 +02:00
" dinput8 " ,
" dxguid " ,
" ksuser " ,
" imm32 " ,
" bcrypt " ,
" avrt " ,
" uuid " ,
" dwmapi " ,
]
)
env . Append ( CPPDEFINES = [ " MINGW_ENABLED " , ( " MINGW_HAS_SECURE_API " , 1 ) ] )
2017-09-23 22:55:26 +02:00
2018-03-02 20:51:29 +01:00
# resrc
2020-03-30 08:28:32 +02:00
env . Append ( BUILDERS = { " RES " : env . Builder ( action = build_res_file , suffix = " .o " , src_suffix = " .rc " ) } )
2017-12-14 12:59:46 +01:00
2018-03-02 20:51:29 +01:00
def configure ( env ) :
# At this point the env has been set up with basic tools/compilers.
2020-03-30 08:28:32 +02:00
env . Prepend ( CPPPATH = [ " #platform/windows " ] )
2015-10-01 21:25:36 +02:00
2020-03-30 08:28:32 +02:00
print ( " Configuring for Windows: target= %s , bits= %s " % ( env [ " target " ] , env [ " bits " ] ) )
2018-03-02 20:51:29 +01:00
2020-03-30 08:28:32 +02:00
if os . name == " nt " :
env [ " ENV " ] = os . environ # this makes build less repeatable, but simplifies some things
env [ " ENV " ] [ " TMP " ] = os . environ [ " TMP " ]
2018-03-02 20:51:29 +01:00
# First figure out which compiler, version, and target arch we're using
2019-02-19 13:10:50 +01:00
if os . getenv ( " VCINSTALLDIR " ) and not env [ " use_mingw " ] :
2018-06-13 14:42:55 +02:00
# Manual setup of MSVC
2018-03-02 20:51:29 +01:00
setup_msvc_manual ( env )
env . msvc = True
manual_msvc_config = True
2020-03-30 08:28:32 +02:00
elif env . get ( " MSVC_VERSION " , " " ) and not env [ " use_mingw " ] :
2018-03-02 20:51:29 +01:00
setup_msvc_auto ( env )
env . msvc = True
manual_msvc_config = False
else :
setup_mingw ( env )
env . msvc = False
2015-10-01 21:25:36 +02:00
2018-03-02 20:51:29 +01:00
# Now set compiler/linker flags
if env . msvc :
configure_msvc ( env , manual_msvc_config )
2015-10-01 21:25:36 +02:00
2020-03-30 08:28:32 +02:00
else : # MinGW
2018-03-02 20:51:29 +01:00
configure_mingw ( env )