Gradle + LLVM

Ce court message peut être utile pour ceux qui souhaitent commencer rapidement à travailler avec LLVM , sans se soucier de télécharger le code source et de créer le cadre. Qui ne voudrait pas fouiller dans des scripts CMake obscurs pour atteindre le résultat attendu, et enfin, juste pour les paresseux :)

Je vais vous dire comment le faire avec élégance, juste quelques lignes dans le script de construction Gradle.

Face à la nécessité d'écrire du code sous LLVM, j'ai réalisé ce «hit». :) «Hit» est déjà au stade de la configuration de la construction du projet. J'avais besoin que le projet soit construit uniformément sous Linux et Windows. Inutile de dire qu'à chaque fois avec le projet, je ne voulais pas du tout construire le LLVM. Et, au début, je me suis appuyé sur des versions prédéfinies de la bibliothèque de leur site officiel, mais il s'est avéré qu'en fait, il n'y a que des binaires Linux construits sans RTTI et exceptions. Sous Windows, il y a un programme d'installation, mais malgré le fait qu'il s'appelle LLVM-xxx-win64.exe à l' intérieur seulement clang.

Eh bien, dans l'appendice de la build, il y a un système CMake dans lequel pour construire dans la version de sortie pour Linux, vous devez définir au stade de la configuration:

cmake -DCMAKE_BUILD_TYPE=Release 

Et sous Windows, cela, pour une raison quelconque, ne suffit pas et vous devez encore modifier la configuration dans la commande de construction elle-même:

 cmake --build . --config Release 

En général, j'ai décidé de tourner mes yeux vers Gradle et d'écrire un bon plugin qui prendrait la peine de configurer une build pour moi et me sauverait d'une routine inutile, ne laissant que les choses les plus nécessaires et de haut niveau en vue.

En fait, la discussion ci-dessous sera exclusivement consacrée à lui: cpp-llvm .
Voici la configuration minimale requise pour intégrer avec LLVM:

 plugins { id 'org.bitbucket.akornilov.cpp-llvm' version '0.1' } llvm { version = '9.0.0' // Required version. } 

Conditions de travail:

  • Java installé (8 et supérieur).
  • Gradle installé (j'ai utilisé la dernière version 5.6.2 au moment de la rédaction de l'article et je n'ai pas testé le plug-in sur les anciennes versions)
  • Gcc / CLang (versions supportant au moins C ++ 11) sous Linux.
  • MSVC 2019 (par exemple, Community Edition) sur Windows.
  • Le plugin doit être utilisé conjointement avec 'cpp-application' ou 'cpp-library'.
  • Accès au réseau au moment de la première construction pour télécharger les fichiers binaires LLVM (ou mode hors ligne, voir ci-dessous).

Versions prises en charge de LLVM:

  • 9.0.0
  • 8.0.0

Builds non officiels pour x86_64 sur Windows (msvc 2019) et Linux (Debian 10.0 + CLang 10.0). Construit avec RTTI activé et exceptions dans deux versions Release et 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

Constructions officielles à partir de serveurs LLVM, uniquement x86_64 sous Linux avec RTTI désactivé et exceptions.

Pour voir la liste des versions prises en charge pour la plate-forme actuelle, vous pouvez utiliser la commande suivante:

 gradle llvmVersions 

 > Task :llvm-app:llvmVersions 9.0.0 8.0.0 BUILD SUCCESSFUL in 2s 1 actionable task: 1 executed 

Tous les fichiers binaires LLVM nécessaires à la génération sont chargés dans le cache local (dans le dossier gradle du répertoire utilisateur) et réutilisés pour d'autres générations.

Au premier démarrage, la préparation de la construction peut prendre un temps considérable, car environ 300 Mo pour la version de débogage ou 30 Mo pour la version finale seront téléchargés à partir du réseau (les versions officielles pèsent également environ 300 Mo).

Seule la liaison statique est utilisée. pour une raison inconnue, la liaison LLVM de génération n'est pas en mesure de créer des bibliothèques dynamiques sous MSVC.

Autre configuration de plugin


Vous pouvez spécifier une adresse spécifique pour télécharger l'archive avec des fichiers binaires (.tar.xz ou .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' } 

L'essentiel est que la version spécifiée (version = xxx) coïncide avec celle qui est réelle dans l'archive sélectionnée pour le téléchargement, sinon la configuration de construction peut être incorrecte.

Vous pouvez travailler avec des binaires LLVM prêts à l'emploi (téléchargés ou créés vous-même) de manière autonome


 llvm { version = '7.0.1' localPath = '<path to unpacked LLVM build>' } 

localPath doit pointer vers un dossier existant sur le système de fichiers local à l'intérieur duquel le plugin s'attend à voir les sous-répertoires 'include' et 'lib', c'est-à-dire structure de répertoires utilisée dans les versions officielles. Si, après l'autoréglage, vous avez une structure de dossiers différente, vous devrez la «peigner». :)

Les versions doivent également correspondre, comme déjà indiqué, dans le paragraphe précédent.
Dans ce cas, rien lié à LLVM ne sera chargé à partir du réseau.

Travailler avec des composants individuels:


 llvm { version = '9.0.0' components = ['Engine', 'OrcJIT'] } 

Si vous ne travaillez qu'avec une partie spécifique de LLVM, vous devez certainement faire attention à ce paramètre. Si, par exemple, vous n'avez besoin que d'OrcJIT, pourquoi lier les cent quarante-cinq bibliothèques statiques? Le choix de composants spécifiques facilitera grandement la vie de l'éditeur de liens et vous fera gagner du temps.

Une liste de tous les composants disponibles peut être trouvée comme ceci:

 gradle llvmComponents 

Sous Linux, vous pouvez réduire considérablement le temps de liaison dans la version de débogage, si vous utilisez cette option


 llvm { version = '9.0.0' forceReleaseLinux = true } 

Dans ce cas, la version forcée de LLVM est utilisée pour la version de débogage de votre build. Dans la plupart des cas, je recommanderais de l'utiliser, sauf si vous devez déboguer LLVM lui-même. Ce paramètre n'affecte pas l'assembly sous Windows, car, malheureusement, MSVC 2019 ne permet pas de mélanger les bibliothèques de versions et de versions dans une seule version.

Eh bien, en conclusion, bien sûr, je recommanderais d'utiliser ce plugin en conjonction avec mes autres plugins :), qui peut être lu dans cet article .

cpp-build-tuner aidera à optimiser le temps de compilation et la taille du binaire résultant.

cpp-ide-generator vous donnera une intégration facile avec plusieurs IDE, dans la configuration desquels il y aura déjà des chemins vers les en-têtes LLVM et l'IDE pourra les indexer correctement.



Problème possible lors de l'utilisation de 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. 

Si vous avez vu cela, cela signifie simplement que cpp-ide-generator doit être ajouté après cpp-llvm, comme ici:

 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' } 

Un exemple complet d'utilisation du plugin peut être trouvé ici .

UPD:
Sortie de la nouvelle version du plugin cpp-llvm v0.3 :

  1. La tâche llvmCleanCache a été llvmCleanCache pour effacer tous les téléchargements LLVM dans le cache local de l'utilisateur.
  2. Ajout de la prise en charge de la liaison dynamique. Seules les versions 9.0.0 de Windows / Linux, GCC / MinGW-W64 / CLang et MSVC sont actuellement prises en charge.

 llvm { version = '9.0.0' linkage = Linkage.SHARED } 


UPD

Dans le cadre du changement de plugins d'hébergement, le groupe a été changé:
 plugins { id 'loggersoft.cpp-llvm' version '0.5' } 

Nouvelle adresse de projet: gradle-cpp.sourceforge.io
Documentation: sourceforge.net/p/gradle-cpp/wiki/cpp-llvm

Source: https://habr.com/ru/post/fr469855/


All Articles