summaryrefslogtreecommitdiffstats
path: root/methods.py
diff options
context:
space:
mode:
Diffstat (limited to 'methods.py')
-rw-r--r--methods.py71
1 files changed, 56 insertions, 15 deletions
diff --git a/methods.py b/methods.py
index c725501fd9..bfd08cfc7b 100644
--- a/methods.py
+++ b/methods.py
@@ -8,7 +8,7 @@ from collections import OrderedDict
from enum import Enum
from io import StringIO, TextIOWrapper
from pathlib import Path
-from typing import Generator, Optional
+from typing import Generator, List, Optional, Union
# Get the "Godot" folder name ahead of time
base_folder_path = str(os.path.abspath(Path(__file__).parent)) + "/"
@@ -163,7 +163,7 @@ def add_source_files(self, sources, files, allow_gen=False):
def disable_warnings(self):
# 'self' is the environment
- if self.msvc:
+ if self.msvc and not using_clang(self):
# We have to remove existing warning level defines before appending /w,
# otherwise we get: "warning D9025 : overriding '/W3' with '/w'"
self["CCFLAGS"] = [x for x in self["CCFLAGS"] if not (x.startswith("/W") or x.startswith("/w"))]
@@ -495,6 +495,8 @@ def use_windows_spawn_fix(self, platform=None):
rv = proc.wait()
if rv:
print_error(err)
+ elif len(err) > 0 and not err.isspace():
+ print(err)
return rv
def mySpawn(sh, escape, cmd, args, env):
@@ -815,21 +817,20 @@ def get_compiler_version(env):
"apple_patch3": -1,
}
- if not env.msvc:
- # Not using -dumpversion as some GCC distros only return major, and
- # Clang used to return hardcoded 4.2.1: # https://reviews.llvm.org/D56803
- try:
- version = (
- subprocess.check_output([env.subst(env["CXX"]), "--version"], shell=(os.name == "nt"))
- .strip()
- .decode("utf-8")
- )
- except (subprocess.CalledProcessError, OSError):
- print_warning("Couldn't parse CXX environment variable to infer compiler version.")
- return ret
- else:
+ if env.msvc and not using_clang(env):
# TODO: Implement for MSVC
return ret
+
+ # Not using -dumpversion as some GCC distros only return major, and
+ # Clang used to return hardcoded 4.2.1: # https://reviews.llvm.org/D56803
+ try:
+ version = subprocess.check_output(
+ [env.subst(env["CXX"]), "--version"], shell=(os.name == "nt"), encoding="utf-8"
+ ).strip()
+ except (subprocess.CalledProcessError, OSError):
+ print_warning("Couldn't parse CXX environment variable to infer compiler version.")
+ return ret
+
match = re.search(
r"(?:(?<=version )|(?<=\) )|(?<=^))"
r"(?P<major>\d+)"
@@ -1641,3 +1642,43 @@ def generated_wrapper(
file.write(f"\n\n#endif // {header_guard}")
file.write("\n")
+
+
+def to_raw_cstring(value: Union[str, List[str]]) -> str:
+ MAX_LITERAL = 16 * 1024
+
+ if isinstance(value, list):
+ value = "\n".join(value) + "\n"
+
+ split: List[bytes] = []
+ offset = 0
+ encoded = value.encode()
+
+ while offset <= len(encoded):
+ segment = encoded[offset : offset + MAX_LITERAL]
+ offset += MAX_LITERAL
+ if len(segment) == MAX_LITERAL:
+ # Try to segment raw strings at double newlines to keep readable.
+ pretty_break = segment.rfind(b"\n\n")
+ if pretty_break != -1:
+ segment = segment[: pretty_break + 1]
+ offset -= MAX_LITERAL - pretty_break - 1
+ # If none found, ensure we end with valid utf8.
+ # https://github.com/halloleo/unicut/blob/master/truncate.py
+ elif segment[-1] & 0b10000000:
+ last_11xxxxxx_index = [i for i in range(-1, -5, -1) if segment[i] & 0b11000000 == 0b11000000][0]
+ last_11xxxxxx = segment[last_11xxxxxx_index]
+ if not last_11xxxxxx & 0b00100000:
+ last_char_length = 2
+ elif not last_11xxxxxx & 0b0010000:
+ last_char_length = 3
+ elif not last_11xxxxxx & 0b0001000:
+ last_char_length = 4
+
+ if last_char_length > -last_11xxxxxx_index:
+ segment = segment[:last_11xxxxxx_index]
+ offset += last_11xxxxxx_index
+
+ split += [segment]
+
+ return " ".join(f'R"<!>({x.decode()})<!>"' for x in split)