windows/msvc: Implement automatic qstr generation using makeqstrdefs.
Note this still needs some work: currently all source files are always preprocessed no matter which one actually changed, moreover that happens file by file without any parallellism so builds are painstakingly slow.
This commit is contained in:
parent
61b560f63f
commit
9a627e8881
|
@ -3,33 +3,74 @@
|
|||
|
||||
<Import Project="paths.props" Condition="'$(PyPathsIncluded)' != 'True'"/>
|
||||
|
||||
<!--Generate qstrdefs.h and mpversion.h similar to what is done in py/py.mk-->
|
||||
<Target Name="GenerateHeaders" DependsOnTargets="MakeQstrData;MakeVersionHdr">
|
||||
<!--Generate qstrdefs.h and mpversion.h similar to what is done in py/mkrules.mk-->
|
||||
<Target Name="GenerateHeaders" DependsOnTargets="MakeVersionHdr;MakeQstrData">
|
||||
</Target>
|
||||
|
||||
<PropertyGroup>
|
||||
<DestDir>$(PyBuildDir)genhdr\</DestDir>
|
||||
<PySrcDir>$(PyBaseDir)py\</PySrcDir>
|
||||
<QstrDefs>$(PyBaseDir)unix\qstrdefsport.h</QstrDefs>
|
||||
<QstrDefsCollected>$(DestDir)qstrdefscollected.h</QstrDefsCollected>
|
||||
<QstrGen>$(DestDir)qstrdefs.generated.h</QstrGen>
|
||||
<PyPython Condition="'$(PyPython)' == ''">python</PyPython>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PyQstrSourceFiles Include="@(ClCompile);$(PySrcDir)qstrdefs.h"/>
|
||||
</ItemGroup>
|
||||
|
||||
<Target Name="MakeDestDir">
|
||||
<MakeDir Directories="$(DestDir)"/>
|
||||
</Target>
|
||||
|
||||
<Target Name="MakeQstrData" DependsOnTargets="MakeDestDir">
|
||||
<PropertyGroup>
|
||||
<PreProc>$(DestDir)qstrdefs.preprocessed.h</PreProc>
|
||||
<QstrDefs>$(PyBaseDir)unix\qstrdefsport.h</QstrDefs>
|
||||
<DestFile>$(DestDir)qstrdefs.generated.h</DestFile>
|
||||
<TmpFile>$(DestFile).tmp</TmpFile>
|
||||
</PropertyGroup>
|
||||
<Target Name="MakeQstrDefs" DependsOnTargets="MakeDestDir" Inputs="@(PyQstrSourceFiles)" Outputs="$(QstrDefsCollected)">
|
||||
<ItemGroup>
|
||||
<PyIncDirs Include="$(PyIncDirs)"/>
|
||||
<PreProcDefs Include=" %(ClCompile.PreProcessorDefinitions)"/>
|
||||
<PyQstrSourceFiles>
|
||||
<Qstr>$([System.String]::new('%(FullPath)').Replace('$(PyBaseDir)', '$(DestDir)'))</Qstr>
|
||||
</PyQstrSourceFiles>
|
||||
<PyQstrSourceFiles>
|
||||
<Qstr>$([System.IO.Path]::ChangeExtension('%(Qstr)', '.qstr'))</Qstr>
|
||||
<PreProc>$([System.IO.Path]::ChangeExtension('%(Qstr)', '.pp'))</PreProc>
|
||||
<QstrDir>$([System.IO.Path]::GetDirectoryName('%(Qstr)'))</QstrDir>
|
||||
<PreProcOnly>$([System.String]::new('%(FileName)').Contains('qstrdefs'))</PreProcOnly>
|
||||
</PyQstrSourceFiles>
|
||||
</ItemGroup>
|
||||
<Exec Command="cl /nologo /I@(PyIncDirs, ' /I') /Fi$(PreProc) /P $(PySrcDir)qstrdefs.h"/>
|
||||
<Exec Command="$(PyPython) $(PySrcDir)makeqstrdata.py $(PreProc) $(QstrDefs) > $(TmpFile)"/>
|
||||
<MSBuild Projects="$(MSBuildThisFileFullPath)" Targets="CopyFileIfDifferent" Properties="SourceFile=$(TmpFile);DestFile=$(DestFile)"/>
|
||||
<PropertyGroup>
|
||||
|
||||
</PropertyGroup>
|
||||
|
||||
<!-- Preprocess and pass to makeqstrdefs if needed, else just copy -->
|
||||
<MakeDir Directories="@(PyQstrSourceFiles->'%(QstrDir)')"/>
|
||||
<Touch Files="$(QstrGen)" AlwaysCreate="true"/>
|
||||
|
||||
<Exec Command="cl /nologo /I@(PyIncDirs, ' /I') /D@(PreProcDefs, ' /D') /Fi%(PyQstrSourceFiles.PreProc) /P %(PyQstrSourceFiles.Identity)"/>
|
||||
<Exec Command="$(PyPython) $(PySrcDir)makeqstrdefs.py -s -o %(PyQstrSourceFiles.Qstr) %(PyQstrSourceFiles.PreProc)" Condition="'%(PyQstrSourceFiles.PreProcOnly)' != 'True'"/>
|
||||
<Copy SourceFiles="%(PyQstrSourceFiles.PreProc)" DestinationFiles="%(PyQstrSourceFiles.Qstr)" Condition="'%(PyQstrSourceFiles.PreProcOnly)' == 'True'"/>
|
||||
|
||||
<!-- Collect all output (where qstrdefs file(s) have priority over autogenerated ones), then
|
||||
filter out lines which definitely aren't qstr definitions so we don't end up with a huge (> 10mb) filesize -->
|
||||
<ReadLinesFromFile File="%(PyQstrSourceFiles.Qstr)" Condition="'%(PyQstrSourceFiles.PreProcOnly)' == 'True'">
|
||||
<Output TaskParameter="Lines" ItemName="PreProcLines"/>
|
||||
</ReadLinesFromFile>
|
||||
<ReadLinesFromFile File="%(PyQstrSourceFiles.Qstr)">
|
||||
<Output TaskParameter="Lines" ItemName="PreProcLines"/>
|
||||
</ReadLinesFromFile>
|
||||
<ItemGroup>
|
||||
<QStrLines Include="@(PreProcLines)" Condition="$([System.String]::new('%(Identity)').Contains('Q'))"/>
|
||||
</ItemGroup>
|
||||
|
||||
<WriteLinesToFile Lines="@(QStrLines)" File="$(QstrDefsCollected)" Overwrite="true"/>
|
||||
</Target>
|
||||
|
||||
<Target Name="MakeQstrData" DependsOnTargets="MakeQstrDefs">
|
||||
<PropertyGroup>
|
||||
<TmpFile>$(DestFile).tmp</TmpFile>
|
||||
</PropertyGroup>
|
||||
<Exec Command="$(PyPython) $(PySrcDir)makeqstrdata.py $(QstrDefs) $(QstrDefsCollected) > $(TmpFile)"/>
|
||||
<MSBuild Projects="$(MSBuildThisFileFullPath)" Targets="CopyFileIfDifferent" Properties="SourceFile=$(TmpFile);DestFile=$(QstrGen)"/>
|
||||
</Target>
|
||||
|
||||
<Target Name="MakeVersionHdr" DependsOnTargets="MakeDestDir">
|
||||
|
|
Loading…
Reference in New Issue