summaryrefslogtreecommitdiffstats
path: root/Tools/scripts/freeze_modules.py
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/scripts/freeze_modules.py')
-rw-r--r--Tools/scripts/freeze_modules.py58
1 files changed, 37 insertions, 21 deletions
diff --git a/Tools/scripts/freeze_modules.py b/Tools/scripts/freeze_modules.py
index b3ae5c7..aa799d7 100644
--- a/Tools/scripts/freeze_modules.py
+++ b/Tools/scripts/freeze_modules.py
@@ -11,8 +11,9 @@ import posixpath
import subprocess
import sys
import textwrap
+import time
-from update_file import updating_file_with_tmpfile
+from update_file import updating_file_with_tmpfile, update_file_with_tmpfile
ROOT_DIR = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
@@ -272,7 +273,7 @@ def resolve_frozen_file(frozenid, destdir=MODULES_DIR):
except AttributeError:
raise ValueError(f'unsupported frozenid {frozenid!r}')
# We use a consistent naming convention for all frozen modules.
- frozenfile = frozenid.replace('.', '_') + '.h'
+ frozenfile = f'{frozenid}.h'
if not destdir:
return frozenfile
return os.path.join(destdir, frozenfile)
@@ -542,6 +543,7 @@ def regen_frozen(modules):
def regen_makefile(modules):
+ pyfiles = []
frozenfiles = []
rules = ['']
for src in _iter_sources(modules):
@@ -549,14 +551,16 @@ def regen_makefile(modules):
frozenfiles.append(f'\t\t{header} \\')
pyfile = relpath_for_posix_display(src.pyfile, ROOT_DIR)
- # Note that we freeze the module to the target .h file
- # instead of going through an intermediate file like we used to.
- rules.append(f'{header}: Programs/_freeze_module {pyfile}')
- rules.append(
- (f'\tPrograms/_freeze_module {src.frozenid} '
- f'$(srcdir)/{pyfile} $(srcdir)/{header}'))
- rules.append('')
-
+ pyfiles.append(f'\t\t{pyfile} \\')
+
+ freeze = (f'Programs/_freeze_module {src.frozenid} '
+ f'$(srcdir)/{pyfile} $(srcdir)/{header}')
+ rules.extend([
+ f'{header}: Programs/_freeze_module {pyfile}',
+ f'\t{freeze}',
+ '',
+ ])
+ pyfiles[-1] = pyfiles[-1].rstrip(" \\")
frozenfiles[-1] = frozenfiles[-1].rstrip(" \\")
print(f'# Updating {os.path.relpath(MAKEFILE)}')
@@ -564,8 +568,15 @@ def regen_makefile(modules):
lines = infile.readlines()
lines = replace_block(
lines,
- "FROZEN_FILES =",
- "# End FROZEN_FILES",
+ "FROZEN_FILES_IN =",
+ "# End FROZEN_FILES_IN",
+ pyfiles,
+ MAKEFILE,
+ )
+ lines = replace_block(
+ lines,
+ "FROZEN_FILES_OUT =",
+ "# End FROZEN_FILES_OUT",
frozenfiles,
MAKEFILE,
)
@@ -625,13 +636,15 @@ def regen_pcbuild(modules):
def freeze_module(modname, pyfile=None, destdir=MODULES_DIR):
"""Generate the frozen module .h file for the given module."""
+ tmpsuffix = f'.{int(time.time())}'
for modname, pyfile, ispkg in resolve_modules(modname, pyfile):
frozenfile = resolve_frozen_file(modname, destdir)
- _freeze_module(modname, pyfile, frozenfile)
+ _freeze_module(modname, pyfile, frozenfile, tmpsuffix)
-def _freeze_module(frozenid, pyfile, frozenfile):
- tmpfile = frozenfile + '.new'
+def _freeze_module(frozenid, pyfile, frozenfile, tmpsuffix):
+ tmpfile = f'{frozenfile}.{int(time.time())}'
+ print(tmpfile)
argv = [TOOL, frozenid, pyfile, tmpfile]
print('#', ' '.join(os.path.relpath(a) for a in argv), flush=True)
@@ -642,7 +655,7 @@ def _freeze_module(frozenid, pyfile, frozenfile):
sys.exit(f'ERROR: missing {TOOL}; you need to run "make regen-frozen"')
raise # re-raise
- os.replace(tmpfile, frozenfile)
+ update_file_with_tmpfile(frozenfile, tmpfile, create=True)
#######################################
@@ -652,15 +665,18 @@ def main():
# Expand the raw specs, preserving order.
modules = list(parse_frozen_specs(destdir=MODULES_DIR))
+ # Regen build-related files.
+ regen_makefile(modules)
+ regen_pcbuild(modules)
+
# Freeze the target modules.
+ tmpsuffix = f'.{int(time.time())}'
for src in _iter_sources(modules):
- _freeze_module(src.frozenid, src.pyfile, src.frozenfile)
+ _freeze_module(src.frozenid, src.pyfile, src.frozenfile, tmpsuffix)
- # Regen build-related files.
- regen_manifest(modules)
+ # Regen files dependent of frozen file details.
regen_frozen(modules)
- regen_makefile(modules)
- regen_pcbuild(modules)
+ regen_manifest(modules)
if __name__ == '__main__':