這個項目試圖為我做什麼?
首先,為C語言家族(C ++,C,Objective-C,Objective-C ++和CUDA)提供Bazel用戶跨平台自動完成,從而使開發更加有效和有趣!
更一般而言,導出Bazel在compile_commands.json格式中構建了動作,該格式使得能夠與Bazel解耦。

▲提取compile_commands.json ,在編輯器中啟用clangd autocomplet

只有非常小的粗糙邊緣非常好。我們每天都使用它並喜歡它。
如果有一段時間沒有提交,那是由於穩定而不是忽視。這是在Hedron內的日常使用。
對於日常使用,我們建議使用此此功能而不是平台特定的IDE適配器(例如TULSI或ASWB/CLION插件的工作範圍),除非您需要一些需要某些平台特定功能(例如Apple的NextStep Interface Buolder)(例如,蘋果的NextStep Interface Buolder)在交叉分配圖編輯器中都不會支持這些功能。
有很多人使用此工具。其中包括大型公司和具有棘手堆棧的項目,例如機器人技術。
我們包括他們說的幾件事。我們希望他們也能給您足夠的信心,可以嘗試一下此工具!
“感謝您的出色工具!超級設置和使用。” - 波士頓動力學的機器人工程師
“感謝您在某個無趣的工具項目中表現出如此嚴格的表現。這絕對感覺就像是通過指揮棒/火炬的時刻。我對生活中所做的一切的最大祝福。” - 此類以前最佳工具的作者
基本設置時間:10m
Howdy,Bazel用戶?讓我們通過為C語言家族提供一些很棒的工具來讓您快速設置。
這裡有很多文字,但這僅僅是因為我們試圖闡明事情並使它們變得容易。如果您有問題,請告訴我們;我們希望您的幫助使事情變得更好,更完整 - 我們很樂意為您提供幫助!
將其複製到您的MODULE.bazel中。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).
)將其複製到Bazel WORKSPACE文件的頂部,確保根據以下說明更新到最新提交。將其放在頂部將阻止其他工具用舊版本抓住其任何依賴性;我們保證將保持依賴版本的最新狀態。
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使用。它用於官方Bazel存儲庫。]這是我們一個項目中的翻新配置示例,希望它可以節省您的時間。
如果不是現在,也許稍後再回到此步驟,或者觀看此存儲庫以獲取更新。 [或者,當您在考慮觀看時,也許給我們一個快速的明星。]像Abseil一樣,我們住在頭上;主要分支的最新提交是您想要的提交。因此,不要依靠發布通知;使用翻新或手動進行新的提交。
我們將在Bazel Workspace的根部生成compile_commands.json文件。
該文件描述了Bazel如何編譯所有(Objective-)C(++)或CUDA文件。借助公共格式的編譯命令,獨立於構建系統的工具(例如clangd Autococtlete, 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 ,您在開發時手動應用於所有構建?運行此工具時,也要提供相同的Bazel標誌很重要,因此我們可以準確地了解構建,生成文件的位置,等等。
append,例如-- --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 and 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= ** (只需按${workspaceFolder}複製每個;
clangd詢問Bazel的編譯器包裝器,以找出默認情況下包含哪些系統標頭。WORKSPACE是您項目的子目錄,則通過覆蓋工作區設置中的標誌來更改--compile-commands-dir指向該子目錄。覆蓋時,您需要重新指定所有標誌,因為工作區設置替換了用戶設置中的所有標誌。打開:clangd:檢查更新
clangd用於Xcode。儘管我們可以並且確實竭盡全力在當前版本的clangd中解決解決問題,但當clangd將它們修復到上游時,我們將刪除這些解決方法。這使代碼保持簡單,開發速度快速!如果打開自動更新不會提示您下載實際的clangd Server二進製文件,請點擊(CMD/CTRL+Shift+P) - >下載語言服務器。
您可能需要隨後重新加載VSCODE [(CMD/CTRL+SHIFT+P) - > Reload]才能加載插件。 clangd下載應提示您完成後。
...並希望這些設置自動為隊友應用,也將設置添加到VSCODE工作區設置中,然後將.vscode/settings.json檢查到源控制中。
如果您使用的是另一個編輯器,則需要遵循與上述相同的粗略步驟:獲取最新版本的Clangd設置以擴展編輯器,然後提供與VSCODE相同的標誌。我們知道人們很容易與其他編輯器(例如Emacs和vim+YouCompleteme(YCM))設置此工具。
一旦您成功設置了另一個編輯器或設置clang-tidy或以其他方式看到任何可能改善此讀數的內容,我們就會喜歡它,如果您回饋並貢獻您所知道的一切!只需在github上編輯此README.md並提交PR :)
您現在應該全力以赴!通過設置使其實現。
工作空間的根部中應該有一個compile_commands.json文件,使您的編輯器能夠提供出色的,基於clang的自動完成。而且,當您將BUILD - 文件更大的變化大大以需要刷新時,您應該知道bazel run刷新該自動完成的。
在幕後,該compile_commands.json文件包含描述所有用於構建項目中每個源文件的命令的條目。而且,目前,每個標題也有一個條目,描述了它的一種編譯方式。 (這也使您在標頭文件中也可以自動完成,因此您不必考慮clangd的最大粗糙邊緣)。至關重要的是,所有這些命令都已經充分拆除了叮噹的工具(或您!)以理解它們。
我們每天使用此工具為MACOS上的iOS和Android開發一個跨平台庫。期望Android源,MACOS中的MACOS,iOS中的MACOS,iOS等。人們也將其在Linux/Ubuntu和Windows上使用。
所有通常的clangd功能都應起作用。 cmd/ctrl+單擊導航(或選項,如果您更改了鍵鍵),智能重命名,自動完成,突出顯示等。您期望在IDE中期望的一切都應該存在(因為大多數好的IDE都由clangd支持)。一般原則:如果您選擇需要了解編程語言的工具,則希望它基於該語言的編譯器前端,而Clangd是LLVM/Clang項目的一部分。
一切也應該適用於生成的文件,儘管您可能必須運行一個構建才能存在生成的文件。如果您使用遠程執行或緩存使用此功能,則可能必須使用--remote_download_regex將標題和源文件拉下並避免在編輯器中避免錯誤,現在構建沒有字節( --remote_download_toplevel )是Bazel default。如果您努力工作,如果您還要回饋並提交PR為其他所有人添加良好的說明,或者至少要分享您在問題中學到的知識,我們會很喜歡。您還需要在非窗口上下拉 *.d依賴項文件;他們讓我們在緩存時找到標題更快。我們很感激您是否還要檢查以確保即使沒有( --noexperimental_inmemory_dotd_files )即使將其拉下來。感謝您的幫助!
否則,我們將為我們所了解和正在跟踪的粗糙邊緣提供自養問題。我們很想听聽您在那裡看到的東西,好與壞。如果您發現更多粗糙的邊緣,請添加內容,並告訴我們您是否需要幫助或更多功能。
另一方面,如果您已經設置了問題並且運行良好,我們仍然很想收到您的來信。請在描述您的成功的“問題”選項卡中提交“非問題”!我們很想听聽您在從事的工作,您正在使用的平台以及您發現最有用的東西。也許我們的方式也扔了一顆星星,所以我們知道這對您有幫助。
當然,我們還希望與您一起進行貢獻和改進!開發設置很容易,不是繁重的。我們有一個很棒的文檔,可以很快地指導您能夠進行所需的更改。代碼庫超級乾淨,友好。介入代碼是獲得所需改進的一種有趣而有效的方法。
如果您正在為C語言家族使用Bazel,則可能還需要我們的其他一些工具,例如...
尋找實施詳細信息?想潛入代碼庫嗎?請參閱ImparionationReadMe.md。
Bazel/Blaze維護者閱讀此書嗎?如果您有興趣將其集成到官方的Bazel工具中,請在問題或電子郵件中告訴我們,讓我們談談!我們喜歡使用Bazel,很樂意提供幫助。