Qt Moc在msbuild下并行处理多个文件 [英] Qt Moc'ing multiple files in parallel under msbuild
问题描述
使用Qt Visual Studio插件似乎可以几乎所有方式处理几乎所有事情.不幸的是,它使用msbuild中的CustomBuild步骤进行移动.这导致了一个接一个的串行移动.有没有办法说服msbuild并行执行它们-我已经厌倦了像我一样坐在它们的桂冠上的7个内核.
Using the Qt Visual studio plugin it seems to take care of most of almost everything in a seemless manner. Unfortunately it does the moc'ing using a CustomBuild step in msbuild. This results in a serial moc'ing, one after another. Is there a way to convince msbuild to do them in parallel - I'm tired of 7 cores sitting on their laurels like me.
我已经看过msbuild的BuildInParallel,但是我不确定如何在此处应用它.
I've seen msbuild's BuildInParallel, but I'm not sure how to make that apply here.
msbuild片段:
msbuild snippet:
<Project>
...
<ItemGroup>
<CustomBuild Include="a_class4.h">
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing %(Identity)...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_CORE_LIB -DQT_GUI_LIB "-I." "-I.\GeneratedFiles" "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\qtmain" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I." "-I." "-I." "-I."</Command>
</CustomBuild>
<CustomBuild Include="a_class3.h">
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing %(Identity)...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_CORE_LIB -DQT_GUI_LIB "-I." "-I.\GeneratedFiles" "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\qtmain" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I." "-I." "-I." "-I."</Command>
</CustomBuild>
</ItemGroup>
...
</Project>
推荐答案
我对Visual Studio项目不是很熟悉,所以不知道"CustomBuild" ItemGroup名称及其元数据名称是否有意义.如果这样做,您可能需要
I am not very familiar with Visual Studio projects ... so don't know if the "CustomBuild" ItemGroup name and its metadata names bear significance. If they do, you might need to
- 将ItemGroup名称修改为其他名称
- 识别可处理该问题的msbuild目标文件并对其进行修复以进行并行处理
这是一个独立的msbuild文件,可以并行执行事务.
Here is a standalone msbuild file that can execute things in parallel.
注意:
- 已添加
ping -n 30 -w 1000 127.0.0.2>nul
命令,以便我可以启动进程浏览器并找到足够的时间来计算产生了ping.exe实例的数量. - 我尝试ping 127.0.0.2,因为我希望ping不能更早完成.
- 文件中没有发生任何实际有用的事情……仅回显属性作为概念证明.
- The
ping -n 30 -w 1000 127.0.0.2>nul
command has been added so that I could launch process explorer and find enough time to count how many instances of ping.exe were spawned. - I was trying to ping 127.0.0.2 because I wanted ping not to finish earlier.
- There is nothing practically useful happening in the file ... only echoing properties as a proof of concept.
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="RunMe">
<ItemGroup>
<CustomBuild Include="a_class4.h">
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing %(Identity)...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_CORE_LIB -DQT_GUI_LIB "-I." "-I.\GeneratedFiles" "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\qtmain" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I." "-I." "-I." "-I."</Command>
</CustomBuild>
<CustomBuild Include="a_class3.h">
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing %(Identity)...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_CORE_LIB -DQT_GUI_LIB "-I." "-I.\GeneratedFiles" "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\qtmain" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I." "-I." "-I." "-I."</Command>
</CustomBuild>
</ItemGroup>
<Target Name="RunMe">
<Message Text="First populate an ItemGroup such that we can use it for parallel processing"/>
<ItemGroup>
<InputForParallelInvoke Include="$(MSBuildThisFileFullPath)">
<Properties>InputFile=%(CustomBuild.Identity);
AdditionalInputs=%(CustomBuild.AdditionalInputs);
Message=%(CustomBuild.Message);
Outputs=%(CustomBuild.Outputs);
Command=%(CustomBuild.Command)</Properties>
</InputForParallelInvoke>
</ItemGroup>
<MSBuild Projects="@(InputForParallelInvoke)" Targets="InvokeInParallel" BuildInParallel="True" />
</Target>
<Target Name="InvokeInParallel">
<Exec Command="ping -n 30 -w 1000 127.0.0.2>nul & echo Properties=$(InputFile) ##### $(AdditionalInputs) ##### $(Message) ##### $(Outputs) ##### $(Command)"/>
</Target>
</Project>
当我通过msbuild调用它时,msbuild /m \path\to\file /p:Configuration=Debug;Platform=Win32
我看到了ping.exe的两个实例.
When I invoke it on via msbuild thus msbuild /m \path\to\file /p:Configuration=Debug;Platform=Win32
I see 2 instances of ping.exe.
希望这有助于解决您的问题.
Hope this helps solve your problem.
这篇关于Qt Moc在msbuild下并行处理多个文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!