Gradle + LLVM

قد تكون هذه المشاركة القصيرة مفيدة لأولئك الذين يرغبون في بدء العمل بسرعة مع LLVM ، دون عناء في تنزيل الكود المصدري وبناء الإطار. الذي لا يريد أن يتجول في البرامج النصية CMake غامضة لتحقيق النتيجة المتوقعة ، وأخيرا ، فقط للكسول :)

سوف أخبرك بكيفية القيام بذلك بأمان ، فقط سطرين في البرنامج النصي لإنشاء Gradle.

في مواجهة الحاجة إلى كتابة التعليمات البرمجية تحت LLVM ، أدركت أن "ضرب". :) "Hit" موجود بالفعل في مرحلة التكوين للبناء للمشروع. كنت بحاجة إلى أن يتم بناء المشروع بشكل موحد تحت كل من Linux و Windows. وغني عن القول ، في كل مرة جنبا إلى جنب مع المشروع لم أكن أرغب في بناء LLVM بأكمله على الإطلاق. وفي البداية ، اعتمدت على إصدارات سابقة للمكتبة من المكتبة من موقعها الرسمي ، ولكن كما اتضح ، في الواقع ، توجد ثنائيات Linux فقط بدون RTTI والاستثناءات. تحت Windows يوجد برنامج تثبيت ، ولكن على الرغم من حقيقة أنه يطلق عليه LLVM-xxx-win64.exe داخل رنة فقط.

حسنًا ، في ملحق البناء ، يوجد نظام CMake والذي تحتاج إلى تعيينه في مرحلة التكوين للبناء في إصدار الإصدار لنظام التشغيل Linux:

cmake -DCMAKE_BUILD_TYPE=Release 

وفي ظل نظام Windows ، هذا لا يكفي ، لسبب ما ، ولا يزال يتعين عليك تغيير التكوين في أمر build نفسه:

 cmake --build . --config Release 

بشكل عام ، قررت أن أغمض عيني إلى Gradle وأكتب مكوّنًا إضافيًا جيدًا من شأنه أن يصيبني في تكوين مبنى لي وينقذني من روتين لا لزوم له ، ولم يتبق سوى الأشياء الأكثر ضرورة وعالية المستوى في الأفق.

في الواقع ، فإن المناقشة أدناه ستكون حصرا عنه: cpp-llvm .
فيما يلي الحد الأدنى من التكوين المطلوب للتكامل مع LLVM:

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

متطلبات العمل:

  • تثبيت جافا (8 وما فوق).
  • مثبت Gradle (استخدمت أحدث إصدار 5.6.2 في وقت كتابة المقال ولم أختبر المكوّن الإضافي على الإصدارات الأقدم)
  • Gcc / CLang (الإصدارات التي تدعم C ++ 11 على الأقل) على Linux.
  • MSVC 2019 (مثل Community Edition) على نظام Windows.
  • يجب استخدام المكون الإضافي بالتزامن مع "cpp-application" أو "cpp-library".
  • الوصول إلى الشبكة في وقت الإنشاء الأول لتنزيل الملفات الثنائية LLVM (أو وضع عدم الاتصال ، انظر أدناه).

الإصدارات المدعومة من LLVM:

  • 9.0.0
  • 8.0.0

تصميمات غير رسمية لـ x86_64 على Windows (msvc 2019) و Linux (Debian 10.0 + CLang 10.0). بنيت مع RTTI تمكين والاستثناءات في نسختين الإصدار و 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

تصميمات رسمية من خوادم LLVM ، يتم إيقاف تشغيل x86_64 فقط ضمن نظام Linux مع RTTI والاستثناءات.

لمشاهدة قائمة الإصدارات المدعومة للنظام الأساسي الحالي ، يمكنك استخدام الأمر التالي:

 gradle llvmVersions 

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

يتم تحميل جميع الثنائيات LLVM اللازمة للبناء في ذاكرة التخزين المؤقت المحلية (في مجلد gradle في دليل المستخدم) وإعادة استخدامها للبنيات الأخرى.

في البداية ، يمكن أن يستغرق الإعداد للبناء وقتًا كبيرًا ، لأن سيتم تنزيل حوالي 300 ميجابايت لإصدار تصحيح الأخطاء أو 30 ميغابايت لإصدار الإصدار من الشبكة (تزن الإصدارات الرسمية أيضًا حوالي 300 ميجابايت).

يتم استخدام الربط الثابت فقط. لسبب غير معروف ، ربط LLVM بناء غير قادر على إنشاء مكتبات حيوية تحت MSVC.

التكوين المساعد الآخر


يمكنك تحديد عنوان محدد لتنزيل الأرشيف باستخدام الثنائيات (.tar.xz أو .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' } 

الشيء الرئيسي هو أن الإصدار المحدد (الإصدار = xxx) يتزامن مع الإصدار الحقيقي في الأرشيف المحدد للتنزيل ، وإلا فقد يكون تكوين البنية غير صحيح.

يمكنك العمل مع ثنائيات LLVM الجاهزة (التي تم تنزيلها أو بنائها بنفسك) بشكل مستقل


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

يجب أن يشير localPath إلى مجلد موجود على نظام الملفات المحلي الذي يتوقع المكون الإضافي رؤية الدلائل الفرعية "تضمينه" و "lib" ، أي بنية الدليل المستخدمة في البنيات الرسمية. إذا كان لديك بنية مجلد مختلفة بعد الضبط الذاتي ، فستحتاج إلى "تمشيطها". :)

يجب أن تتطابق الإصدارات أيضًا ، كما لوحظ بالفعل ، في الفقرة السابقة.
في هذه الحالة ، لن يتم تحميل أي شيء متعلق بـ LLVM من الشبكة.

العمل مع المكونات الفردية:


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

إذا كنت تعمل فقط مع جزء محدد من LLVM ، فأنت بحاجة بالتأكيد إلى الانتباه إلى هذه المعلمة. على سبيل المثال ، إذا كنت تحتاج فقط إلى OrcJIT ، فلماذا تربط جميع المكتبات الثابتة البالغ عددها مائة وخمسين مكتبة؟ إن اختيار مكونات محددة سوف يسهل إلى حد كبير حياة الموصل ، وسوف يوفر الوقت.

يمكن العثور على قائمة بجميع المكونات المتاحة مثل هذا:

 gradle llvmComponents 

على نظام Linux ، يمكنك تقليل وقت الارتباط بدرجة كبيرة في إصدار تصحيح الأخطاء ، إذا كنت تستخدم هذا الخيار


 llvm { version = '9.0.0' forceReleaseLinux = true } 

في هذه الحالة ، يتم استخدام الإصدار القسري من LLVM لإصدار تصحيح البناء الخاص بك. في معظم الحالات ، أوصي باستخدامه إلا إذا كنت بحاجة إلى تصحيح LLVM نفسه. لا تؤثر هذه المعلمة على التجميع على Windows ، لأن MSVC 2019 ، للأسف ، لا يسمح بخلط مكتبات الإصدار والإصدار في بنية واحدة.

حسنًا ، في الختام ، بالطبع ، أوصي باستخدام هذا المكون الإضافي بالتزامن مع الإضافات الأخرى الخاصة بي :) ، والتي يمكن قراءتها في هذه المقالة .

سيساعد cpp-build-tuner في تحسين وقت الترجمة وحجم الثنائي الناتج.

سيمنحك cpp-ide-generator تكاملًا سهلاً مع العديد من IDEs ، حيث سيكون هناك بالفعل مسارات لرؤوس LLVM وسيكون IDE قادرًا على فهرستها بشكل صحيح.



مشكلة محتملة عند استخدام 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. 

إذا رأيت هذا ، فهذا يعني فقط أنه يجب إضافة cpp-ide-generator بعد cpp-llvm ، كما هو الحال هنا:

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

يمكن العثور هنا على مثال كامل لاستخدام البرنامج المساعد.

UPD:
تم إصدار نسخة جديدة من البرنامج المساعد cpp-llvm v0.3 :

  1. تمت llvmCleanCache مهمة llvmCleanCache لمسح جميع تنزيلات LLVM في ذاكرة التخزين المؤقت المحلية للمستخدم.
  2. دعم إضافي للربط الديناميكي. يتم دعم الإصدار 9.0.0 فقط من Windows / Linux و GCC / MinGW-W64 / CLang و MSVC حاليًا.

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


UPD

فيما يتعلق بتغيير إضافات الاستضافة ، تم تغيير المجموعة:
 plugins { id 'loggersoft.cpp-llvm' version '0.5' } 

عنوان المشروع الجديد: gradle-cpp.sourceforge.io
الوثائق: sourceforge.net/p/gradle-cpp/wiki/cpp-llvm

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


All Articles