detect.py 6.5 KB

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