Dieser kurze Beitrag kann für diejenigen nützlich sein, die schnell mit
LLVM arbeiten möchten, ohne den Quellcode herunterladen und das Framework erstellen zu müssen. Wer möchte nicht in obskuren CMake-Skripten stöbern, um das erwartete Ergebnis zu erzielen, und schließlich nur für die Faulen :)
Ich werde Ihnen sagen, wie Sie es elegant machen, nur ein paar Zeilen im Gradle-Build-Skript.
Angesichts der Notwendigkeit, Code unter LLVM zu schreiben, erkannte ich diesen „Treffer“. :) "Hit" befindet sich bereits in der Konfigurationsphase des Builds für das Projekt. Ich musste das Projekt sowohl unter Linux als auch unter Windows einheitlich erstellen. Unnötig zu erwähnen, dass ich jedes Mal zusammen mit dem Projekt nicht das gesamte LLVM erstellen wollte. Zuerst habe ich mich auf vorgefertigte Versionen der Bibliothek von ihrer offiziellen Website verlassen, aber wie sich herausstellte, gibt es tatsächlich nur Linux-Binärdateien, die ohne RTTI und Ausnahmen erstellt wurden. Unter Windows gibt es ein Installationsprogramm, aber trotz der Tatsache, dass es
LLVM-xxx-win64.exe heißt,
klirrt es nur im Inneren.
Nun, im Anhang des Builds befindet sich ein CMake-System, in dem Sie zum Erstellen der Release-Version für Linux in der Konfigurationsphase Folgendes festlegen müssen:
cmake -DCMAKE_BUILD_TYPE=Release
Unter Windows reicht dies aus irgendeinem Grund nicht aus, und Sie müssen die Konfiguration im Befehl build selbst noch zusätzlich ändern:
cmake --build . --config Release
Im Allgemeinen habe ich beschlossen, meine Augen auf
Gradle zu
richten und ein gutes Plugin zu schreiben, das sich die Mühe macht, einen Build für mich zu konfigurieren und mich vor einer unnötigen Routine zu bewahren, wobei nur die notwendigsten und wichtigsten Dinge in Sicht bleiben.
In der folgenden Diskussion geht es ausschließlich um ihn:
cpp-llvm .
Hier ist die Mindestkonfiguration, die für die Integration in LLVM erforderlich ist:
plugins { id 'org.bitbucket.akornilov.cpp-llvm' version '0.1' } llvm { version = '9.0.0'
Voraussetzungen für die Arbeit:
- Installiertes Java (8 und höher).
- Installiertes Gradle (Ich habe zum Zeitpunkt des Schreibens des Artikels die neueste Version 5.6.2 verwendet und das Plug-In bei älteren Versionen nicht getestet.)
- Gcc / CLang (Versionen, die mindestens C ++ 11 unterstützen) unter Linux.
- MSVC 2019 (z. B. Community Edition) unter Windows.
- Das Plugin sollte in Verbindung mit 'cpp-application' oder 'cpp-library' verwendet werden.
- Zugriff auf das Netzwerk zum Zeitpunkt der ersten Erstellung zum Herunterladen von LLVM-Binärdateien (oder Offline-Modus, siehe unten).
Unterstützte Versionen von LLVM:
Inoffizielle Builds für x86_64 unter Windows (msvc 2019) und Linux (Debian 10.0 + CLang 10.0). Erstellt mit aktiviertem RTTI und Ausnahmen in zwei Versionen Release und Debug.
- 7.1.0
- 7.0.1
- 7.0.0
- 6.0.1
- 6.0.0
- 5.0.2
- 5.0.1
- 5.0.0
- 4.0.1
- 4.0.0
- 3.9.1
- 3.9.0
- 3.8.1
- 3.8.0
- 3.7.1
- 3.7.0
- 3.6.2
- 3.6.1
- 3.6.0
- 3.5.2
- 3.5.1
- 3.5.0
- 3.4.2
- 3.4.1
- 3.4
- 3.3
- 3.2
- 3.1
- 3.0
Offizielle Builds von LLVM-Servern, nur x86_64 unter Linux mit deaktiviertem RTTI und Ausnahmen.
Mit dem folgenden Befehl können Sie die Liste der unterstützten Versionen für die aktuelle Plattform anzeigen:
gradle llvmVersions
> Task :llvm-app:llvmVersions 9.0.0 8.0.0 BUILD SUCCESSFUL in 2s 1 actionable task: 1 executed
Alle für den Build erforderlichen LLVM-Binärdateien werden in den lokalen Cache (im gradle-Ordner im Benutzerverzeichnis) geladen und für andere Builds wiederverwendet.
Die Vorbereitung für den Bau kann beim ersten Start eine beträchtliche Zeit in Anspruch nehmen, weil Etwa 300 MB für die Debug-Version oder 30 MB für die Release-Version werden aus dem Netzwerk heruntergeladen (offizielle Versionen wiegen ebenfalls etwa 300 MB).
Es wird nur eine statische Verknüpfung verwendet. Aus einem unbekannten Grund kann die Build-LLVM-Bindung keine dynamischen Bibliotheken unter MSVC erstellen.
Andere Plugin-Konfiguration
Sie können eine bestimmte Adresse zum Herunterladen des Archivs mit Binärdateien angeben (.tar.xz oder .tar.gz).
llvm { version = '7.0.1' serverUrl = 'http://releases.llvm.org/7.0.1/clang%2bllvm-7.0.1-x86_64-linux-gnu-ubuntu-18.04.tar.xz' }
Die Hauptsache ist, dass die angegebene Version (version = xxx) mit der übereinstimmt, die in dem zum Download ausgewählten Archiv echt ist, andernfalls ist die Build-Konfiguration möglicherweise falsch.
Sie können autonom mit vorgefertigten LLVM-Binärdateien (heruntergeladen oder selbst erstellt) arbeiten
llvm { version = '7.0.1' localPath = '<path to unpacked LLVM build>' }
localPath sollte auf einen vorhandenen Ordner im lokalen Dateisystem verweisen, in dem das Plugin erwartet, dass die Unterverzeichnisse 'include' und 'lib' angezeigt werden, d. h. Verzeichnisstruktur, die in offiziellen Builds verwendet wird. Wenn Sie nach der Selbstoptimierung eine andere Ordnerstruktur haben, müssen Sie diese „kämmen“. :) :)
Die Versionen sollten auch, wie bereits im vorherigen Absatz erwähnt, übereinstimmen.
In diesem Fall wird nichts, was mit LLVM zu tun hat, aus dem Netzwerk geladen.
Arbeiten Sie mit einzelnen Komponenten:
llvm { version = '9.0.0' components = ['Engine', 'OrcJIT'] }
Wenn Sie nur mit einem bestimmten Teil von LLVM arbeiten, müssen Sie diesen Parameter unbedingt beachten. Wenn Sie beispielsweise nur OrcJIT benötigen, warum sollten Sie dann alle einhundertfünfundvierzig statischen Bibliotheken verknüpfen? Die Auswahl bestimmter Komponenten erleichtert die Lebensdauer des Linkers erheblich und Sie sparen Zeit.
Eine Liste aller verfügbaren Komponenten finden Sie folgendermaßen:
gradle llvmComponents
Unter Linux können Sie die Verbindungszeit in der Debug-Version erheblich reduzieren, wenn Sie diese Option verwenden
llvm { version = '9.0.0' forceReleaseLinux = true }
In diesem Fall wird die erzwungene Version von LLVM für die Debug-Version Ihres Builds verwendet. In den meisten Fällen würde ich die Verwendung empfehlen, es sei denn, Sie müssen LLVM selbst debuggen. Dieser Parameter wirkt sich nicht auf die Assembly unter Windows aus, da MSVC 2019 leider nicht das Mischen von Release- und Release-Bibliotheken in einem Build zulässt.
Abschließend würde ich natürlich empfehlen, dieses Plugin in Verbindung mit meinen anderen Plugins zu verwenden :), über die in
diesem Artikel gelesen werden kann.
cpp-build-tuner hilft dabei, die Kompilierungszeit und die Größe der resultierenden Binärdatei zu optimieren.
Mit cpp-ide-generator können Sie problemlos mehrere IDEs integrieren, in deren Konfiguration bereits Pfade zu LLVM-Headern vorhanden sind und die IDE diese korrekt indizieren kann.

Mögliches Problem bei Verwendung von cpp-ide-generator:
FAILURE: Build failed with an exception. * What went wrong: A problem occurred configuring project ':llvm-app'. > Cannot change dependencies of configuration ':llvm-app:cppCompileDebug' after it has been resolved.
Wenn Sie dies gesehen haben, bedeutet dies nur, dass cpp-ide-generator nach cpp-llvm hinzugefügt werden sollte, wie hier:
plugins { id 'cpp-application' id 'org.bitbucket.akornilov.cpp-build-tuner' version '0.7' id 'org.bitbucket.akornilov.cpp-llvm' version '0.1' id 'org.bitbucket.akornilov.cpp-ide-generator' version '0.5' }
Ein vollständiges Beispiel für die Verwendung des Plugins finden Sie
hier .
UPD:Neue Version des
cpp-llvm v0.3 Plugins
veröffentlicht :
- Die
llvmCleanCache
Task wurde llvmCleanCache
, um alle LLVM-Downloads im lokalen Cache des Benutzers zu löschen. - Unterstützung für dynamische Verknüpfung hinzugefügt. Derzeit werden nur Version 9.0.0 von Windows / Linux, GCC / MinGW-W64 / CLang und MSVC unterstützt.
llvm { version = '9.0.0' linkage = Linkage.SHARED }
UPDIm Zusammenhang mit der Änderung der Hosting-Plugins wurde die Gruppe geändert:
plugins { id 'loggersoft.cpp-llvm' version '0.5' }
Neue Projektadresse:
gradle-cpp.sourceforge.ioDokumentation:
sourceforge.net/p/gradle-cpp/wiki/cpp-llvm