Proyek apa yang coba dilakukan untuk saya?
Pertama, berikan kepada pengguna bazel cross-platform autocomplete untuk keluarga bahasa C (C ++, C, Objective-C, Objective-C ++, dan CUDA), dan dengan demikian membuat pengembangan lebih efisien dan menyenangkan!
Secara lebih umum, ekspor bazel membangun tindakan ke dalam format compile_commands.json yang memungkinkan alat yang hebat dipisahkan dari bazel.

▲ Ekstrak compile_commands.json , Mengaktifkan clangd Autocomplete di Editor Anda ▼

Cukup bagus dengan hanya tepi kasar yang sangat kecil. Kami menggunakan ini setiap hari dan menyukainya.
Jika belum ada komitmen dalam beberapa saat, itu karena stabilitas, bukan pengabaian. Ini digunakan setiap hari di dalam hedron.
Untuk penggunaan sehari-hari, kami akan merekomendasikan menggunakan ini daripada adaptor IDE khusus platform (seperti Tulsi atau plugin ASWB/Clion sejauh berfungsi), kecuali saat Anda memerlukan beberapa fitur khusus platform-editor (mis. Builder antarmuka NextSpep Apple) yang tidak pernah didukung dalam editor lintas splatform.
Ada banyak orang yang menggunakan alat ini. Itu termasuk perusahaan besar dan proyek dengan tumpukan rumit, seperti dalam robotika.
Kami termasuk beberapa hal yang telah mereka katakan. Kami berharap mereka akan memberi Anda kepercayaan diri yang cukup untuk mencoba alat ini juga!
"Terima kasih atas alat yang luar biasa! Super mudah diatur dan digunakan." - Seorang insinyur robotika di Boston Dynamics
"Terima kasih telah menunjukkan banyak kekakuan dalam apa yang seharusnya menjadi proyek perkakas yang tidak menarik. Ini pasti terasa seperti momen tongkat/obor yang lewat. Harapan terbaik saya untuk semua yang Anda lakukan dalam hidup." - Penulis alat terbaik sebelumnya dari jenis ini
Waktu Pengaturan Dasar: 10m
Howdy, pengguna Bazel ?. Mari kita buat Anda mengatur dengan cepat dengan beberapa alat yang luar biasa untuk keluarga bahasa C.
Ada banyak teks di sini tetapi hanya karena kami mencoba untuk menjelaskan dan membuatnya mudah. Jika Anda memiliki masalah, beri tahu kami; Kami akan menyukai bantuan Anda membuat segalanya menjadi lebih baik dan lebih lengkap - dan kami ingin membantu Anda!
Salin ini ke MODULE.bazel Anda, pastikan untuk memperbarui ke komit terbaru sesuai instruksi di bawah ini.
# 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).
) Salin ini ke bagian atas file WORKSPACE Bazel Anda, pastikan untuk memperbarui ke komit terbaru sesuai instruksi di bawah ini. Menempatkannya di bagian atas akan mencegah alat lain dari membengkokkan ketergantungannya dengan versi lama; Kami berjanji untuk menjaga versi ketergantungan kami terkini.
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 ()Perbaikan sering datang, jadi kami akan merekomendasikan untuk tetap terkini.
Kami sangat menyarankan Anda mengatur renovasi (atau serupa) di beberapa titik untuk menjaga ketergantungan ini (dan lainnya) tetap mutakhir secara default. [Kami tidak berafiliasi dengan renovasi atau apa pun, tapi kami pikir itu luar biasa. Ini mengawasi versi baru dan mengirimi Anda PR untuk ditinjau atau pengujian otomatis. Gratis dan mudah diatur. Sangat berguna dalam basis kode kami, dan kami telah bekerja dengan pengelola yang luar biasa untuk membuat segalanya bagus untuk penggunaan bazel. Dan ini digunakan dalam repositori Bazel resmi.] Ini adalah contoh konfigurasi renovasi dari salah satu proyek kami, dengan harapan itu mungkin menghemat waktu Anda.
Jika tidak sekarang, mungkin kembali ke langkah ini nanti, atau tonton repo ini untuk pembaruan. [Atau hei, mungkin beri kami bintang cepat, saat Anda berpikir untuk menonton.] Seperti Abseil, kami hidup di kepala; Komitmen terbaru ke cabang utama adalah komitmen yang Anda inginkan. Jadi jangan mengandalkan pemberitahuan rilis; Gunakan renovasi atau jajak pendapat secara manual untuk komit baru.
Kami akan menghasilkan file compile_commands.json di root ruang kerja Bazel.
File itu menjelaskan bagaimana Bazel mengkompilasi semua file (objektif-) C (++) atau CUDA. Dengan perintah kompilasi dalam format umum, alat buatan-sistem-independen (misalnya clangd autocomplete, clang-tidy linting dll.), Dapat mulai bekerja.
Kami akan menjalankannya dan kemudian pindah ke bagian berikutnya saat itu. Tetapi di masa depan, setiap kali Anda ingin perkakas (seperti AutoComplete) untuk melihat perubahan BUILD -file baru, jalankan kembali perintah yang Anda pilih di bawah ini! Clangd akan secara otomatis mengambil perubahan.
Dalam hal ini, cukup bazel run @hedron_compile_commands//:refresh_all
Catatan: Anda harus bazel run , bukan hanya bazel build It.
--config=my_important_flags_or_toolchains --compilation_mode=dbg , yang Anda terapkan secara manual berlaku untuk semua bangunan Anda saat berkembang?Sangat penting bagi Anda untuk menyediakan bendera bazel yang sama saat menjalankan alat ini juga, sehingga kami dapat secara akurat memahami build, di mana file sedang dihasilkan, dll.
Tambahkan, misalnya -- --config=my_important_flags_or_toolchains --compilation_mode=dbg ke atas, atau bendera apa pun yang biasanya Anda bangun saat berkembang.
Catatan: Ekstra -- bukan kesalahan ketik, dan berfungsi untuk meneruskan bendera ke alat ini ketika berjalan daripada saat dibangun. Perintah Anda akan terlihat seperti:
bazel run @hedron_compile_commands//:refresh_all -- --config=my_important_flags_or_toolchains --compilation_mode=dbg
Dalam hal ini, Anda dapat dengan mudah menentukan tingkat atas, target output yang sedang Anda kerjakan dan bendera yang diperlukan untuk membangunnya.
Buka file BUILD - kami akan merekomendasikan menggunakan (atau membuat) //BUILD - dan tambahkan sesuatu seperti:
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.
) (Untuk detail lebih lanjut tentang refresh_compile_commands , lihat dokumen di bagian atas refresh_compile_commands.bzl ).
Akhirnya, Anda harus bazel run :refresh_compile_commands
ccls atau alat lain yang, tidak seperti clangd , tidak menginginkan atau membutuhkan header di compile_commands.json ? Mirip dengan hal di atas, kami akan menggunakan refresh_compile_commands untuk konfigurasi, tetapi alih -alih menetapkan targets , atur exclude_headers = "all" .
compile_commands.json membutuhkan waktu untuk menghasilkan: Menambahkan exclude_external_sources = True dan exclude_headers = "external" dapat membantu, dengan beberapa pengorbanan.
Untuk saat ini, kami akan menyarankan untuk melanjutkan untuk mengatur clangd (di bawah). Setelah itu, jika proyek Anda terbukti cukup besar sehingga memperluas kapasitas clangd dan/atau alat ini untuk mengindeks dengan cepat, lihat dokumen di bagian atas refresh_compile_commands.bzl untuk instruksi tentang cara menyetel bendera dan lainnya.
compile_commands.json Mari kita dapatkan ekstensi clangd dan dikonfigurasi.
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.cpptoolsKemudian, buka pengaturan pengguna vScode, sehingga hal -hal akan secara otomatis diatur untuk semua proyek yang Anda buka.
Cari "Clangd".
Tambahkan tiga entri terpisah berikut ke "clangd.arguments" :
--header-insertion=never
--compile-commands-dir= ${workspaceFolder} /
--query-driver= ** (Cukup salin masing -masing seperti yang ditulis; vScode akan memperluas ${workspaceFolder} dengan benar untuk setiap ruang kerja.)
clangd untuk menginterogasi pembungkus kompiler Bazel untuk mengetahui header sistem mana yang disertakan secara default.WORKSPACE Bazel Anda adalah subdirektori dari proyek Anda, ubah --compile-commands-dir untuk menunjuk ke subdirektori itu dengan mengesampingkan bendera di pengaturan ruang kerja Anda. Anda harus menentukan ulang semua bendera saat mengganti, karena pengaturan ruang kerja mengganti semua bendera di pengaturan pengguna.Nyalakan: Clangd: Periksa pembaruan
clangd Apple yang ditujukan untuk XCODE. Meskipun kami dapat dan melakukan upaya besar untuk mengatasi masalah dalam versi clangd saat ini, kami menghapus solusi tersebut ketika clangd memperbaikinya di hulu. Ini membuat kode tetap sederhana dan kecepatan pengembangan cepat! Jika mengaktifkan pembaruan otomatis tidak meminta Anda untuk mengunduh biner server clangd yang sebenarnya, tekan (cmd/ctrl+shift+p)-> unduh server bahasa.
Anda mungkin perlu memuat ulang vScode [(CMD/CTRL+SHIFT+P)-> Reload] untuk dimuat plugin. Unduhan clangd harus meminta Anda untuk melakukannya saat selesai.
... dan ingin pengaturan ini diterapkan secara otomatis untuk rekan satu tim Anda, juga tambahkan pengaturan ke pengaturan ruang kerja VScode dan kemudian periksa .vscode/settings.json ke kontrol sumber.
Jika Anda menggunakan editor lain, Anda harus mengikuti langkah -langkah kasar yang sama seperti di atas: Dapatkan versi terbaru dari CLANGD yang diatur untuk memperpanjang editor dan kemudian menyediakan bendera yang sama dengan vScode. Kami tahu orang -orang memiliki waktu yang mudah menyiapkan alat ini dengan editor lain, seperti Emacs dan Vim+YouCompleteme (YCM), misalnya.
Setelah Anda berhasil menyiapkan editor lain-atau mengatur clang-tidy , atau melihat apa pun yang mungkin meningkatkan readme ini-kami akan menyukainya jika Anda akan memberikan kembali dan berkontribusi apa yang Anda ketahui! Cukup edit ini README.md di github dan ajukan PR :)
Anda sekarang harus siap! Cara untuk membuatnya melalui pengaturan.
Seharusnya ada file compile_commands.json di akar ruang kerja Anda, memungkinkan editor Anda untuk memberikan autocomplete yang hebat dan berbasis dentang. Dan Anda harus tahu target apa yang akan bazel run untuk menyegarkan secara otomatis, ketika Anda membuat BUILD -file berubah cukup besar untuk membutuhkan penyegaran.
Di belakang layar, file compile_commands.json berisi entri yang menggambarkan semua perintah yang digunakan untuk membangun setiap file sumber dalam proyek Anda. Dan, untuk saat ini, ada juga satu entri per header, menggambarkan satu cara disusun. (Ini juga membuat Anda sangat lengkap dalam file header, jadi Anda tidak perlu memikirkan tepi kasar terbesar clangd ). Yang terpenting, semua perintah ini telah cukup deashel untuk perkakas dentang (atau Anda!) Untuk memahaminya.
Kami menggunakan alat ini setiap hari untuk mengembangkan perpustakaan lintas platform untuk iOS dan Android di macOS. Harapkan penyelesaian android di sumber Android, macOS di macOS, iOS di iOS, dll. Orang menggunakannya di Linux/Ubuntu dan Windows juga.
Semua fitur Clangd biasa harus berfungsi. CMD/CTRL+Klik Navigasi (atau opsi jika Anda telah mengubah inti key), Smart Rename, AutoComplete, Sorot dll. Semua yang Anda harapkan dalam IDE harus ada di sana (karena sebagian besar IDE yang baik didukung oleh clangd ). Sebagai prinsip umum: Jika Anda memilih alat yang perlu memahami bahasa pemrograman, Anda ingin didasarkan pada frontend kompiler untuk bahasa itu, yang dilakukan Clangd sebagai bagian dari proyek LLVM/Clang.
Semuanya juga harus berfungsi untuk file yang dihasilkan, meskipun Anda mungkin harus menjalankan build agar file yang dihasilkan ada. Jika Anda menggunakan ini dengan eksekusi jarak jauh atau cache, kemungkinan besar Anda harus menggunakan --remote_download_regex untuk menarik header dan sumber file dan untuk menghindari kesalahan dalam editor, sekarang membangun tanpa byte ( --remote_download_toplevel ) adalah bazel default. Jika Anda mengerjakan ini, kami akan menyukainya jika Anda akan memberikan kembali dan mengajukan PR menambahkan instruksi yang baik untuk orang lain -atau setidaknya bagikan apa yang telah Anda pelajari dalam suatu masalah. Anda juga ingin menarik file ketergantungan *.d pada non-windows; Mereka membiarkan kami menemukan header lebih cepat ketika tersedia sebagai cache. Kami akan menghargai jika Anda juga akan memeriksa untuk memastikan bahwa mereka ditarik ke bawah bahkan tanpa ( --noexperimental_inmemory_dotd_files ). Terima kasih telah membantu!
Kalau tidak, kami telah melakukan masalah sendirian untuk tepi kasar yang kami ketahui dan sedang melacak. Kami ingin mendengar dari Anda di sana tentang apa yang Anda lihat, baik dan buruk. Silakan tambahkan hal -hal jika Anda menemukan lebih banyak tepi kasar, dan beri tahu kami jika Anda memerlukan bantuan atau lebih banyak fitur.
Di sisi lain, jika Anda mengatur semuanya dan mereka bekerja dengan baik, kami masih ingin mendengar dari Anda. Harap ajukan "non-masalah" di tab Masalah yang menggambarkan kesuksesan Anda! Kami ingin mendengar apa yang sedang Anda kerjakan, platform apa yang Anda gunakan, dan apa yang menurut Anda paling berguna. Dan mungkin juga melemparkan bintang kami sehingga kami tahu itu membantu Anda.
Kami juga ingin bekerja sama dengan Anda tentang kontribusi dan perbaikan, tentu saja! Pengaturan pengembangan mudah, tidak berat; Kami memiliki dokter yang hebat untuk membimbing Anda dengan cepat agar dapat membuat perubahan yang Anda butuhkan. Basis kode ini sangat bersih dan ramah. Melangkah ke dalam kode adalah cara yang menyenangkan dan efisien untuk mendapatkan peningkatan yang Anda inginkan.
Jika Anda menggunakan bazel untuk keluarga bahasa C, Anda mungkin juga ingin beberapa alat kami yang lain, seperti ...
Mencari detail implementasi sebagai gantinya? Ingin menyelami basis kode? Lihat ImplementasiReadme.md.
Bazel/Blaze Loading membaca ini? Jika Anda tertarik untuk mengintegrasikan ini ke dalam alat Bazel resmi, beri tahu kami dalam masalah atau email, dan mari kita bicara! Kami senang menggunakan Bazel dan ingin membantu.