detect.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. import methods
  2. import os
  3. import string
  4. import sys
  5. def is_active():
  6. return True
  7. def get_name():
  8. return "UWP"
  9. def can_build():
  10. if (os.name == "nt"):
  11. # building natively on windows!
  12. if (os.getenv("VSINSTALLDIR")):
  13. if (os.getenv("ANGLE_SRC_PATH") is None):
  14. return False
  15. return True
  16. return False
  17. def get_opts():
  18. from SCons.Variables import BoolVariable
  19. return [
  20. ('msvc_version', 'MSVC version to use (ignored if the VCINSTALLDIR environment variable is set)', None),
  21. BoolVariable('use_mingw', 'Use the MinGW compiler even if MSVC is installed (only used on Windows)', False),
  22. ]
  23. def get_flags():
  24. return [
  25. ('tools', False),
  26. ('xaudio2', True),
  27. ]
  28. def configure(env):
  29. env.msvc = True
  30. if (env["bits"] != "default"):
  31. print("Error: bits argument is disabled for MSVC")
  32. print("""
  33. Bits argument is not supported for MSVC compilation. Architecture depends on the Native/Cross Compile Tools Prompt/Developer Console
  34. (or Visual Studio settings) that is being used to run SCons. As a consequence, bits argument is disabled. Run scons again without bits
  35. argument (example: scons p=uwp) and SCons will attempt to detect what MSVC compiler will be executed and inform you.
  36. """)
  37. sys.exit()
  38. ## Build type
  39. if (env["target"] == "release"):
  40. env.Append(CPPFLAGS=['/O2', '/GL'])
  41. env.Append(CPPFLAGS=['/MD'])
  42. env.Append(LINKFLAGS=['/SUBSYSTEM:WINDOWS', '/LTCG'])
  43. elif (env["target"] == "release_debug"):
  44. env.Append(CCFLAGS=['/O2', '/Zi', '/DDEBUG_ENABLED'])
  45. env.Append(CPPFLAGS=['/MD'])
  46. env.Append(LINKFLAGS=['/SUBSYSTEM:CONSOLE'])
  47. elif (env["target"] == "debug"):
  48. env.Append(CCFLAGS=['/Zi', '/DDEBUG_ENABLED', '/DDEBUG_MEMORY_ENABLED'])
  49. env.Append(CPPFLAGS=['/MDd'])
  50. env.Append(LINKFLAGS=['/SUBSYSTEM:CONSOLE'])
  51. env.Append(LINKFLAGS=['/DEBUG'])
  52. ## Compiler configuration
  53. env['ENV'] = os.environ
  54. vc_base_path = os.environ['VCTOOLSINSTALLDIR'] if "VCTOOLSINSTALLDIR" in os.environ else os.environ['VCINSTALLDIR']
  55. # ANGLE
  56. angle_root = os.getenv("ANGLE_SRC_PATH")
  57. env.Append(CPPPATH=[angle_root + '/include'])
  58. jobs = str(env.GetOption("num_jobs"))
  59. angle_build_cmd = "msbuild.exe " + angle_root + "/winrt/10/src/angle.sln /nologo /v:m /m:" + jobs + " /p:Configuration=Release /p:Platform="
  60. if os.path.isfile(str(os.getenv("ANGLE_SRC_PATH")) + "/winrt/10/src/angle.sln"):
  61. env["build_angle"] = True
  62. ## Architecture
  63. arch = ""
  64. if str(os.getenv('Platform')).lower() == "arm":
  65. print("Compiled program architecture will be an ARM executable. (forcing bits=32).")
  66. arch = "arm"
  67. env["bits"] = "32"
  68. env.Append(LINKFLAGS=['/MACHINE:ARM'])
  69. env.Append(LIBPATH=[vc_base_path + 'lib/store/arm'])
  70. angle_build_cmd += "ARM"
  71. env.Append(LIBPATH=[angle_root + '/winrt/10/src/Release_ARM/lib'])
  72. else:
  73. compiler_version_str = methods.detect_visual_c_compiler_version(env['ENV'])
  74. if(compiler_version_str == "amd64" or compiler_version_str == "x86_amd64"):
  75. env["bits"] = "64"
  76. print("Compiled program architecture will be a x64 executable (forcing bits=64).")
  77. elif (compiler_version_str == "x86" or compiler_version_str == "amd64_x86"):
  78. env["bits"] = "32"
  79. print("Compiled program architecture will be a x86 executable. (forcing bits=32).")
  80. else:
  81. print("Failed to detect MSVC compiler architecture version... Defaulting to 32-bit 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.")
  82. env["bits"] = "32"
  83. if (env["bits"] == "32"):
  84. arch = "x86"
  85. angle_build_cmd += "Win32"
  86. env.Append(LINKFLAGS=['/MACHINE:X86'])
  87. env.Append(LIBPATH=[vc_base_path + 'lib/store'])
  88. env.Append(LIBPATH=[angle_root + '/winrt/10/src/Release_Win32/lib'])
  89. else:
  90. arch = "x64"
  91. angle_build_cmd += "x64"
  92. env.Append(LINKFLAGS=['/MACHINE:X64'])
  93. env.Append(LIBPATH=[os.environ['VCINSTALLDIR'] + 'lib/store/amd64'])
  94. env.Append(LIBPATH=[angle_root + '/winrt/10/src/Release_x64/lib'])
  95. env["PROGSUFFIX"] = "." + arch + env["PROGSUFFIX"]
  96. env["OBJSUFFIX"] = "." + arch + env["OBJSUFFIX"]
  97. env["LIBSUFFIX"] = "." + arch + env["LIBSUFFIX"]
  98. ## Compile flags
  99. env.Append(CPPPATH=['#platform/uwp', '#drivers/windows'])
  100. env.Append(CCFLAGS=['/DUWP_ENABLED', '/DWINDOWS_ENABLED', '/DTYPED_METHOD_BIND'])
  101. env.Append(CCFLAGS=['/DGLES_ENABLED', '/DGL_GLEXT_PROTOTYPES', '/DEGL_EGLEXT_PROTOTYPES', '/DANGLE_ENABLED'])
  102. winver = "0x0602" # Windows 8 is the minimum target for UWP build
  103. env.Append(CCFLAGS=['/DWINVER=%s' % winver, '/D_WIN32_WINNT=%s' % winver])
  104. env.Append(CPPFLAGS=['/D', '__WRL_NO_DEFAULT_LIB__', '/D', 'WIN32', '/DPNG_ABORT=abort'])
  105. env.Append(CPPFLAGS=['/AI', vc_base_path + 'lib/store/references'])
  106. env.Append(CPPFLAGS=['/AI', vc_base_path + 'lib/x86/store/references'])
  107. env.Append(CCFLAGS='/FS /MP /GS /wd"4453" /wd"28204" /wd"4291" /Zc:wchar_t /Gm- /fp:precise /D "_UNICODE" /D "UNICODE" /D "WINAPI_FAMILY=WINAPI_FAMILY_APP" /errorReport:prompt /WX- /Zc:forScope /Gd /EHsc /nologo'.split())
  108. env.Append(CXXFLAGS='/ZW /FS'.split())
  109. env.Append(CCFLAGS=['/AI', vc_base_path + '\\vcpackages', '/AI', os.environ['WINDOWSSDKDIR'] + '\\References\\CommonConfiguration\\Neutral'])
  110. ## Link flags
  111. env.Append(LINKFLAGS=['/MANIFEST:NO', '/NXCOMPAT', '/DYNAMICBASE', '/WINMD', '/APPCONTAINER', '/ERRORREPORT:PROMPT', '/NOLOGO', '/TLBID:1', '/NODEFAULTLIB:"kernel32.lib"', '/NODEFAULTLIB:"ole32.lib"'])
  112. LIBS = [
  113. 'WindowsApp',
  114. 'mincore',
  115. 'ws2_32',
  116. 'libANGLE',
  117. 'libEGL',
  118. 'libGLESv2',
  119. 'bcrypt',
  120. ]
  121. env.Append(LINKFLAGS=[p + ".lib" for p in LIBS])
  122. # Incremental linking fix
  123. env['BUILDERS']['ProgramOriginal'] = env['BUILDERS']['Program']
  124. env['BUILDERS']['Program'] = methods.precious_program
  125. env.Append(BUILDERS={'ANGLE': env.Builder(action=angle_build_cmd)})