2017-05-23 2 views
2

Ich baue C/C++ Code mit Gradle unter Linux (GCC) und Windows (VS10) wie es in Building native software documentation von Gradle beschrieben ist.Gradle Compiler-Ausgabe beim Erstellen von C/C++ Code

Der Build-Prozess ist in Ordnung, und ich kann meine Anwendung starten. Wenn während des Build-Prozesses Fehler auftreten, können Sie die Compiler-Ausgabe wie Warnungen und Fehler auf der Konsole sehen. Diese Ausgabe wird zusätzlich in eine Datei geschrieben: build/tmp/"TaskName"/output.txt. Das Problem ist, dass diese Ausgabe nicht auf der Konsole angezeigt wird, wenn der Build ohne Fehler ausgeführt wird, trotzdem wird die Datei geschrieben.

Ich suche nach einer Möglichkeit, die Compiler-Ausgabe wie Warnungen oder Fehler auf der Konsole anzuzeigen, selbst wenn der Build erfolgreich war.

Es ist posible die gradle bauen mit einer höheren Protokollebene zu starten: gradle build --info, aber es gibt so viel addional Ausgabe, die ich nicht wollen tun.

Ich habe bereits versucht, etwas wie der Code unten in der build.gradle Datei, um die Protokollierungsstufe nur für alle Compiling-Aufgaben, aber es macht keinen Unterschied, wie ich würde starten die Gradle Build nur mit: gradle build.

tasks.whenTaskAdded { task -> 
    if (task instanceof CCompile || task instanceof CppCompile) { 
     logging.setLevel(LogLevel.INFO) 
    } 
} 

Meine Frage:

Gibt es eine Möglichkeit die Compiler-Fehler/Warnungen auf der Konsole ohne den Overhead zu bekommen? Ist es überhaupt möglich, die LogLevel für einige Aufgaben zu setzen? Wenn ja, was ist falsch an dem obigen Code?

Jede Hilfe wird geschätzt.

+0

Scheint wie eine [Ausgabe für gradle] (https://discuss.gradle.org/t/how-to-report-a-bug/12055), selbst wenn es nur eine Dokumentation Problem sein kann. – stefaanv

Antwort

0

ich es jetzt gelöst ausgeführt haben, weil die bereits bestehenden answer von Johan Engblom mich in die richtige Richtung. Anstatt plattformabhängig cat outputfile.txt (Linux) zu verwenden, verwende ich die Fähigkeiten von gradle, so dass es auf Windows oder Linux funktioniert. Sicher, diese Lösung gibt die Compilerausgabe nicht aus, während sie kompiliert, aber sie gibt sie aus, nachdem der Job beendet wurde.

Um eine Aufgabe nach der Kompilier- und Verknüpfungsaufgabe hinzuzufügen, füge ich Folgendes hinzu (diese Aufgabe wird ausgeführt, wenn die Erstellung fehlgeschlagen oder erfolgreich war).

tasks.withType(InstallExecutable) { 
    finalizedBy showCompilerOutput 
} 

Wenn Sie nur showCompilerOutput auszuführen, wenn der Build erfolgreich war Sie diese verwenden können:

build.finalizedBy showCompilerOutput 

Die Aufgabe showCompilerOutput ist für die Anzeige der Ausgabe der Dateien, die ich in meiner Frage erwähnt. Daher erstellt es einen Dateibaum, der auf die Dateien verweist, die ich erwähnte: output.txt.

task showCompilerOutput { 
    dependsOn showCompilerOptions 
    doLast { 
     println '\n-----------------------------------------------------\n' 
     println 'Compiler output:' 
     FileTree tree = fileTree('build').include('**/output.txt') 
     // Iterate over the contents of a tree 
     tree.each {File file -> 
      println 'Content of file ' + file + ':\n' 
      println file.text 
      println '------\n' 
     } 
    } 
} 

Diese Aufgabe wird auch von einer anderen Aufgabe, die abhängigen showCompilerOptions genannt wird, die mit den Compiler-Optionen den gleichen, aber für die Dateien tut: options.txt.

task showCompilerOptions { 
    doLast { 
     println '\n-----------------------------------------------------\n' 
     println 'Compiler options:' 
     FileTree tree = fileTree('build').include('**/options.txt') 
     // Iterate over the contents of a tree 
     tree.each {File file -> 
      println 'Content of file ' + file + ':\n' 
      println file.text 
      println '------\n' 
     } 
    } 
} 
0

fügen Sie einfach einen cat outputfile.txt, nachdem Sie Ihren gradle Befehl

+0

Das wäre einfach, aber im Ausgabeordner ('build/tmp /') gibt es viele Ordner ('" TaskName "') wie: 'compileBasecodeLinux_x86_64SharedLibraryBasecodeCpp' oder' linkBasecodeLinux_x86_64SharedLibrary'. Ich müsste deine Antwort erweitern, um in jeden Ordner zu gehen und ihn auszugeben. Entweder ich erkläre jeden Namen für mich selbst oder ich gehe in jeden Ordner, der existiert. Vielen Dank für Ihre Idee! –

Verwandte Themen