Parallele Kompilierung von Delphi-Projekten über MSBuild

10

Ich habe ein Skript, das alle Projekte (etwa 50) meiner Lösung wie folgt kompiliert

%Vor%

Das funktioniert gut, aber es dauert ewig, um es zu kompilieren. Um es schneller zu bauen, habe ich versucht, das Potenzial unserer modernen Multi-Core-Maschinen mit dem hier beschriebenen Schalter "/ maxcpucount" zu nutzen: Ссылка

Ich bekomme ungefähr die gleiche Kompilierungszeit auf meiner 4-Core-CPU-Dev-Maschine. Keine Perf Gewinne.

Scheinbar funktioniert das nur, wenn Projekte Abhängigkeiten aufbauen müssen. Die anderen "Arbeiter" würden diese Abhängigkeiten dann parallel als Hauptprojekt aufbauen. Also habe ich versucht, eine Projektgruppe in Delphi zu erstellen und alle meine Projekte hinzuzufügen und dann den msbuild-Befehl für diese .groupproj auszuführen, aber es ist immer noch so langsam wie es immer war.

Hat jemand von euch mit msbuild mehrere Projekte gleichzeitig erstellt? Wenn ja, kannst du mir eine Erklärung geben?

Danke!

    
tabasko 16.10.2014, 16:03
quelle

3 Antworten

6

Das Folgende gilt für RAD Studio XE4, kann jedoch auch für frühere oder spätere Versionen gelten. Außerdem werden die in .groupproj definierten Abhängigkeiten nicht mit dieser Methode berücksichtigt. Die .groupproj, die ich parallelisieren wollte, hatte keine Abhängigkeiten zwischen den Projekten, also habe ich nicht herausgefunden, wie ich damit umgehen sollte.

Wenn Sie eine .groupproj-Datei mit MSBuild mit dem Ziel Build , Clean oder Make erstellen, wird der Build nicht parallel ausgeführt, da diese Ziele die Task CallTarget verwenden, um andere Ziele auszuführen CallTarget führt seine Ziele nicht parallel aus.

Um separate Projekte parallel zu erstellen, muss das MSBuild-Projekt eine einzelne MSBuild Aufgabe um mehrere Projekte gleichzeitig zu erstellen. Die Ziele müssen wie folgt definiert sein:

%Vor%

Fügen Sie diese zu .groupproj hinzu und entfernen Sie dann die anderen <Target> -Direktiven sowie die <Import> -Direktive. ( CodeGear.Group.Targets definiert einige Ziele, um die Projekte in der richtigen Reihenfolge zu erstellen und Abhängigkeiten zu erstellen, wenn Sie nur eine Teilmenge der Projekte erstellen möchten, aber überschreibt die in der Tabelle definierten Ziele Build , Clean und Make .groupproj.) Beachten Sie, dass Sie damit nur alle Projekte erstellen können, nicht nur eine Teilmenge.

BuildInParallel wurde in MSBuild 3.5 hinzugefügt. Da .groupproj-Dateien jedoch nicht das Attribut ToolsVersion angeben, verwendet MSBuild die in Version 2.0 definierte Aufgabe MSBuild , die BuildInParallel nicht unterstützt. Es gibt zwei Möglichkeiten, dies zu beheben:

  1. Fügen Sie ToolsVersion="3.5" (oder eine spätere Version) dem Element root <Project> Ihrer .groupproj-Datei hinzu.
  2. Führen Sie MSBuild mit dem Befehlszeilenparameter /toolsversion:3.5 (oder /tv:3.5 kurz) aus ( /toolsversion überschreibt das in allen Projektdateien angegebene ToolsVersion .)

Führen Sie danach MSBuild mit dem Argument /maxcpucount (oder /m ) aus, und Ihre Projekte sollten parallel erstellt werden. RAD Studio behandelt diese transformierte Projektgruppe jedoch nicht korrekt. Daher empfiehlt es sich, der Datei eine andere Erweiterung zuzuweisen, um zu verdeutlichen, dass es sich nicht um eine Standard-RAD Studio-Projektgruppe handelt (jede Erweiterung, die in proj endet). .

Das folgende XSLT Stylesheet führt die oben beschriebene Transformation durch:

%Vor%

Sie können dieses Stylesheet mit MSBuild (4.0 oder höher) anwenden: XslTransformation wurde hinzugefügt in MSBuild 4.0) mit dieser Projektdatei (wobei groupproj2parallel.xslt für die obige XSLT-Datei steht):

%Vor%

Sie müssen InputPaths und OutputPaths explizit in der Befehlszeile mit /p:InputPaths="..." /p:OutputPaths="..." angeben oder indem Sie sie im Parameter Properties eines MSBuild Aufgabe. (Alternativ können Sie nur die Dateinamen in der Projektdatei fest codieren.)

Die mit MSBuild für C # - und Visual Basic-Projekte bereitgestellten Zieldefinitionen verarbeiten Abhängigkeiten mithilfe der in Projektdateien definierten <ProjectReference> -Elemente, anstatt Abhängigkeiten in der Lösungsdatei zu definieren. Delphi-.dproj-Dateien und C ++ Builder-.cbproj-Dateien unterstützen dies nicht, da das zugrunde liegende CodeGear.Common.Targets die in Microsoft.Common.Targets für <ProjectReference> definierte Maschine nicht wiederverwenden kann.

    
Francis Gagné 28.05.2015 00:45
quelle
2

Es gibt zwei Möglichkeiten, ein Delphi-Projekt zu erstellen: MSBuild oder DCC32.exe . MSBuild wird empfohlen, da die Projektdateien ( dproj und groupproj ) alle Konfigurationseinstellungen einschließen.

Allerdings gibt es extra Overhead mit MSBuild im Vergleich zu plain old DCC32.exe . Darüber hinaus bringt die Verwendung von MSBuild zum Erstellen einer Delphi-Projektgruppe ( .groupproj ) keine Vorteile für Multicore-CPUs. Die Build-Leistung entspricht der Single-Core-CPU.

Hier sind meine Statistiken um eine 290 dproj Datei in einem einzigen groupproj zu erstellen:

%Vor%

Aus der Lektüre können wir schließen, dass MSBuild zusätzlichen Overhead im Vergleich zu DCC32 einführt. Um die verfügbaren CPU-Kerne und -Threads voll auszunutzen, ist DCC32 der beste Weg, um den praktischen Entwurf der Verkapselung der Projektkonfiguration für .DPROJ zu opfern.

Ein msbuild Skript zum parallelen Erstellen von Delphi groupproj ist verfügbar unter Ссылка

    
Chau Chee Yang 01.12.2014 09:05
quelle
0

Etwas außerhalb des Themas: Sie könnten den Fastdcc-Teil des IDE-Fixpacks ausprobieren, um schnellere Builds zu erhalten: Ссылка Zum Beispiel habe ich eine Bauzeit von 1 Minute auf 22 Sekunden runter!

    
André 17.10.2014 06:07
quelle

Tags und Links