2014-04-15 7 views
6

Buongiorno!Qt MOC più file in parallelo con MSBuild

So che c'è già questa domanda qui: Qt Moc'ing multiple files in parallel under msbuild ma non vorrei mostrare questa vecchia domanda.

Lavoro in Visual Studio 2010 e devo accelerare i tempi di compilazione della mia app. Uso tutte le flag come /MP con MSBuild -j con Make ecc. L'ultimo passaggio dell'ottimizzazione consiste nel parallelizzare i passaggi MOC. Sono dolorosamente lenti e ho cercato spesso su google e non ho trovato una soluzione.

So che esiste jom ma utilizza nmake e devo usare MSBuild.

Se qualcuno ha già sentito una soluzione, dovrebbe essere davvero bello!

Buona giornata!

risposta

1

Se si genera un file di progetto VC con qmake da qt * .pro, lo genera in modo che i mocables siano compilati in un thread. L'unico modo per ovviare a questo comportamento è chiamare esplicitamente jom per la pre-elaborazione di moc.

ho solo VS2012 (win32-msvc2012), ma ho usato per fare la cosa simile per VS2010 (win32-msvc2010 nel tuo caso)

Per fare questo si deve automatizzare i seguenti passi:

Crea progetto di VC da file pro attraverso qmake:

qmake -spec win32-msvc2012 -tp vc -o ${path-to-target}/${your-project}.vcxproj ${path-to-source}/${your-qt-pro}.pro 

creare makefile da file pro attraverso qmake:

qmake -spec win32-msvc2012 CONFIG+=release -o ${path-to-target}/Makefile', ${path-to-source}/${your-qt-pro}.pro 

Creare il seguente file .bat accanto al vcproj di file (mettere% VS100COMNTOOLS% per vc2010 e x86/x64 per arch):

call "%VS110COMNTOOLS%\..\..\VC\vcvarsall.bat" ${arch} 
md build\release\generated 
${environment.dir}\bin\jom.exe -j 16 /F Makefile.release mocables 

Per fare il debug costruire il cambiamento 'rilascio' a 'debug' (o introdurre un variabile)

Ora è necessario modificare il file di progetto VC. Ecco cosa è necessario trovare/sostituire (utilizzando le espressioni regolari):

1) Per tutti include (tag Progetto-> GruppoDi-> CustomBuild Include che contiene *.h file:

  • ritrovamento: </CustomBuild>
  • Sostituisci per: <ExcludedFromBuild>true</ExcludedFromBuild> </CustomBuild>

2) per Progetto-> ItemDefinitionGroup:

  • ritrovamento: </Link>
  • sostituire a: </Link> <PreBuildEvent> <Command>build_moc.bat</Command> </PreBuildEvent>

3) per Progetto-> ItemDefinitionGroup: - trovare: <ItemDefinitionGroup> - sostituire a: <Target Name="BeforeClean"> <Message Text="Cleaning moc generated files"/> <Exec Command="del \$\(ProjectDir\)..\\\$(Platform\)\\build\\${arch}\\generated\\moc_*.* /F /Q" /> </Target> <ItemDefinitionGroup>

automatizzo con Maven, ecco il frammento di codice per il riferimento:

build_moc.bat :

cd %1 
md build\%2\generated 
c:\\develop\\buildenv\bin\jom.exe -j 16 /F Makefile.%2 mocables 
sceneggiatura

Maven che fa le sostituzioni (Maven-sostituto-plugin config):

<!-- Disabling moc preprocessor steps, since we do it with jom -->           
<replacement> 
    <xpath>//Project/ItemGroup/CustomBuild[contains(@Include,'.h')]</xpath> 
    <token><![CDATA[</CustomBuild>]]></token> 
    <value><![CDATA[ 
     <ExcludedFromBuild>true</ExcludedFromBuild> 
    </CustomBuild> 
              ]]></value> 
</replacement> 

<!-- Adding moc preprocessor steps with jom --> 
<replacement> 
    <xpath>//Project/ItemDefinitionGroup[not(@*)]</xpath> 
    <token><![CDATA[</Link>]]></token> 
    <value><![CDATA[ 
    </Link> 
    <PreBuildEvent> 
     <Command>\$\(ProjectDir\)../${arch}/build_moc.bat \$\(ProjectDir\)../${arch} \$\(Configuration\)</Command> 
    </PreBuildEvent> 
              ]]></value> 
</replacement> 

<!-- Cleaning moc files --> 
<replacement> 
<token><![CDATA[<ItemDefinitionGroup>]]></token> 
<value><![CDATA[ 
    <Target Name="BeforeClean"> 
    <Message Text="Cleaning moc generated files"/> 
    <Exec Command="del \$\(ProjectDir\)..\\\$\(Platform\)\\build\\${arch}\\generated\\moc_*.* /F /Q" /> 
    </Target> 
    <ItemDefinitionGroup> 
              ]]></value> 
</replacement> 

Spero che questo aiuti

Problemi correlati