โครงการนี้พยายามทำอะไรให้ฉัน?
ขั้นแรกให้ผู้ใช้ Bazel ข้ามแพลตฟอร์ม Autocomplete สำหรับตระกูลภาษา C (C ++, C, Objective-C, Objective-C ++ และ CUDA) และทำให้การพัฒนามีประสิทธิภาพและสนุกสนานมากขึ้น!
โดยทั่วไปแล้วการส่งออก Bazel สร้างการกระทำในรูปแบบ compile_commands.json ที่ช่วยให้เครื่องมือที่ยอดเยี่ยมแยกออกจาก Bazel

▲แยก compile_commands.json , เปิดใช้งาน clangd Autocomplete ในตัวแก้ไขของคุณ▼

ค่อนข้างดีมีเพียงขอบหยาบเล็กน้อยเท่านั้น เราใช้สิ่งนี้ทุกวันและรักมัน
หากยังไม่ได้กระทำในขณะที่เป็นเพราะความมั่นคงไม่ใช่การละเลย นี่คือการใช้งานประจำวันภายใน Hedron
สำหรับการใช้งานในชีวิตประจำวันเราขอแนะนำให้ใช้สิ่งนี้มากกว่าอะแดปเตอร์ IDE เฉพาะแพลตฟอร์ม (เช่น Tulsi หรือปลั๊กอิน ASWB/Clion ในขอบเขตที่ใช้งานได้) ยกเว้นเวลาที่คุณต้องการคุณสมบัติเฉพาะของแพลตฟอร์ม (EG Apple NextStep Builder) ที่ไม่เคยได้รับการสนับสนุน
มีผู้คนมากมายที่ใช้เครื่องมือนี้ ซึ่งรวมถึง บริษัท ขนาดใหญ่และโครงการที่มีสแต็คที่ยุ่งยากเช่นในหุ่นยนต์
เรารวมถึงสองสิ่งที่พวกเขาพูด เราหวังว่าพวกเขาจะให้ความมั่นใจกับคุณมากพอที่จะลองเครื่องมือนี้ด้วย!
"ขอบคุณสำหรับเครื่องมือที่ยอดเยี่ยม! ง่ายต่อการติดตั้งและใช้งาน" - วิศวกรหุ่นยนต์ที่ Boston Dynamics
"ขอบคุณที่แสดงให้เห็นถึงความเข้มงวดในสิ่งที่จะเป็นเพียงแค่โครงการเครื่องมือที่ไม่น่าสนใจบางอย่างนี้รู้สึกเหมือนเป็นช่วงเวลาที่ผ่านมาของแบตัน/คบเพลิงความปรารถนาดีที่สุดของฉันสำหรับทุกสิ่งที่คุณทำในชีวิต" - ผู้แต่งเครื่องมือที่ดีที่สุดก่อนหน้านี้ของประเภทนี้
เวลาตั้งค่าพื้นฐาน: 10m
ผู้ใช้ Bazel Howdy?. มาตั้งค่าให้คุณอย่างรวดเร็วด้วยเครื่องมือที่ยอดเยี่ยมสำหรับตระกูลภาษา 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 ให้คุณเพื่อตรวจสอบหรือทดสอบอัตโนมัติ ฟรีและง่ายต่อการติดตั้ง มันมีประโยชน์อย่างน่าประหลาดใจใน codebase ของเราและเราได้ทำงานร่วมกับผู้ดูแลที่ยอดเยี่ยมเพื่อทำให้สิ่งต่าง ๆ ดีสำหรับการใช้งาน Bazel และใช้ในที่เก็บ Bazel อย่างเป็นทางการ] นี่คือตัวอย่างการกำหนดค่าการปรับปรุงใหม่จากหนึ่งในโครงการของเราด้วยความหวังว่ามันอาจช่วยคุณประหยัดเวลา
ถ้าไม่ใช่ตอนนี้อาจจะกลับมาที่ขั้นตอนนี้ในภายหลังหรือดู repo นี้สำหรับการอัปเดต [หรือเฮ้อาจจะให้ดาราอย่างรวดเร็วแก่เราในขณะที่คุณกำลังคิดจะดู] เหมือน Abseil เราอยู่ที่หัว ความมุ่งมั่นล่าสุดกับสาขาหลักคือการกระทำที่คุณต้องการ ดังนั้นอย่าพึ่งพาการแจ้งเตือน ใช้การปรับปรุงหรือโพลด้วยตนเองสำหรับคณะกรรมการใหม่
เราจะสร้างไฟล์ compile_commands.json ในรูทของ Bazel Workspace
ไฟล์นั้นอธิบายถึงวิธีการรวบรวมไฟล์ (วัตถุประสงค์-) C (++) หรือไฟล์ CUDA ทั้งหมด ด้วยคำสั่งคอมไพล์ในรูปแบบทั่วไปเครื่องมือสร้างระบบที่ไม่ขึ้นกับระบบ (เช่น clangd Autocomplete, clang-tidy เป็นต้น) สามารถทำงานได้
เราจะทำให้มันทำงานแล้วย้ายไปยังส่วนถัดไปในขณะที่มันออกไป แต่ในอนาคตทุกครั้งที่คุณต้องการเครื่องมือ (เช่น Autocomplete) เพื่อดูการเปลี่ยนแปลง BUILD ใหม่ให้เรียกใช้คำสั่งที่คุณเลือกด้านล่าง! Clangd จะรับการเปลี่ยนแปลงโดยอัตโนมัติ
ในกรณีนี้เพียงแค่ bazel run @hedron_compile_commands//:refresh_all
หมายเหตุ: คุณต้องใช้ bazel run เครื่องมือนี้ไม่ใช่แค่ bazel build มันขึ้นมา
--config=my_important_flags_or_toolchains --compilation_mode=dbg ที่คุณใช้ด้วยตนเองใช้กับงานสร้างทั้งหมดของคุณในขณะที่กำลังพัฒนา?เป็นเรื่องสำคัญที่คุณจะต้องจัดหาธง Bazel เดียวกันเหล่านั้นเมื่อใช้เครื่องมือนี้เช่นกันดังนั้นเราจึงสามารถเข้าใจการสร้างได้อย่างแม่นยำซึ่งไฟล์กำลังถูกสร้างขึ้น ฯลฯ
ผนวกเช่น -- --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 สอบปากคำ wrappers คอมไพเลอร์ของ Bazel เพื่อหาว่าส่วนหัวของระบบใดที่รวมอยู่ในค่าเริ่มต้นWORKSPACE Bazel ของคุณเป็นไดเรกทอรีย่อยของโครงการของคุณให้เปลี่ยน --compile-commands-dir เพื่อชี้ไปที่ไดเรกทอรีย่อยนั้นโดยการเอาชนะธงในการตั้งค่า พื้นที่ทำงาน ของคุณ คุณจะต้องระบุสถานะทั้งหมดอีกครั้งเมื่อคุณแทนที่เนื่องจากการตั้งค่าพื้นที่ทำงานแทนที่การตั้งค่าสถานะทั้งหมดในการตั้งค่าผู้ใช้เปิด: Clangd: ตรวจสอบการอัปเดต
clangd ของ Apple ที่มีไว้สำหรับ XCode ในขณะที่เราสามารถและใช้ความพยายามอย่างมากในการแก้ไขปัญหาใน clangd เวอร์ชันปัจจุบันเราลบวิธีแก้ปัญหาเหล่านั้นเมื่อ clangd แก้ไขพวกเขาต้นน้ำ สิ่งนี้ช่วยให้รหัสง่ายและความเร็วในการพัฒนาอย่างรวดเร็ว! หากเปิดการอัปเดตอัตโนมัติไม่ได้แจ้งให้คุณดาวน์โหลดไบนารีเซิร์ฟเวอร์ clangd จริงกด (CMD/Ctrl+Shift+P)-> ดาวน์โหลดภาษาเซิร์ฟเวอร์ภาษา
คุณอาจต้องโหลด VSCODE ใหม่ [(CMD/CTRL+Shift+P)-> โหลดซ้ำ] เพื่อให้ปลั๊กอินโหลด การดาวน์โหลด clangd ควรแจ้งให้คุณทำเมื่อเสร็จสิ้น
... และต้องการให้การตั้งค่าเหล่านี้ถูกนำไปใช้โดยอัตโนมัติสำหรับเพื่อนร่วมทีมของคุณนอกจากนี้ยังเพิ่มการตั้งค่าในการตั้งค่า VSCODE Workspace จากนั้นตรวจสอบ .vscode/settings.json ลงในการควบคุมแหล่งที่มา
หากคุณใช้โปรแกรมแก้ไขอื่นคุณจะต้องทำตามขั้นตอนคร่าวๆเช่นเดียวกับด้านบน: รับ CLANGD เวอร์ชันล่าสุดเพื่อขยายตัวแก้ไขแล้วจัดหาธงเดียวกับ VSCODE เรารู้ว่าผู้คนมีเวลาที่ง่ายต่อการตั้งค่าเครื่องมือนี้กับบรรณาธิการอื่น ๆ เช่น Emacs และ Vim+YoucompleTeMe (YCM) เช่น
เมื่อคุณประสบความสำเร็จในการตั้งค่าบรรณาธิการอื่น-หรือตั้งค่า clang-tidy หรือไม่หรือเห็นสิ่งใดก็ตามที่อาจปรับปรุง readme นี้-เราจะรักมันถ้าคุณให้คืนและสนับสนุนสิ่งที่คุณรู้! เพียงแค่แก้ไข README.md นี้บน gitHub และไฟล์ pr :)
ตอนนี้คุณควรพร้อมแล้ว! วิธีที่จะทำให้ผ่านการตั้งค่า
ควรมีไฟล์ compile_commands.json ในรูทของพื้นที่ทำงานของคุณทำให้ตัวแก้ไขของคุณสามารถให้การเติมข้อความอัตโนมัติที่ยอดเยี่ยม และคุณควรรู้ว่าเป้าหมายใดที่ bazel run เพื่อรีเฟรชนั้นการเติมข้อความอัตโนมัติเมื่อคุณทำการเปลี่ยนแปลงที่มีไฟล์ BUILD ขึ้นขนาดใหญ่พอที่จะต้องรีเฟรช
เบื้องหลังไฟล์ compile_commands.json นั้นมีรายการที่อธิบายคำสั่งทั้งหมดที่ใช้ในการสร้างไฟล์ต้นฉบับทุกไฟล์ในโครงการของคุณ และสำหรับตอนนี้ยังมีหนึ่งรายการต่อส่วนหัวโดยอธิบายวิธีเดียวที่รวบรวมไว้ (สิ่งนี้ทำให้คุณได้เติมข้อความอัตโนมัติที่ยอดเยี่ยมในไฟล์ส่วนหัวเช่นกันดังนั้นคุณไม่ต้องคิดถึงขอบหยาบที่ใหญ่ที่สุดของ clangd ) ที่สำคัญคำสั่งเหล่านี้ทั้งหมดได้รับการยกเลิกความคิดสำหรับเครื่องมือ Clang (หรือคุณ!) เพื่อทำความเข้าใจพวกเขา
เราใช้เครื่องมือนี้ทุกวันเพื่อพัฒนาไลบรารีข้ามแพลตฟอร์มสำหรับ iOS และ Android บน MacOS คาดว่า Android จะเสร็จสิ้นในแหล่ง Android, macOS ใน macOS, iOS ใน iOS ฯลฯ ผู้คนใช้มันบน Linux/Ubuntu และ Windows ด้วย
คุณสมบัติ CLANGD ปกติทั้งหมดควรใช้งานได้ CMD/CTRL+คลิกการนำทาง (หรือตัวเลือกหากคุณเปลี่ยน KeyBindings), การเปลี่ยนชื่ออัจฉริยะ, การเติมข้อความอัตโนมัติ, การเน้น ฯลฯ ทุกสิ่งที่คุณคาดหวังใน IDE ควรอยู่ที่นั่น (เพราะ IDE ที่ดีที่สุดได้รับการสนับสนุนโดย clangd ) ตามหลักการทั่วไป: หากคุณกำลังเลือกเครื่องมือที่ต้องเข้าใจภาษาการเขียนโปรแกรมคุณต้องการให้เป็นไปตามส่วนหน้าคอมไพเลอร์สำหรับภาษานั้นซึ่ง Clangd ทำเป็นส่วนหนึ่งของโครงการ LLVM/Clang
ทุกอย่างควรใช้งานได้กับไฟล์ที่สร้างขึ้นแม้ว่าคุณอาจต้องเรียกใช้บิลด์สำหรับไฟล์ที่สร้างขึ้น หากคุณใช้สิ่งนี้กับการดำเนินการระยะไกลหรือแคชคุณอาจต้องใช้ --remote_download_regex เพื่อดึงส่วนหัวและไฟล์ต้นฉบับและเพื่อหลีกเลี่ยงข้อผิดพลาดในบรรณาธิการตอนนี้ที่สร้างโดยไม่มีไบต์ ( --remote_download_toplevel ) หากคุณทำงานผ่านสิ่งนี้เราจะชอบถ้าคุณให้คืนและยื่นคำแนะนำที่ดีสำหรับคนอื่น -หรืออย่างน้อยก็แบ่งปันสิ่งที่คุณได้เรียนรู้ในปัญหา นอกจากนี้คุณยังต้องการดึงไฟล์การพึ่งพา *.D ลงบนไม่มีหน้าต่าง พวกเขาให้เราค้นหาส่วนหัวได้เร็วขึ้นมากเมื่อมีแคช เราขอขอบคุณหากคุณต้องตรวจสอบเพื่อให้แน่ใจว่าพวกเขาถูกดึงลงมาแม้จะไม่มี ( --noexperimental_inmemory_dotd_files ) ขอบคุณที่ช่วย!
มิฉะนั้นเรามีปัญหาที่ยื่นด้วยตนเองสำหรับขอบขรุขระที่เรารู้และกำลังติดตาม เราชอบที่จะได้ยินจากคุณเกี่ยวกับสิ่งที่คุณเห็นดีและไม่ดี โปรดเพิ่มสิ่งต่าง ๆ หากคุณพบขอบที่ขรุขระมากขึ้นและแจ้งให้เราทราบหากคุณต้องการความช่วยเหลือหรือคุณสมบัติมากกว่า
ในทางกลับกันถ้าคุณตั้งค่าสิ่งต่าง ๆ และพวกเขาทำงานได้ดีเราก็ยังรักที่จะได้ยินจากคุณ โปรดยื่น "ไม่ใช่ปัญหา" ในแท็บปัญหาที่อธิบายถึงความสำเร็จของคุณ! เราชอบที่จะได้ยินสิ่งที่คุณกำลังทำอยู่แพลตฟอร์มที่คุณใช้และสิ่งที่คุณพบว่ามีประโยชน์มากที่สุด และอาจจะโยนดาวในแบบของเราเพื่อให้เรารู้ว่ามันเป็นประโยชน์กับคุณ
นอกจากนี้เรายังชอบที่จะทำงานร่วมกับคุณเกี่ยวกับการมีส่วนร่วมและการปรับปรุงแน่นอน! การตั้งค่าการพัฒนาเป็นเรื่องง่ายไม่ใช่หนัก เรามีเอกสารที่ยอดเยี่ยมที่จะแนะนำคุณอย่างรวดเร็วถึงความสามารถในการเปลี่ยนแปลงที่คุณต้องการ Codebase สะอาดและเป็นมิตรมาก การก้าวเข้าสู่รหัสเป็นวิธีที่สนุกและมีประสิทธิภาพในการปรับปรุงที่คุณต้องการ
หากคุณใช้ Bazel สำหรับครอบครัวภาษา C คุณอาจต้องการเครื่องมืออื่น ๆ ของเราเช่น ...
กำลังมองหารายละเอียดการใช้งานแทน? ต้องการดำน้ำใน codebase หรือไม่? ดู ApplectationReadMe.md
Bazel/Blaze ผู้ดูแลการอ่านสิ่งนี้? หากคุณสนใจที่จะรวมสิ่งนี้เข้ากับเครื่องมือ Bazel อย่างเป็นทางการแจ้งให้เราทราบในปัญหาหรืออีเมลและมาคุยกัน! เราชอบที่จะใช้ Bazel และชอบที่จะช่วยเหลือ