Skip to content

Commit b0b10e1

Browse files
bpo-45019: Cleanup module freezing and deepfreeze (#29772)
1 parent 765b2a3 commit b0b10e1

File tree

1 file changed

+28
-40
lines changed

1 file changed

+28
-40
lines changed

Tools/scripts/freeze_modules.py

+28-40
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,20 @@
88
import os
99
import ntpath
1010
import posixpath
11-
import platform
12-
import subprocess
1311
import sys
14-
import time
1512

16-
from update_file import updating_file_with_tmpfile, update_file_with_tmpfile
13+
from update_file import updating_file_with_tmpfile
1714

1815

1916
ROOT_DIR = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
2017
ROOT_DIR = os.path.abspath(ROOT_DIR)
2118
FROZEN_ONLY = os.path.join(ROOT_DIR, 'Tools', 'freeze', 'flag.py')
2219

2320
STDLIB_DIR = os.path.join(ROOT_DIR, 'Lib')
24-
# If MODULES_DIR is changed then the .gitattributes and .gitignore files
25-
# need to be updated.
26-
MODULES_DIR = os.path.join(ROOT_DIR, 'Python', 'frozen_modules')
21+
# If FROZEN_MODULES_DIR or DEEPFROZEN_MODULES_DIR is changed then the
22+
# .gitattributes and .gitignore files needs to be updated.
23+
FROZEN_MODULES_DIR = os.path.join(ROOT_DIR, 'Python', 'frozen_modules')
24+
DEEPFROZEN_MODULES_DIR = os.path.join(ROOT_DIR, 'Python', 'deepfreeze')
2725

2826
FROZEN_FILE = os.path.join(ROOT_DIR, 'Python', 'frozen.c')
2927
MAKEFILE = os.path.join(ROOT_DIR, 'Makefile.pre.in')
@@ -111,16 +109,16 @@ def relpath_for_posix_display(path, base):
111109
#######################################
112110
# specs
113111

114-
def parse_frozen_specs(sectionalspecs=FROZEN, destdir=None):
112+
def parse_frozen_specs():
115113
seen = {}
116-
for section, specs in sectionalspecs:
114+
for section, specs in FROZEN:
117115
parsed = _parse_specs(specs, section, seen)
118116
for item in parsed:
119117
frozenid, pyfile, modname, ispkg, section = item
120118
try:
121119
source = seen[frozenid]
122120
except KeyError:
123-
source = FrozenSource.from_id(frozenid, pyfile, destdir)
121+
source = FrozenSource.from_id(frozenid, pyfile)
124122
seen[frozenid] = source
125123
else:
126124
assert not pyfile or pyfile == source.pyfile, item
@@ -225,15 +223,16 @@ def iter_subs():
225223
#######################################
226224
# frozen source files
227225

228-
class FrozenSource(namedtuple('FrozenSource', 'id pyfile frozenfile')):
226+
class FrozenSource(namedtuple('FrozenSource', 'id pyfile frozenfile deepfreezefile')):
229227

230228
@classmethod
231-
def from_id(cls, frozenid, pyfile=None, destdir=MODULES_DIR):
229+
def from_id(cls, frozenid, pyfile=None):
232230
if not pyfile:
233231
pyfile = os.path.join(STDLIB_DIR, *frozenid.split('.')) + '.py'
234232
#assert os.path.exists(pyfile), (frozenid, pyfile)
235-
frozenfile = resolve_frozen_file(frozenid, destdir)
236-
return cls(frozenid, pyfile, frozenfile)
233+
frozenfile = resolve_frozen_file(frozenid, FROZEN_MODULES_DIR)
234+
deepfreezefile = resolve_frozen_file(frozenid, DEEPFROZEN_MODULES_DIR)
235+
return cls(frozenid, pyfile, frozenfile, deepfreezefile)
237236

238237
@property
239238
def frozenid(self):
@@ -261,7 +260,7 @@ def ispkg(self):
261260
return os.path.basename(self.pyfile) == '__init__.py'
262261

263262

264-
def resolve_frozen_file(frozenid, destdir=MODULES_DIR):
263+
def resolve_frozen_file(frozenid, destdir):
265264
"""Return the filename corresponding to the given frozen ID.
266265
267266
For stdlib modules the ID will always be the full name
@@ -570,41 +569,30 @@ def regen_makefile(modules):
570569
deepfreezefiles = []
571570
rules = ['']
572571
deepfreezerules = ['']
573-
574-
# TODO: Merge the two loops
575572
for src in _iter_sources(modules):
576-
header = relpath_for_posix_display(src.frozenfile, ROOT_DIR)
577-
relfile = header.replace('\\', '/')
578-
_pyfile = relpath_for_posix_display(src.pyfile, ROOT_DIR)
579-
580-
# TODO: This is a bit hackish
581-
xfile = relfile.replace("/frozen_modules/", "/deepfreeze/")
582-
cfile = xfile[:-2] + ".c"
583-
ofile = xfile[:-2] + ".o"
573+
frozen_header = relpath_for_posix_display(src.frozenfile, ROOT_DIR)
574+
deepfreeze_header = relpath_for_posix_display(src.deepfreezefile, ROOT_DIR)
575+
frozenfiles.append(f'\t\t{frozen_header} \\')
576+
cfile = deepfreeze_header[:-2] + ".c"
577+
ofile = deepfreeze_header[:-2] + ".o"
584578
deepfreezefiles.append(f"\t\t{ofile} \\")
585579

586-
# Also add a deepfreeze rule.
587-
deepfreezerules.append(f'{cfile}: {header} $(DEEPFREEZE_DEPS)')
588-
deepfreezerules.append(
589-
f"\t$(PYTHON_FOR_REGEN) "
590-
f"$(srcdir)/Tools/scripts/deepfreeze.py "
591-
f"{header} -m {src.frozenid} -o {cfile}")
592-
deepfreezerules.append('')
593-
594-
for src in _iter_sources(modules):
595-
header = relpath_for_posix_display(src.frozenfile, ROOT_DIR)
596-
frozenfiles.append(f'\t\t{header} \\')
597-
598580
pyfile = relpath_for_posix_display(src.pyfile, ROOT_DIR)
599581
pyfiles.append(f'\t\t{pyfile} \\')
600582

601583
freeze = (f'$(FREEZE_MODULE) {src.frozenid} '
602-
f'$(srcdir)/{pyfile} {header}')
584+
f'$(srcdir)/{pyfile} {frozen_header}')
603585
rules.extend([
604-
f'{header}: $(FREEZE_MODULE) {pyfile}',
586+
f'{frozen_header}: $(FREEZE_MODULE) {pyfile}',
605587
f'\t{freeze}',
606588
'',
607589
])
590+
deepfreezerules.append(f'{cfile}: {frozen_header} $(DEEPFREEZE_DEPS)')
591+
deepfreezerules.append(
592+
f"\t$(PYTHON_FOR_REGEN) "
593+
f"$(srcdir)/Tools/scripts/deepfreeze.py "
594+
f"{frozen_header} -m {src.frozenid} -o {cfile}")
595+
deepfreezerules.append('')
608596
pyfiles[-1] = pyfiles[-1].rstrip(" \\")
609597
frozenfiles[-1] = frozenfiles[-1].rstrip(" \\")
610598
deepfreezefiles[-1] = deepfreezefiles[-1].rstrip(" \\")
@@ -715,7 +703,7 @@ def regen_pcbuild(modules):
715703

716704
def main():
717705
# Expand the raw specs, preserving order.
718-
modules = list(parse_frozen_specs(destdir=MODULES_DIR))
706+
modules = list(parse_frozen_specs())
719707

720708
# Regen build-related files.
721709
regen_makefile(modules)

0 commit comments

Comments
 (0)