firefox-esr: fix build with Python 3.11

This commit is contained in:
Zapeth 2022-12-22 17:00:45 +01:00 committed by Michal Vasilek
parent c639ba40cf
commit 2dcc2ce24e
2 changed files with 192 additions and 0 deletions

View file

@ -0,0 +1,107 @@
Support for 'U' mode was removed in python 3.11, see https://bugs.python.org/issue37330
diff --git a/dom/base/usecounters.py b/dom/base/usecounters.py
index 780e3b3..7e2c714 100644
--- a/dom/base/usecounters.py
+++ b/dom/base/usecounters.py
@@ -8,7 +8,7 @@ import re
def read_conf(conf_filename):
# Can't read/write from a single StringIO, so make a new one for reading.
- stream = open(conf_filename, "rU")
+ stream = open(conf_filename, "r")
def parse_counters(stream):
for line_num, line in enumerate(stream):
diff --git a/python/mozbuild/mozbuild/action/process_define_files.py b/python/mozbuild/mozbuild/action/process_define_files.py
index f1d401a..aca59d0 100644
--- a/python/mozbuild/mozbuild/action/process_define_files.py
+++ b/python/mozbuild/mozbuild/action/process_define_files.py
@@ -36,7 +36,7 @@ def process_define_file(output, input):
) and not config.substs.get("JS_STANDALONE"):
config = PartialConfigEnvironment(mozpath.join(topobjdir, "js", "src"))
- with open(path, "rU") as input:
+ with open(path, "r") as input:
r = re.compile(
"^\s*#\s*(?P<cmd>[a-z]+)(?:\s+(?P<name>\S+)(?:\s+(?P<value>\S+))?)?", re.U
)
diff --git a/python/mozbuild/mozbuild/backend/base.py b/python/mozbuild/mozbuild/backend/base.py
index 7bc1986..b64a709 100644
--- a/python/mozbuild/mozbuild/backend/base.py
+++ b/python/mozbuild/mozbuild/backend/base.py
@@ -272,7 +272,7 @@ class BuildBackend(LoggingMixin):
return status
@contextmanager
- def _write_file(self, path=None, fh=None, readmode="rU"):
+ def _write_file(self, path=None, fh=None, readmode="r"):
"""Context manager to write a file.
This is a glorified wrapper around FileAvoidWrite with integration to
diff --git a/python/mozbuild/mozbuild/preprocessor.py b/python/mozbuild/mozbuild/preprocessor.py
index f7820b9..857f1a6 100644
--- a/python/mozbuild/mozbuild/preprocessor.py
+++ b/python/mozbuild/mozbuild/preprocessor.py
@@ -531,7 +531,7 @@ class Preprocessor:
if args:
for f in args:
- with io.open(f, "rU", encoding="utf-8") as input:
+ with io.open(f, "r", encoding="utf-8") as input:
self.processFile(input=input, output=out)
if depfile:
mk = Makefile()
@@ -860,7 +860,7 @@ class Preprocessor:
args = self.applyFilters(args)
if not os.path.isabs(args):
args = os.path.join(self.curdir, args)
- args = io.open(args, "rU", encoding="utf-8")
+ args = io.open(args, "r", encoding="utf-8")
except Preprocessor.Error:
raise
except Exception:
@@ -914,7 +914,7 @@ class Preprocessor:
def preprocess(includes=[sys.stdin], defines={}, output=sys.stdout, marker="#"):
pp = Preprocessor(defines=defines, marker=marker)
for f in includes:
- with io.open(f, "rU", encoding="utf-8") as input:
+ with io.open(f, "r", encoding="utf-8") as input:
pp.processFile(input=input, output=output)
return pp.includes
diff --git a/python/mozbuild/mozbuild/util.py b/python/mozbuild/mozbuild/util.py
index b09f164..4f1e0cd 100644
--- a/python/mozbuild/mozbuild/util.py
+++ b/python/mozbuild/mozbuild/util.py
@@ -236,7 +236,7 @@ class FileAvoidWrite(BytesIO):
still occur, as well as diff capture if requested.
"""
- def __init__(self, filename, capture_diff=False, dry_run=False, readmode="rU"):
+ def __init__(self, filename, capture_diff=False, dry_run=False, readmode="r"):
BytesIO.__init__(self)
self.name = filename
assert type(capture_diff) == bool
diff --git a/python/mozbuild/mozpack/files.py b/python/mozbuild/mozpack/files.py
index 1d8a1ed..a295a67 100644
--- a/python/mozbuild/mozpack/files.py
+++ b/python/mozbuild/mozpack/files.py
@@ -554,7 +554,7 @@ class PreprocessedFile(BaseFile):
pp = Preprocessor(defines=self.defines, marker=self.marker)
pp.setSilenceDirectiveWarnings(self.silence_missing_directive_warnings)
- with _open(self.path, "rU") as input:
+ with _open(self.path, "r") as input:
with _open(os.devnull, "w") as output:
pp.processFile(input=input, output=output)
@@ -611,7 +611,7 @@ class PreprocessedFile(BaseFile):
pp = Preprocessor(defines=self.defines, marker=self.marker)
pp.setSilenceDirectiveWarnings(self.silence_missing_directive_warnings)
- with _open(self.path, "rU") as input:
+ with _open(self.path, "r") as input:
pp.processFile(input=input, output=dest, depfile=deps_out)
dest.close()

View file

@ -0,0 +1,85 @@
The Ply lexer, which doesn't seem too active a project, wraps regular
expressions from grammar definitions in its own regular expressions that name
groups. This breaks re.compile in Python >= 3.11 when the original expressions
contain global flags, because the compiler requires that global flags appear at
the start of the expression instead of inside the named group.
This patch wraps re.compile to scan the expression for any global flags and,
when found, moves them to the start of the expression.
--- a/third_party/python/ply/ply/lex.py
+++ b/third_party/python/ply/ply/lex.py
@@ -49,6 +49,37 @@
# Python 3.0
StringTypes = (str, bytes)
+
+def _re_compile(expression, *args, **kwargs):
+ '''
+ Rearrange global flags in the regular expression to appear at the
+ beginning, avoiding deprecation warnings on Python < 3.11 and hard
+ errors on Python >= 3.11.
+ '''
+ flags = set()
+ remainder = ''
+
+ pattern = re.compile(r'\(\?([aiLmsux]+)\)')
+ while m := pattern.search(expression):
+ # Location of the global flag spec
+ l, h = m.span(0)
+ # Accumulate global flags from this spec
+ flags.update(m.group(1))
+ # Capture all text leading up to the match
+ remainder += expression[:l]
+ # Trim to the end fo the flag spec
+ expression = expression[h:]
+
+ # Any remaining expression contains no flags
+ remainder += expression
+
+ # If there are flags, they belong at the beginning
+ if flags:
+ remainder = f'(?{"".join(sorted(flags))})' + remainder
+
+ return re.compile(remainder, *args, **kwargs)
+
+
# This regular expression is used to match valid token names
_is_identifier = re.compile(r'^[a-zA-Z0-9_]+$')
@@ -230,7 +261,7 @@
titem = []
txtitem = []
for pat, func_name in lre:
- titem.append((re.compile(pat, lextab._lexreflags), _names_to_funcs(func_name, fdict)))
+ titem.append((_re_compile(pat, lextab._lexreflags), _names_to_funcs(func_name, fdict)))
self.lexstatere[statename] = titem
self.lexstateretext[statename] = txtitem
@@ -495,7 +526,7 @@
return []
regex = '|'.join(relist)
try:
- lexre = re.compile(regex, reflags)
+ lexre = _re_compile(regex, reflags)
# Build the index to function map for the matching engine
lexindexfunc = [None] * (max(lexre.groupindex.values()) + 1)
@@ -758,7 +789,7 @@
continue
try:
- c = re.compile('(?P<%s>%s)' % (fname, _get_regex(f)), self.reflags)
+ c = _re_compile('(?P<%s>%s)' % (fname, _get_regex(f)), self.reflags)
if c.match(''):
self.log.error("%s:%d: Regular expression for rule '%s' matches empty string", file, line, f.__name__)
self.error = True
@@ -782,7 +813,7 @@
continue
try:
- c = re.compile('(?P<%s>%s)' % (name, r), self.reflags)
+ c = _re_compile('(?P<%s>%s)' % (name, r), self.reflags)
if (c.match('')):
self.log.error("Regular expression for rule '%s' matches empty string", name)
self.error = True