ما الذي يحاول هذا المشروع القيام به من أجلي؟
أولاً ، قم بتزويد مستخدمي Bazel Cross-Platform Complete لعائلة لغة C (C ++ ، C ، Objective-C ، Objective-C ++ ، و CUDA) ، وبالتالي جعل التطوير أكثر كفاءة وممتعة!
بشكل أعم ، تصدير تصدير الإجراءات في تنسيق compile_commands.json الذي يتيح أدوات رائعة مفصول من Bazel.

▲ يستخرج compile_commands.json ، تمكين clangd التلقائي في المحرر ▼

رائع جدا مع الحواف الخام الطفيفة جدا. نستخدم هذا كل يوم ونحبه.
إذا لم تكن هناك ارتباطات منذ فترة ، فهذا بسبب الاستقرار ، وليس الإهمال. هذا في الاستخدام اليومي داخل هيدرون.
للاستخدام اليومي ، نوصي باستخدام هذا بدلاً من محولات IDE الخاصة بالنظام الأساسي (مثل Tulsi أو المكون الإضافي ASWB/CLION إلى الحد الذي يعمل فيه) ، باستثناء الأوقات التي تحتاج فيها إلى بعض الميزة الخاصة بمنصة محرر (مثل Apple NextStep Interface Builder) التي لن يتم دعمها أبدًا في محرر من النوع المتقاطع.
هناك الكثير من الأشخاص الذين يستخدمون هذه الأداة. ويشمل ذلك الشركات الكبيرة والمشاريع ذات المداخن الصعبة ، كما هو الحال في الروبوتات.
نحن بما في ذلك بعض الأشياء التي قالوها. نأمل أن يمنحكوا ثقة كافية لتجربة هذه الأداة أيضًا!
"شكرًا على أداة رائعة! من السهل جدًا إعدادها واستخدامها." - مهندس روبوتات في بوسطن ديناميات
"شكرًا لك على إظهار الكثير من الصرامة في ما يمكن أن يكون مجرد مشروع أدوات غير مهتم. هذا بالتأكيد يبدو وكأنه لحظة Baton/Torch. أطيب تمنياتي لكل ما تفعله في الحياة." - مؤلف أفضل أداة سابقة من هذا النوع
وقت الإعداد الأساسي: 10 أمتار
مرحبا ، مستخدم بازل؟ دعنا نجدك بسرعة مع بعض الأدوات الرائعة لعائلة لغة C.
هناك مجموعة من النص هنا ولكن فقط لأننا نحاول تهجئة الأمور ونجعلها سهلة. إذا كان لديك مشاكل ، فأخبرنا بذلك ؛ نحن نحب مساعدتك في جعل الأشياء أفضل وأكثر اكتمالا - ونحب مساعدتك!
انسخ هذا إلى MODULE.bazel الخاصة بك.
# Hedron's Compile Commands Extractor for Bazel
# https://github.com/hedronvision/bazel-compile-commands-extractor
bazel_dep ( name = "hedron_compile_commands" , dev_dependency = True )
git_override (
module_name = "hedron_compile_commands" ,
remote = "https://github.com/hedronvision/bazel-compile-commands-extractor.git" ,
commit = "0e990032f3c5a866e72615cf67e5ce22186dcb97" ,
# Replace the commit hash (above) with the latest (https://github.com/hedronvision/bazel-compile-commands-extractor/commits/main).
# Even better, set up Renovate and let it do the work for you (see "Suggestion: Updates" in the README).
) انسخ هذا في الجزء العلوي من ملف WORKSPACE Bazel ، مع التأكد من التحديث إلى أحدث الالتزام لكل الإرشادات أدناه. سيمنع وضعه في الأعلى أدوات أخرى من ربط أي من تبعياتها بالإصدارات القديمة ؛ نحن نعد بإبقاء إصدارات التبعية الخاصة بنا محدثة.
load ( "@bazel_tools//tools/build_defs/repo:http.bzl" , "http_archive" )
# Hedron's Compile Commands Extractor for Bazel
# https://github.com/hedronvision/bazel-compile-commands-extractor
http_archive (
name = "hedron_compile_commands" ,
# Replace the commit hash (0e990032f3c5a866e72615cf67e5ce22186dcb97) in both places (below) with the latest (https://github.com/hedronvision/bazel-compile-commands-extractor/commits/main), rather than using the stale one here.
# Even better, set up Renovate and let it do the work for you (see "Suggestion: Updates" in the README).
url = "https://github.com/hedronvision/bazel-compile-commands-extractor/archive/0e990032f3c5a866e72615cf67e5ce22186dcb97.tar.gz" ,
strip_prefix = "bazel-compile-commands-extractor-0e990032f3c5a866e72615cf67e5ce22186dcb97" ,
# When you first run this tool, it'll recommend a sha256 hash to put here with a message like: "DEBUG: Rule 'hedron_compile_commands' indicated that a canonical reproducible form can be obtained by modifying arguments sha256 = ..."
)
load ( "@hedron_compile_commands//:workspace_setup.bzl" , "hedron_compile_commands_setup" )
hedron_compile_commands_setup ()
load ( "@hedron_compile_commands//:workspace_setup_transitive.bzl" , "hedron_compile_commands_setup_transitive" )
hedron_compile_commands_setup_transitive ()
load ( "@hedron_compile_commands//:workspace_setup_transitive_transitive.bzl" , "hedron_compile_commands_setup_transitive_transitive" )
hedron_compile_commands_setup_transitive_transitive ()
load ( "@hedron_compile_commands//:workspace_setup_transitive_transitive_transitive.bzl" , "hedron_compile_commands_setup_transitive_transitive_transitive" )
hedron_compile_commands_setup_transitive_transitive_transitive ()تأتي التحسينات بشكل متكرر ، لذلك نوصي بمتابعة محدثة.
نوصي بشدة بإعداد تجديد (أو ما شابه) في مرحلة ما للحفاظ على هذا التبعية (وغيرها) محدّثًا بشكل افتراضي. [نحن لسنا منتميين بتجديد أو أي شيء ، لكننا نعتقد أنه رائع. إنه يشاهد الإصدارات الجديدة ويرسل لك PRS للمراجعة أو الاختبار الآلي. إنه مجاني وسهل الإعداد. لقد كان مفيدًا بشكل مذهل في قاعدة كودنا ، وقد عملنا مع المشرف الرائع لجعل الأمور رائعة لاستخدام البازل. ويتم استخدامه في مستودعات Bazel الرسمية.] إليك مثال تكوين تجديد من أحد مشاريعنا ، على أمل أن يوفر لك الوقت.
إذا لم يكن الأمر الآن ، فربما تعود إلى هذه الخطوة لاحقًا ، أو شاهد هذا الريبو للحصول على التحديثات. [أو مهلا ، ربما امنحنا نجمًا سريعًا ، بينما كنت تفكر في المشاهدة.] مثل Abseil ، نعيش في الرأس ؛ الالتزام الأخير بالفرع الرئيسي هو الالتزام الذي تريده. لذلك لا تعتمد على إشعارات الإفراج ؛ استخدم التجديد أو الاستطلاع يدويًا للالتزامات الجديدة.
سنقوم بإنشاء ملف compile_commands.json في جذر مساحة عمل Bazel.
يصف هذا الملف كيف يقوم Bazel بتجميع جميع ملفات C (++) أو CUDA. من خلال أوامر التجميع بتنسيق شائع ، يمكن للأدوات المستقلة عن النظام (مثل الإكمال التلقائي clangd ، clang-tidy linting وما إلى ذلك) العمل.
سنقوم بتشغيله ثم ننتقل إلى القسم التالي أثناء وجوده بعيدًا. ولكن في المستقبل ، في كل مرة تريد أن ترى فيها الأدوات (مثل الإكمال التلقائي) تغييرات جديدة في BUILD ، أعد تشغيل الأمر الذي اخترته أدناه! سوف Clangd التقاط التغييرات تلقائيا.
في هذه الحالة ، فقط bazel run @hedron_compile_commands//:refresh_all
ملاحظة: يجب عليك bazel run هذه الأداة ، وليس فقط bazel build .
--config=my_important_flags_or_toolchains --compilation_mode=dbg ، تقوم بتطبيقها يدويًا على جميع عمليات الإنشاء الخاصة بك أثناء التطوير؟من المهم إلى حد ما أن تقوم بتزويد هذه الأعلام نفسها عند تشغيل هذه الأداة أيضًا ، حتى نتمكن من فهم البناء بدقة ، حيث يتم إنشاء الملفات ، وما إلى ذلك.
إلحاق ، على سبيل المثال -- --config=my_important_flags_or_toolchains --compilation_mode=dbg إلى ما سبق ، أو أي علامات تبنيها عادة أثناء التطوير.
ملاحظة: الإضافي -- ليس خطأً ، ويعمل على تمرير الأعلام إلى هذه الأداة عندما يتم تشغيله بدلاً من أن يبني. يجب أن يبدو الأمر الخاص بك مثل:
bazel run @hedron_compile_commands//:refresh_all -- --config=my_important_flags_or_toolchains --compilation_mode=dbg
في هذه الحالة ، يمكنك بسهولة تحديد أهداف الإخراج من المستوى الأعلى الذي تعمل عليه والأعلام اللازمة لبناءها.
افتح ملف BUILD - نوصي باستخدام (أو إنشاء) //BUILD وإضافة شيء مثل:
load ( "@hedron_compile_commands//:refresh_compile_commands.bzl" , "refresh_compile_commands" )
refresh_compile_commands (
name = "refresh_compile_commands" ,
# Specify the targets of interest.
# For example, specify a dict of targets and any flags required to build.
targets = {
"//:my_output_1" : "--important_flag1 --important_flag2=true" ,
"//:my_output_2" : "" ,
},
# No need to add flags already in .bazelrc. They're automatically picked up.
# If you don't need flags, a list of targets is also okay, as is a single target string.
# Wildcard patterns, like //... for everything, *are* allowed here, just like a build.
# As are additional targets (+) and subtractions (-), like in bazel query https://docs.bazel.build/versions/main/query.html#expressions
# And if you're working on a header-only library, specify a test or binary target that compiles it.
) (لمزيد من التفاصيل حول refresh_compile_commands ، انظر إلى المستندات في الجزء العلوي من refresh_compile_commands.bzl ).
أخيرًا ، ستحتاج إلى bazel run :refresh_compile_commands
ccls أو أداة أخرى ، على عكس clangd ، لا تريد أو تحتاج إلى رؤوس في compile_commands.json ؟ على غرار ما ورد أعلاه ، سنستخدم refresh_compile_commands للتكوين ، ولكن بدلاً من تعيين targets ، قم بتعيين exclude_headers = "all" .
compile_commands.json يأخذ بعض الوقت لتوليده: يمكن إضافة exclude_external_sources = True و exclude_headers = "external" المساعدة ، مع بعض المقايضات.
في الوقت الحالي ، نقترح الاستمرار في إعداد clangd (أدناه). بعد ذلك ، إذا أثبتت مشروعك أنه كبير بما يكفي بحيث يمتد قدرة clangd و/أو هذه الأداة للفهرس بسرعة ، فقم بإلقاء نظرة على المستندات في الجزء العلوي من refresh_compile_commands.bzl للحصول على تعليمات حول كيفية ضبط تلك الأعلام والآخرين.
compile_commands.json دعنا نتم تثبيت ملحق clangd وتكوينه.
code --install-extension llvm-vs-code-extensions.vscode-clangd
# We also need make sure that Microsoft's C++ extension is not involved and interfering.
code --uninstall-extension ms-vscode.cpptoolsبعد ذلك ، افتح إعدادات مستخدم VSCODE ، لذلك سيتم إعداد الأمور تلقائيًا لجميع المشاريع التي تفتحها.
ابحث عن "clangd".
أضف الإدخالات الثلاثة التالية التالية إلى "clangd.arguments" :
--header-insertion=never
--compile-commands-dir= ${workspaceFolder} /
--query-driver= ** (فقط قم بنسخ كل منها على أنها مكتوبة ؛ سيقوم VSCODE بتوسيع ${workspaceFolder} لكل مساحة عمل.)
clangd من أغلفة برنامج التحويل البرمجي للبزل لمعرفة رؤوس النظام التي يتم تضمينها بشكل افتراضي.WORKSPACE Bazel الخاصة بك بمثابة دليل فرعي لمشروعك ، فإن التغيير --compile-commands-dir للإشارة إلى هذا الدليل الفرعي من خلال تجاوز الأعلام في إعدادات مساحة العمل الخاصة بك. ستحتاج إلى إعادة تحديد جميع الأعلام عند تجاوزك ، لأن إعدادات مساحة العمل تحل محل جميع الأعلام في إعدادات المستخدم.تشغيل: clangd: تحقق من التحديثات
clangd من Apple مخصص لـ Xcode. على الرغم من أننا نستطيع أن نبذل جهودًا كبيرة لتوليد المشكلات في الإصدار الحالي من clangd ، إلا أننا نقوم بإزالة هذه الحلول عندما يقوم clangd بإصلاحها في اتجاه المنبع. هذا يحافظ على الكود البسيط وسرعة التطوير بسرعة! إذا لم يطالبك تشغيل التحديثات التلقائية بتنزيل خادم clangd الفعلي ، فقم بالضغط (CMD/CTRL+Shift+P)-> تنزيل Language Server.
قد تحتاج إلى إعادة تحميل VSCODE لاحقًا [(CMD/CTRL+Shift+P)-> إعادة التحميل] حتى يتم تحميل المكون الإضافي. يجب أن يطالبك تنزيل clangd بالقيام بذلك عند اكتماله.
... وترغب في تطبيق هذه الإعدادات تلقائيًا لزملائك في الفريق ، وأضف أيضًا الإعدادات إلى إعدادات مساحة عمل VSCODE ثم تحقق من .vscode/settings.json إلى التحكم في المصدر.
إذا كنت تستخدم محررًا آخر ، فستحتاج إلى اتباع نفس الخطوات الخشنة على النحو الوارد أعلاه: احصل على أحدث إصدار من Clangd إعداد لتمديد المحرر ثم توفير نفس الأعلام مثل VSCode. نحن نعلم أن الأشخاص لديهم وقت سهل في إعداد هذه الأداة مع محررين آخرين ، مثل Emacs و Vim+YouCompleteme (YCM) ، على سبيل المثال.
بمجرد أن تنجح في إعداد محرر آخر-أو إعداد clang-tidy ، أو رؤية أي شيء قد يحسن هذه القراءة-سنحبه إذا كنت ستعيد ما تعرفه! فقط قم بتحرير هذا README.md على github وقم بتقديم العلاقات العامة :)
يجب أن تكون الآن على استعداد للذهاب! طريقة لجعلها من خلال الإعداد.
يجب أن يكون هناك ملف compile_commands.json في جذر مساحة العمل الخاصة بك ، مما يتيح للمحرر الخاص بك توفير الإكمال التلقائي الرائع القائم على clang. ويجب أن تعرف ما هو هدف bazel run لتحديث هذا الإكمال التلقائي ، عندما تقوم BUILD تغييرات كبيرة بما يكفي لتتطلب تحديثًا.
وراء الكواليس ، يحتوي ملف compile_commands.json على إدخالات تصف جميع الأوامر المستخدمة لإنشاء كل ملف مصدر في مشروعك. وفي الوقت الحالي ، هناك أيضًا إدخال واحد لكل رأس ، يصف إحدى الطرق التي يتم تجميعها. (هذا يمنحك الإكمال التلقائي الرائع في ملفات الرأس أيضًا ، لذلك لا يتعين عليك التفكير في أكبر حافة تقريبية لـ clangd ). من الأهمية بمكان ، تم إلغاء كل هذه الأوامر بشكل كافٍ لأدوات Clang (أو أنت!) لفهمها.
نستخدم هذه الأداة كل يوم لتطوير مكتبة منصة لاتفاقية iOS و Android على MacOS. توقع إكمال Android في Android Source و MacOS في MacOS و iOS في iOS ، إلخ. يستخدمه الأشخاص على Linux/Ubuntu و Windows أيضًا.
يجب أن تعمل جميع ميزات clangd المعتادة. CMD/CTRL+انقر فوق التنقل (أو الخيار إذا كنت قد قمت بتغيير مفاتيح التسمية) ، إعادة تسمية ذكية ، الإكمال التلقائي ، تسليط الضوء وما clangd ذلك. كمبدأ عام: إذا كنت تختار الأدوات التي تحتاج إلى فهم لغة البرمجة ، فأنت تريد أن تستند إلى واجهة مترجم لتلك اللغة ، والتي يفعلها Clangd كجزء من مشروع LLVM/Clang.
يجب أن يعمل كل شيء أيضًا للملفات التي تم إنشاؤها ، على الرغم من أنك قد تضطر إلى تشغيل إنشاء الملف الذي تم إنشاؤه. إذا كنت تستخدم هذا مع التنفيذ عن بُعد أو ذاكرة التخزين المؤقت ، فمن المحتمل أن يتعين عليك استخدامه- --remote_download_regex لسحب الملفات والمصدر وتجنب الأخطاء في المحرر ، والآن هذا هو البناء ( --remote_download_toplevel ) هو الافتراضي للبازيل. إذا كنت تعمل من خلال هذا ، فسنحبه إذا قمت بإعادة تقديم وتقديم علاقات عامة لإضافة تعليمات جيدة لكل شخص آخر -أو على الأقل مشاركة ما تعلمته في مشكلة. ستحتاج أيضًا إلى سحب ملفات التبعية *. يسمحون لنا أن تجد الرؤوس أسرع بكثير عندما تكون متوفرة كذاكرة التخزين المؤقت. سنقدر ما إذا كنت قد تحقق أيضًا للتأكد من أنها تم سحبها حتى بدون ( --noexperimental_inmemory_dotd_files ). شكرا للمساعدة!
خلاف ذلك ، لدينا مشكلات ذاتية الحواف القاسية التي نعرفها وتتبعها. نود أن نسمع منك هناك حول ما تراه ، جيد وسيئ. يرجى إضافة أشياء إذا وجدت المزيد من الحواف الخشنة ، واسمحوا لنا أن نعرف ما إذا كنت بحاجة إلى مساعدة أو المزيد من الميزات.
من ناحية أخرى ، إذا قمت بإعداد الأمور وهم يعملون بشكل جيد ، فلا نزال نحب أن نسمع منك. يرجى تقديم "غير قضية" في علامة التبويب القضايا التي تصف نجاحك! نود أن نسمع ما تعمل عليه ، والمنصات التي تستخدمها ، وما تجده أكثر فائدة. وربما أيضًا ارم نجمًا في طريقنا حتى نعلم أنه كان مفيدًا لك.
نحن نحب أيضًا العمل معك بشأن المساهمات والتحسينات ، بالطبع! إعداد التنمية سهل ، وليس مرهقة. لدينا مستند رائع لإرشادك بسرعة إلى القدرة على إجراء التغييرات التي تحتاجها. قاعدة الشفرة نظيفة وودية للغاية. يعد الدخول إلى الكود طريقة ممتعة وفعالة للحصول على التحسينات التي تريدها.
إذا كنت تستخدم Bazel لعائلة C Language ، فمن المحتمل أن تريد أيضًا بعض أدواتنا الأخرى ، مثل ...
هل تبحث عن تفاصيل التنفيذ بدلاً من ذلك؟ تريد الغوص في قاعدة الشفرة؟ انظر ApplementationReadMe.MD.
بازل/حريق ، القراءة هذا؟ إذا كنت مهتمًا بدمج هذا في أدوات Bazel الرسمية ، فأخبرنا في مشكلة أو بريد إلكتروني ، ودعنا نتحدث! نحن نحب الحصول على استخدام Bazel ونود المساعدة.