2012-06-28 56 views
4

使用Qt Visual Studio插件,它似乎幾乎無所顧忌地處理了幾乎所有的事情。不幸的是,它使用msbuild中的CustomBuild步驟進行mocing。這導致了一個又一個的連續的moc'ing。有沒有辦法讓msbuild同時做到這一點 - 我厭倦了像我一樣坐在桂冠上的7個核心。Qt在msbuild下並行多個文件並行工作

我見過msbuild的BuildInParallel,但我不確定如何使它適用於此。

MSBuild的片段:

<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> 

回答

0

我不是很熟悉的Visual Studio項目...所以不知道如果「CustomBuild 「ItemGroup名稱及其元數據名稱具有重要意義。如果他們這樣做,你可能需要

  1. 修改的ItemGroup名到別的
  2. 確定它處理的MSBuild的目標文件,並解決它的並行處理

這裏是一個獨立的MSBuild文件它可以並行執行。

注:

  1. ping -n 30 -w 1000 127.0.0.2>nul命令已添加這樣我就可以啓動進程管理器,找到足夠的時間來算ping.exe的多少實例被催生。
  2. 我試圖ping 127.0.0.2,因爲我想ping不能提前完成。
  3. 文件中沒有任何實際上有用的東西......只是迴應屬性作爲概念證明。
<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 &amp; echo Properties=$(InputFile) ##### $(AdditionalInputs) ##### $(Message) ##### $(Outputs) ##### $(Command)"/> 
    </Target> 
</Project> 

當我通過的msbuild調用它上從而msbuild /m \path\to\file /p:Configuration=Debug;Platform=Win32我看到PING.EXE的2個實例。

希望這有助於解決您的問題。

+0

我想這通過添加'<消息文本= 「構建組」/> INPUTFILE =%(CustomBuild.Identity); AdditionalInputs =%(CustomBuild.AdditionalInputs); Message =%(CustomBuild.Message); 輸出=%(CustomBuild.Outputs); Command =%(CustomBuild。命令) ' – Bim

+0

和'<目標名稱= 「InvokeInParallel」> <消息文本= 「Build Group」/> 'to「C:\ Program Files(x86)\ MSBuild \ Microsoft.Cpp \ v4.0 \ V120 \ Microsoft.CppCommon.targets」,但總是得到錯誤「錯誤MSB4184:表達式」[System.IO.Path] :: GetDirectoryName('')「無法評估」。如果ti工作,這將是甜蜜的!有任何想法嗎? 原因是我想要所有自定義構建的並行執行。 – Bim

+0

@Bim - 抱歉,我沒有關注。請注意,'$(MSBuildThisFileFullPath)'將解析爲您放置東西的文件...而不是'C:\ Program Files文件(x86)\ MSBuild \ Microsoft.Cpp \ v4.0 \ V120 \ Microsoft.CppCommon.targets '。此外,您是否嘗試過之前分享的示例獨立內容尚不清楚。 –