Qt Moc'ing нескольких файлов параллельно под msbuild

Используя плагин Qt Visual studio, он, кажется, беспрепятственно заботится почти обо всем. К сожалению, это делается с помощью шага CustomBuild в msbuild. Это приводит к последовательному moc'ing, одно за другим. Есть ли способ убедить msbuild делать их параллельно - я устал от 7 ядер, сидящих на лаврах, как я.

Я видел BuildInParallel msbuild, но не знаю, как применить это здесь.

Фрагмент 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>

person Zac    schedule 28.06.2012    source источник


Ответы (2)


Вы можете строить параллельно, используя jom:
http://labs.qt.nokia.com/2009/03/27/speeding-up-visual-c-qt-builds/

person svlasov    schedule 18.07.2012
comment
К сожалению, это возможно только в том случае, если вы используете nmake, я не верю, что это применимо, если вы используете msbuild. - person Zac; 19.07.2012
comment
@Zac - Извините, если я пропустил это, но этот отдельный фрагмент, которым я поделился, захватил / реализовал ваше намерение? - person Parag Doke; 20.09.2015

Я не очень знаком с проектами Visual Studio ... поэтому не знаю, имеет ли значение имя ItemGroup "CustomBuild" и имена его метаданных. Если они это сделают, вам может потребоваться

  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 я вижу 2 экземпляра ping.exe.

Надеюсь, это поможет решить вашу проблему.

person Parag Doke    schedule 14.04.2015
comment
Я попробовал это, добавив <Message Text="Build Group"/> <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" /> - person Bim; 18.09.2015
comment
и <Target Name="InvokeInParallel"> <Message Text="Build Group"/> <Exec Command="echo bla"/> </Target> в C: \ Program Files (x86) \ MSBuild \ Microsoft.Cpp \ v4.0 \ V120 \ Microsoft.CppCommon.targets, но всегда получаю ошибку error MSB4184: выражение [System.IO.Path] :: GetDirectoryName ('') не могут быть оценены. Было бы мило, если бы это сработало! Любые идеи? Причина в том, что я хотел параллельное выполнение для всех пользовательских сборок. - person Bim; 18.09.2015
comment
@Bim - Извини, я не понимаю. Обратите внимание, что $(MSBuildThisFileFullPath) преобразуется в файл, в который вы помещаете свой материал ... не C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppCommon.targets. Кроме того, неясно, пробовали ли вы образец автономного контента, которым я поделился ранее. - person Parag Doke; 20.09.2015
comment
Я не пробовал использовать автономный образец, но добавил код для создания группы и параллельной компиляции в файл Microsoft.CppCommon.targets, который косвенно включен в мой файл .vxproj через Microsoft.Cpp.targets. В файле есть раздел, который выполняет пользовательскую сборку для всех элементов в файле проекта, добавленном с помощью CustomBuild (он начинается со строки <Target Name="CustomBuild" ca. line ~ 159). Я вижу, что ItemGroup строится правильно с путями и всем остальным, когда я выводю их с помощью команды Message, но когда команды выдаются позже, я получаю указанную выше ошибку пути ... - person Bim; 21.09.2015