diff options
-rw-r--r-- | Misc/NEWS.d/next/Build/2021-09-14-00-47-57.bpo-45188.MNbo_T.rst | 3 | ||||
-rw-r--r-- | PC/config_minimal.c | 53 | ||||
-rw-r--r-- | PCbuild/_freeze_module.vcxproj | 157 | ||||
-rw-r--r-- | PCbuild/pcbuild.proj | 19 | ||||
-rw-r--r-- | PCbuild/pcbuild.sln | 49 | ||||
-rw-r--r-- | Programs/_freeze_module.c | 5 | ||||
-rw-r--r-- | Tools/scripts/freeze_modules.py | 60 |
7 files changed, 278 insertions, 68 deletions
diff --git a/Misc/NEWS.d/next/Build/2021-09-14-00-47-57.bpo-45188.MNbo_T.rst b/Misc/NEWS.d/next/Build/2021-09-14-00-47-57.bpo-45188.MNbo_T.rst new file mode 100644 index 0000000000..df470e8eeb --- /dev/null +++ b/Misc/NEWS.d/next/Build/2021-09-14-00-47-57.bpo-45188.MNbo_T.rst @@ -0,0 +1,3 @@ +Windows builds now regenerate frozen modules as the first part of the build. +Previously the regeneration was later in the build, which would require it +to be restarted if any modules had changed. diff --git a/PC/config_minimal.c b/PC/config_minimal.c new file mode 100644 index 0000000000..adb1c44a72 --- /dev/null +++ b/PC/config_minimal.c @@ -0,0 +1,53 @@ +/* Module configuration */ + +/* This file contains the table of built-in modules. + See create_builtin() in import.c. */ + +#include "Python.h" + +extern PyObject* PyInit_faulthandler(void); +extern PyObject* PyInit__tracemalloc(void); +extern PyObject* PyInit_gc(void); +extern PyObject* PyInit_nt(void); +extern PyObject* PyInit__signal(void); +extern PyObject* PyInit_winreg(void); + +extern PyObject* PyInit__ast(void); +extern PyObject* PyInit__io(void); +extern PyObject* PyInit_atexit(void); +extern PyObject* _PyWarnings_Init(void); +extern PyObject* PyInit__string(void); +extern PyObject* PyInit__tokenize(void); + +extern PyObject* PyMarshal_Init(void); +extern PyObject* PyInit__imp(void); + +struct _inittab _PyImport_Inittab[] = { + {"_ast", PyInit__ast}, + {"faulthandler", PyInit_faulthandler}, + {"gc", PyInit_gc}, + {"nt", PyInit_nt}, /* Use the NT os functions, not posix */ + {"_signal", PyInit__signal}, + {"_tokenize", PyInit__tokenize}, + {"_tracemalloc", PyInit__tracemalloc}, + + {"winreg", PyInit_winreg}, + + /* This module "lives in" with marshal.c */ + {"marshal", PyMarshal_Init}, + + /* This lives it with import.c */ + {"_imp", PyInit__imp}, + + /* These entries are here for sys.builtin_module_names */ + {"builtins", NULL}, + {"sys", NULL}, + {"_warnings", _PyWarnings_Init}, + {"_string", PyInit__string}, + + {"_io", PyInit__io}, + {"atexit", PyInit_atexit}, + + /* Sentinel */ + {0, 0} +}; diff --git a/PCbuild/_freeze_module.vcxproj b/PCbuild/_freeze_module.vcxproj index a0bedf49e6..a87dca75c3 100644 --- a/PCbuild/_freeze_module.vcxproj +++ b/PCbuild/_freeze_module.vcxproj @@ -88,24 +88,145 @@ <PropertyGroup Label="UserMacros" /> <ItemDefinitionGroup> <ClCompile> - <PreprocessorDefinitions>_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>Py_NO_ENABLE_SHARED;Py_BUILD_CORE;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> </ClCompile> <Link> <SubSystem>Console</SubSystem> + <AdditionalDependencies>version.lib;shlwapi.lib;ws2_32.lib;pathcch.lib;bcrypt.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> </ItemDefinitionGroup> <ItemGroup> <ClCompile Include="..\Programs\_freeze_module.c" /> + <ClCompile Include="..\PC\config_minimal.c" /> </ItemGroup> <ItemGroup> - <ProjectReference Include="pythoncore.vcxproj"> - <Project>{cf7ac3d1-e2df-41d2-bea6-1e2556cdea26}</Project> - <Private>true</Private> - <ReferenceOutputAssembly>true</ReferenceOutputAssembly> - <CopyLocalSatelliteAssemblies>false</CopyLocalSatelliteAssemblies> - <LinkLibraryDependencies>true</LinkLibraryDependencies> - <UseLibraryDependencyInputs>false</UseLibraryDependencyInputs> - </ProjectReference> + <ClCompile Include="..\Modules\atexitmodule.c" /> + <ClCompile Include="..\Modules\faulthandler.c" /> + <ClCompile Include="..\Modules\gcmodule.c" /> + <ClCompile Include="..\Modules\getbuildinfo.c" /> + <ClCompile Include="..\Modules\posixmodule.c" /> + <ClCompile Include="..\Modules\signalmodule.c" /> + <ClCompile Include="..\Modules\_tracemalloc.c" /> + <ClCompile Include="..\Modules\_io\_iomodule.c" /> + <ClCompile Include="..\Modules\_io\bufferedio.c" /> + <ClCompile Include="..\Modules\_io\bytesio.c" /> + <ClCompile Include="..\Modules\_io\fileio.c" /> + <ClCompile Include="..\Modules\_io\iobase.c" /> + <ClCompile Include="..\Modules\_io\stringio.c" /> + <ClCompile Include="..\Modules\_io\textio.c" /> + <ClCompile Include="..\Modules\_io\winconsoleio.c" /> + <ClCompile Include="..\Objects\abstract.c" /> + <ClCompile Include="..\Objects\accu.c" /> + <ClCompile Include="..\Objects\boolobject.c" /> + <ClCompile Include="..\Objects\bytearrayobject.c" /> + <ClCompile Include="..\Objects\bytes_methods.c" /> + <ClCompile Include="..\Objects\bytesobject.c" /> + <ClCompile Include="..\Objects\call.c" /> + <ClCompile Include="..\Objects\capsule.c" /> + <ClCompile Include="..\Objects\cellobject.c" /> + <ClCompile Include="..\Objects\classobject.c" /> + <ClCompile Include="..\Objects\codeobject.c" /> + <ClCompile Include="..\Objects\complexobject.c" /> + <ClCompile Include="..\Objects\descrobject.c" /> + <ClCompile Include="..\Objects\dictobject.c" /> + <ClCompile Include="..\Objects\enumobject.c" /> + <ClCompile Include="..\Objects\exceptions.c" /> + <ClCompile Include="..\Objects\fileobject.c" /> + <ClCompile Include="..\Objects\floatobject.c" /> + <ClCompile Include="..\Objects\frameobject.c" /> + <ClCompile Include="..\Objects\funcobject.c" /> + <ClCompile Include="..\Objects\genericaliasobject.c" /> + <ClCompile Include="..\Objects\genobject.c" /> + <ClCompile Include="..\Objects\interpreteridobject.c" /> + <ClCompile Include="..\Objects\iterobject.c" /> + <ClCompile Include="..\Objects\listobject.c" /> + <ClCompile Include="..\Objects\longobject.c" /> + <ClCompile Include="..\Objects\memoryobject.c" /> + <ClCompile Include="..\Objects\methodobject.c" /> + <ClCompile Include="..\Objects\moduleobject.c" /> + <ClCompile Include="..\Objects\namespaceobject.c" /> + <ClCompile Include="..\Objects\object.c" /> + <ClCompile Include="..\Objects\obmalloc.c" /> + <ClCompile Include="..\Objects\odictobject.c" /> + <ClCompile Include="..\Objects\picklebufobject.c" /> + <ClCompile Include="..\Objects\rangeobject.c" /> + <ClCompile Include="..\Objects\setobject.c" /> + <ClCompile Include="..\Objects\sliceobject.c" /> + <ClCompile Include="..\Objects\structseq.c" /> + <ClCompile Include="..\Objects\tupleobject.c" /> + <ClCompile Include="..\Objects\typeobject.c" /> + <ClCompile Include="..\Objects\unicodectype.c" /> + <ClCompile Include="..\Objects\unicodeobject.c" /> + <ClCompile Include="..\Objects\unionobject.c" /> + <ClCompile Include="..\Objects\weakrefobject.c" /> + <ClCompile Include="..\Parser\myreadline.c" /> + <ClCompile Include="..\Parser\parser.c" /> + <ClCompile Include="..\Parser\peg_api.c" /> + <ClCompile Include="..\Parser\pegen.c" /> + <ClCompile Include="..\Parser\string_parser.c" /> + <ClCompile Include="..\Parser\token.c" /> + <ClCompile Include="..\Parser\tokenizer.c" /> + <ClCompile Include="..\PC\getpathp.c" /> + <ClCompile Include="..\PC\invalid_parameter_handler.c" /> + <ClCompile Include="..\PC\msvcrtmodule.c" /> + <ClCompile Include="..\PC\winreg.c" /> + <ClCompile Include="..\Python\_warnings.c" /> + <ClCompile Include="..\Python\asdl.c" /> + <ClCompile Include="..\Python\ast.c" /> + <ClCompile Include="..\Python\ast_opt.c" /> + <ClCompile Include="..\Python\ast_unparse.c" /> + <ClCompile Include="..\Python\bltinmodule.c" /> + <ClCompile Include="..\Python\bootstrap_hash.c" /> + <ClCompile Include="..\Python\ceval.c" /> + <ClCompile Include="..\Python\codecs.c" /> + <ClCompile Include="..\Python\compile.c" /> + <ClCompile Include="..\Python\context.c" /> + <ClCompile Include="..\Python\dtoa.c" /> + <ClCompile Include="..\Python\dynamic_annotations.c" /> + <ClCompile Include="..\Python\dynload_win.c" /> + <ClCompile Include="..\Python\errors.c" /> + <ClCompile Include="..\Python\fileutils.c" /> + <ClCompile Include="..\Python\formatter_unicode.c" /> + <ClCompile Include="..\Python\frame.c" /> + <ClCompile Include="..\Python\future.c" /> + <ClCompile Include="..\Python\getargs.c" /> + <ClCompile Include="..\Python\getcompiler.c" /> + <ClCompile Include="..\Python\getcopyright.c" /> + <ClCompile Include="..\Python\getopt.c" /> + <ClCompile Include="..\Python\getplatform.c" /> + <ClCompile Include="..\Python\getversion.c" /> + <ClCompile Include="..\Python\hamt.c" /> + <ClCompile Include="..\Python\hashtable.c" /> + <ClCompile Include="..\Python\import.c" /> + <ClCompile Include="..\Python\importdl.c" /> + <ClCompile Include="..\Python\initconfig.c" /> + <ClCompile Include="..\Python\marshal.c" /> + <ClCompile Include="..\Python\modsupport.c" /> + <ClCompile Include="..\Python\mysnprintf.c" /> + <ClCompile Include="..\Python\mystrtoul.c" /> + <ClCompile Include="..\Python\pathconfig.c" /> + <ClCompile Include="..\Python\preconfig.c" /> + <ClCompile Include="..\Python\pyarena.c" /> + <ClCompile Include="..\Python\pyctype.c" /> + <ClCompile Include="..\Python\pyfpe.c" /> + <ClCompile Include="..\Python\pyhash.c" /> + <ClCompile Include="..\Python\pylifecycle.c" /> + <ClCompile Include="..\Python\pymath.c" /> + <ClCompile Include="..\Python\pystate.c" /> + <ClCompile Include="..\Python\pystrcmp.c" /> + <ClCompile Include="..\Python\pystrhex.c" /> + <ClCompile Include="..\Python\pystrtod.c" /> + <ClCompile Include="..\Python\Python-ast.c" /> + <ClCompile Include="..\Python\pythonrun.c" /> + <ClCompile Include="..\Python\Python-tokenize.c" /> + <ClCompile Include="..\Python\pytime.c" /> + <ClCompile Include="..\Python\specialize.c" /> + <ClCompile Include="..\Python\structmember.c" /> + <ClCompile Include="..\Python\suggestions.c" /> + <ClCompile Include="..\Python\symtable.c" /> + <ClCompile Include="..\Python\sysmodule.c" /> + <ClCompile Include="..\Python\thread.c" /> + <ClCompile Include="..\Python\traceback.c" /> </ItemGroup> <ItemGroup> <!-- BEGIN frozen modules --> @@ -126,7 +247,7 @@ </None> <None Include="..\Tools\freeze\flag.py"> <ModName>hello</ModName> - <IntFile>$(IntDir)ello.g.h</IntFile> + <IntFile>$(IntDir)hello.g.h</IntFile> <OutFile>$(PySourcePath)Python\frozen_modules\hello.h</OutFile> </None> <!-- END frozen modules --> @@ -134,9 +255,9 @@ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> </ImportGroup> - <Target Name="_RebuildFrozen"> + <Target Name="_RebuildFrozen" AfterTargets="AfterBuild" Condition="$(Configuration) != 'PGUpdate'"> <Exec Command='"$(TargetPath)" "%(None.ModName)" "%(None.FullPath)" "%(None.IntFile)"' /> - + <Copy SourceFiles="%(None.IntFile)" DestinationFiles="%(None.OutFile)" Condition="!Exists(%(None.OutFile)) or (Exists(%(None.IntFile)) and '$([System.IO.File]::ReadAllText(%(None.OutFile)).Replace(`
`, `
`))' != '$([System.IO.File]::ReadAllText(%(None.IntFile)).Replace(`
`, `
`))')"> @@ -145,18 +266,8 @@ <Message Text="Updated files: @(_Updated->'%(Filename)%(Extension)',', ')" Condition="'@(_Updated)' != ''" Importance="high" /> - <Warning Text="Frozen modules (e.g. importlib) were updated. Please rebuild to pick up the changes.%0D%0A%0D%0AIf you are not developing on Windows but you see this error on a continuous integration build, please run 'make regen-all' and commit anything that changes." - Condition="'@(_Updated)' != '' and $(Configuration) == 'Debug'" /> - <Error Text="Frozen (e.g. importlib) files were updated. Please rebuild to pick up the changes.%0D%0A%0D%0AIf you are not developing on Windows but you see this error on a continuous integration build, please run 'make regen-all' and commit anything that changes." - Condition="'@(_Updated)' != '' and $(Configuration) == 'Release'" /> - </Target> - <Target Name="RebuildFrozen" AfterTargets="AfterBuild" Condition="$(Configuration) == 'Debug' or $(Configuration) == 'Release'" - DependsOnTargets="_RebuildFrozen"> - </Target> - <Target Name="RebuildImportLib" AfterTargets="AfterBuild" Condition="$(Configuration) == 'Debug' or $(Configuration) == 'Release'" - DependsOnTargets="_RebuildFrozen"> </Target> - <Target Name="_CleanFrozen" BeforeTargets="CoreClean"> + <Target Name="_CleanFrozen" BeforeTargets="CoreClean" Condition="$(Configuration) != 'PGUpdate'"> <ItemGroup> <Clean Include="%(None.IntFile)" /> </ItemGroup> diff --git a/PCbuild/pcbuild.proj b/PCbuild/pcbuild.proj index f464ad3b18..b3cbd471c6 100644 --- a/PCbuild/pcbuild.proj +++ b/PCbuild/pcbuild.proj @@ -14,6 +14,18 @@ </PropertyGroup> <ItemDefinitionGroup> + <FreezeProjects> + <Platform>$(Platform)</Platform> + <Platform Condition="$(Platform) == 'ARM'">Win32</Platform> + <Platform Condition="$(Platform) == 'ARM64'">x64</Platform> + <Configuration>$(Configuration)</Configuration> + <Configuration Condition="$(Configuration) == 'PGInstrument'">Release</Configuration> + <Properties></Properties> + <BuildTarget>Build</BuildTarget> + <CleanTarget>Clean</CleanTarget> + <CleanAllTarget>CleanAll</CleanAllTarget> + <BuildInParallel>false</BuildInParallel> + </FreezeProjects> <Projects> <Platform>$(Platform)</Platform> <Configuration>$(Configuration)</Configuration> @@ -73,7 +85,7 @@ </Projects> <!-- _freeze_module --> - <Projects2 Condition="$(Platform) != 'ARM' and $(Platform) != 'ARM64'" Include="_freeze_module.vcxproj" /> + <FreezeProjects Include="_freeze_module.vcxproj" /> <!-- python[w].exe --> <Projects2 Include="python.vcxproj;pythonw.vcxproj" /> <Projects2 Include="python_uwp.vcxproj;pythonw_uwp.vcxproj" Condition="$(IncludeUwp)" /> @@ -82,6 +94,11 @@ </ItemGroup> <Target Name="Build"> + <MSBuild Projects="@(FreezeProjects)" + Properties="Configuration=%(Configuration);Platform=%(Platform);%(Properties)" + BuildInParallel="%(BuildInParallel)" + StopOnFirstFailure="true" + Targets="%(BuildTarget)" /> <MSBuild Projects="@(Projects)" Properties="Configuration=%(Configuration);Platform=%(Platform);%(Properties)" BuildInParallel="%(BuildInParallel)" diff --git a/PCbuild/pcbuild.sln b/PCbuild/pcbuild.sln index c774e04971..3629a8508a 100644 --- a/PCbuild/pcbuild.sln +++ b/PCbuild/pcbuild.sln @@ -14,6 +14,9 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "python", "python.vcxproj", EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pythoncore", "pythoncore.vcxproj", "{CF7AC3D1-E2DF-41D2-BEA6-1E2556CDEA26}" + ProjectSection(ProjectDependencies) = postProject + {19C0C13F-47CA-4432-AFF3-799A296A4DDC} = {19C0C13F-47CA-4432-AFF3-799A296A4DDC} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pythonw", "pythonw.vcxproj", "{F4229CC3-873C-49AE-9729-DD308ED4CD4A}" EndProject @@ -793,22 +796,6 @@ Global {D06B6426-4762-44CC-8BAD-D79052507F2F}.Release|Win32.Build.0 = Release|Win32 {D06B6426-4762-44CC-8BAD-D79052507F2F}.Release|x64.ActiveCfg = Release|x64 {D06B6426-4762-44CC-8BAD-D79052507F2F}.Release|x64.Build.0 = Release|x64 - {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Debug|ARM.ActiveCfg = Debug|ARM - {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Debug|ARM64.ActiveCfg = Debug|Win32 - {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Debug|Win32.ActiveCfg = Debug|Win32 - {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Debug|x64.ActiveCfg = Release|x64 - {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM - {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGInstrument|ARM64.ActiveCfg = PGInstrument|Win32 - {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGInstrument|Win32.ActiveCfg = Release|Win32 - {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGInstrument|x64.ActiveCfg = Release|x64 - {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM - {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGUpdate|ARM64.ActiveCfg = PGUpdate|Win32 - {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGUpdate|Win32.ActiveCfg = Release|Win32 - {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.PGUpdate|x64.ActiveCfg = Release|x64 - {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Release|ARM.ActiveCfg = Release|ARM - {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Release|ARM64.ActiveCfg = Release|Win32 - {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Release|Win32.ActiveCfg = Release|Win32 - {EB1C19C1-1F18-421E-9735-CAEE69DC6A3C}.Release|x64.ActiveCfg = Release|x64 {447F05A8-F581-4CAC-A466-5AC7936E207E}.Debug|ARM.ActiveCfg = Debug|ARM {447F05A8-F581-4CAC-A466-5AC7936E207E}.Debug|ARM.Build.0 = Debug|ARM {447F05A8-F581-4CAC-A466-5AC7936E207E}.Debug|ARM64.ActiveCfg = Debug|ARM64 @@ -1059,20 +1046,30 @@ Global {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Release|Win32.Build.0 = Release|Win32 {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Release|x64.ActiveCfg = Release|x64 {1D4B18D3-7C12-4ECB-9179-8531FF876CE6}.Release|x64.Build.0 = Release|x64 - {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Debug|ARM.ActiveCfg = Debug|ARM - {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Debug|ARM.ActiveCfg = Debug|Win32 + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Debug|ARM.Build.0 = Debug|Win32 + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Debug|ARM64.ActiveCfg = Debug|x64 + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Debug|ARM64.Build.0 = Debug|x64 {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Debug|Win32.ActiveCfg = Debug|Win32 + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Debug|Win32.Build.0 = Debug|Win32 {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Debug|x64.ActiveCfg = Debug|x64 - {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGInstrument|ARM.ActiveCfg = PGInstrument|ARM - {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGInstrument|ARM64.ActiveCfg = PGInstrument|ARM64 + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Debug|x64.Build.0 = Debug|x64 + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGInstrument|ARM.ActiveCfg = Release|Win32 + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGInstrument|ARM.Build.0 = Release|Win32 + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGInstrument|ARM64.ActiveCfg = Release|x64 + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGInstrument|ARM64.Build.0 = Release|x64 {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGInstrument|Win32.ActiveCfg = Release|Win32 - {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGInstrument|x64.ActiveCfg = Release|Win32 - {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGUpdate|ARM.ActiveCfg = PGUpdate|ARM - {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGUpdate|ARM64.ActiveCfg = PGUpdate|ARM64 + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGInstrument|Win32.Build.0 = Release|Win32 + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGInstrument|x64.ActiveCfg = Release|x64 + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGInstrument|x64.Build.0 = Release|x64 + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGUpdate|ARM.ActiveCfg = Release|Win32 + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGUpdate|ARM64.ActiveCfg = Release|x64 {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGUpdate|Win32.ActiveCfg = Release|Win32 - {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGUpdate|x64.ActiveCfg = Release|Win32 - {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Release|ARM.ActiveCfg = Release|ARM - {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Release|ARM64.ActiveCfg = Release|ARM64 + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.PGUpdate|x64.ActiveCfg = Release|x64 + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Release|ARM.ActiveCfg = Release|Win32 + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Release|ARM.Build.0 = Release|Win32 + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Release|ARM64.ActiveCfg = Release|x64 + {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Release|ARM64.Build.0 = Release|x64 {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Release|Win32.ActiveCfg = Release|Win32 {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Release|Win32.Build.0 = Release|Win32 {19C0C13F-47CA-4432-AFF3-799A296A4DDC}.Release|x64.ActiveCfg = Release|x64 diff --git a/Programs/_freeze_module.c b/Programs/_freeze_module.c index 7e9f02aec8..4b0633e7e7 100644 --- a/Programs/_freeze_module.c +++ b/Programs/_freeze_module.c @@ -25,12 +25,7 @@ static const struct _frozen _PyImport_FrozenModules[] = { {0, 0, 0} /* sentinel */ }; -#ifndef MS_WINDOWS -/* On Windows, this links with the regular pythonXY.dll, so this variable comes - from frozen.obj. In the Makefile, frozen.o is not linked into this executable, - so we define the variable here. */ const struct _frozen *PyImport_FrozenModules; -#endif static const char header[] = "/* Auto-generated by Programs/_freeze_module.c */"; diff --git a/Tools/scripts/freeze_modules.py b/Tools/scripts/freeze_modules.py index a9111eca63..044ea095fd 100644 --- a/Tools/scripts/freeze_modules.py +++ b/Tools/scripts/freeze_modules.py @@ -6,7 +6,8 @@ See the notes at the top of Python/frozen.c for more info. from collections import namedtuple import hashlib import os -import os.path +import ntpath +import posixpath import subprocess import sys import textwrap @@ -21,7 +22,19 @@ ROOT_DIR = os.path.dirname(TOOLS_DIR) STDLIB_DIR = os.path.join(ROOT_DIR, 'Lib') # If MODULES_DIR is changed then the .gitattributes file needs to be updated. MODULES_DIR = os.path.join(ROOT_DIR, 'Python/frozen_modules') -TOOL = os.path.join(ROOT_DIR, 'Programs', '_freeze_module') + +if sys.platform != "win32": + TOOL = os.path.join(ROOT_DIR, 'Programs', '_freeze_module') +else: + def find_tool(): + for arch in ['amd64', 'win32']: + for exe in ['_freeze_module.exe', '_freeze_module_d.exe']: + tool = os.path.join(ROOT_DIR, 'PCbuild', arch, exe) + if os.path.isfile(tool): + return tool + sys.exit("ERROR: missing _freeze_module.exe; you need to run PCbuild/build.bat") + TOOL = find_tool() + del find_tool MANIFEST = os.path.join(MODULES_DIR, 'MANIFEST') FROZEN_FILE = os.path.join(ROOT_DIR, 'Python', 'frozen.c') @@ -82,6 +95,28 @@ ESSENTIAL = { ####################################### +# platform-specific helpers + +if os.path is posixpath: + relpath_for_posix_display = os.path.relpath + + def relpath_for_windows_display(path, base): + return ntpath.relpath( + ntpath.join(*path.split(os.path.sep)), + ntpath.join(*base.split(os.path.sep)), + ) + +else: + relpath_for_windows_display = ntpath.relpath + + def relpath_for_posix_display(path, base): + return posixpath.relpath( + posixpath.join(*path.split(os.path.sep)), + posixpath.join(*base.split(os.path.sep)), + ) + + +####################################### # specs def parse_frozen_specs(sectionalspecs=FROZEN, destdir=None): @@ -253,7 +288,7 @@ class FrozenModule(namedtuple('FrozenModule', 'name ispkg section source')): if source: source = f'<{source}>' else: - source = os.path.relpath(self.pyfile, ROOT_DIR) + source = relpath_for_posix_display(self.pyfile, ROOT_DIR) return { 'module': self.name, 'ispkg': self.ispkg, @@ -397,7 +432,7 @@ def replace_block(lines, start_marker, end_marker, replacements, file): raise Exception(f"End marker {end_marker!r} " f"occurs before start marker {start_marker!r} " f"in file {file}") - replacements = [line.rstrip() + os.linesep for line in replacements] + replacements = [line.rstrip() + '\n' for line in replacements] return lines[:start_pos + 1] + replacements + lines[end_pos:] @@ -446,7 +481,7 @@ def regen_frozen(modules): for src in _iter_sources(modules): # Adding a comment to separate sections here doesn't add much, # so we don't. - header = os.path.relpath(src.frozenfile, parentdir) + header = relpath_for_posix_display(src.frozenfile, parentdir) headerlines.append(f'#include "{header}"') deflines = [] @@ -503,11 +538,10 @@ def regen_makefile(modules): frozenfiles = [] rules = [''] for src in _iter_sources(modules): - header = os.path.relpath(src.frozenfile, ROOT_DIR) - relfile = header.replace('\\', '/') - frozenfiles.append(f'\t\t$(srcdir)/{relfile} \\') + header = relpath_for_posix_display(src.frozenfile, ROOT_DIR) + frozenfiles.append(f'\t\t$(srcdir)/{header} \\') - pyfile = os.path.relpath(src.pyfile, ROOT_DIR) + 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}') @@ -546,9 +580,9 @@ def regen_pcbuild(modules): # See bpo-45186 and bpo-45188. if src.id not in ESSENTIAL and src.id != 'hello': continue - pyfile = os.path.relpath(src.pyfile, ROOT_DIR).replace('/', '\\') - header = os.path.relpath(src.frozenfile, ROOT_DIR).replace('/', '\\') - intfile = header.split('\\')[-1].strip('.h') + '.g.h' + pyfile = relpath_for_windows_display(src.pyfile, ROOT_DIR) + header = relpath_for_windows_display(src.frozenfile, ROOT_DIR) + intfile = ntpath.splitext(ntpath.basename(header))[0] + '.g.h' projlines.append(f' <None Include="..\\{pyfile}">') projlines.append(f' <ModName>{src.frozenid}</ModName>') projlines.append(f' <IntFile>$(IntDir){intfile}</IntFile>') @@ -600,7 +634,7 @@ def _freeze_module(frozenid, pyfile, frozenfile): print('#', ' '.join(os.path.relpath(a) for a in argv), flush=True) try: subprocess.run(argv, check=True) - except subprocess.CalledProcessError: + except (FileNotFoundError, subprocess.CalledProcessError): if not os.path.exists(TOOL): sys.exit(f'ERROR: missing {TOOL}; you need to run "make regen-frozen"') raise # re-raise |