이 프로젝트는 나를 위해 무엇을하려고합니까?
먼저 Bazel 사용자가 C 언어 패밀리 (C ++, C, Objective-C, Objective-C ++ 및 Cuda)에게 교차 플랫폼 자동 완성을 제공하여 개발을보다 효율적이고 재미있게 제공하십시오!
보다 일반적으로, 내보내기 바젤은 행동을 compile_commands.json 형식으로 빌드하여 바젤에서 큰 툴링을 분리 할 수 있습니다.

▲ compile_commands.json , 편집자에서 clangd autocomplete 활성화 ▼를 추출합니다.

아주 작은 거친 가장자리만으로 꽤 좋습니다. 우리는 매일 이것을 사용하고 그것을 좋아합니다.
한동안 커밋이 없다면, 그것은 안정성 때문에 무시가 아니라 때문입니다. 이것은 Hedron 내에서 매일 사용됩니다.
일상적인 사용을 위해, 우리는 플랫폼-특유의 편집기 (예 : Apple의 NextStep 인터페이스 빌더)가 필요할 때를 제외하고는 플랫폼 별 IDE 어댑터 (Tulsi 또는 ASWB/Clion 플러그인과 같은)보다는 이것을 사용하는 것이 좋습니다.
이 도구를 사용하는 많은 사람들이 있습니다. 여기에는 대기업과 로봇 공학과 같은 까다로운 스택이있는 프로젝트가 포함됩니다.
우리는 그들이 말한 몇 가지를 포함하고 있습니다. 우리는 그들이이 도구를 시도 할 수있는 충분한 자신감을주기를 바랍니다.
"멋진 도구에 감사드립니다! 설정하고 사용하기 쉽습니다." - Boston Dynamics의 로봇 공학 엔지니어
"이기지 않은 툴링 프로젝트가 무엇인지에 대해 엄격한 것을 보여 주셔서 감사합니다. 이것은 분명히 배턴/횃불 순간을 지나가는 것처럼 느껴집니다. 인생에서하는 모든 일에 대한 나의 최선의 소원." -이 유형의 이전 최고의 도구의 저자
기본 설정 시간 : 10m
어떻게, 바젤 사용자?. C Language 제품군을위한 멋진 툴링으로 빠르게 설정하겠습니다.
여기에는 많은 텍스트가 있지만 우리는 철자를 철자하고 쉽게 만들려고 노력하고 있기 때문입니다. 문제가 있으면 알려주십시오. 우리는 당신의 도움을 더 좋고 더 완전하게 만드는 데 도움을주고 싶습니다. 그리고 우리는 당신을 돕고 싶습니다!
아래 지침에 따라 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).
) 이것을 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 ()개선은 자주 이루어 지므로 최신 상태를 유지하는 것이 좋습니다.
기본적으로 이러한 종속성 (및 기타)을 최신 상태로 유지하기 위해 어느 시점에서 리노베이트 (또는 이와 유사한)를 설정하는 것이 좋습니다. [우리는 Renovate 나 다른 것과 관련이 없지만 굉장하다고 생각합니다. 새로운 버전을보고 검토 또는 자동 테스트를 위해 PRS를 보냅니다. 무료이며 설정하기 쉽습니다. 코드베이스에서 놀랍도록 유용했으며, 우리는 훌륭한 관리자와 협력하여 바젤 사용에 큰 도움이되었습니다. 그리고 그것은 공식 바젤 저장소에 사용됩니다.] 여기 우리 프로젝트 중 하나의 혁신 구성 예가 있습니다. 시간을 절약 할 수 있기를 바랍니다.
지금은 그렇지 않다면이 단계로 돌아와서이 레포지어를보고 업데이트를보십시오. [또는 이봐, 아마도 우리에게 빠른 스타를주십시오. 메인 지점에 대한 최신 커밋은 원하는 커밋입니다. 따라서 릴리스 알림에 의존하지 마십시오. 새로운 커밋을 위해 수동으로 리노베이트 또는 설문 조사를 사용하십시오.
Bazel Workspace의 루트에 compile_commands.json 파일을 생성합니다.
이 파일은 Bazel이 어떻게 모든 (목표-) C (++) 또는 CUDA 파일을 컴파일하는 방법을 설명합니다. 컴파일 명령을 공통 형식으로 사용하면 빌드-시스템 독립적 툴링 (예 : clangd AutoComplete, clang-tidy Linting 등)이 작동 할 수 있습니다.
우리는 그것을 실행하고 다음 섹션으로 이동하는 동안 우리는 그것이 멀리 떨어져 있습니다. 그러나 미래에, 툴링 (autocomplete와 같은)이 새로운 BUILD -파일 변경을 볼 때마다 아래에서 선택한 명령을 다시 실행하십시오! Clangd는 자동으로 변경 사항을 선택합니다.
이 경우 bazel run @hedron_compile_commands//:refresh_all
참고 : bazel build 뿐만 아니라이 도구를 bazel run 해야합니다.
--config=my_important_flags_or_toolchains --compilation_mode=dbg 가 있습니까?이 도구를 실행할 때도 동일한 바젤 플래그를 공급하는 것이 매우 중요하므로 파일이 생성되는 빌드를 정확하게 이해할 수 있습니다.
Append, eg -- --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 실행해야합니다
clangd 와 달리 ccls 또는 다른 도구를 사용하여 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 기반으로 autocomplete 용 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 Bazel의 컴파일러 포장지를 조사하여 기본적으로 어떤 시스템 헤더가 포함되어 있는지 알아냅니다.WORKSPACE 프로젝트의 하위 디렉토리 인 경우 작업 영역 설정에서 --compile-commands-dir 를 재정의하여 해당 하위 디렉토리를 가리 키도록 변경합니다. 작업 영역 설정이 사용자 설정의 모든 플래그를 교체하기 때문에 재정의 할 때 모든 플래그를 다시 지정해야합니다.켜기 : Clangd : 업데이트를 확인하십시오
clangd 사용하지 않는다고 가정합니다. 우리는 현재 버전의 clangd 에서 해결 문제를 해결하기 위해 많은 노력을 기울일 수 있지만 clangd 상류로 수정하면 해당 해결 방법을 제거 할 수 있습니다. 이것은 코드를 단순하고 개발 속도를 빠르게 유지합니다! 자동 업데이트를 켜면 실제 clangd 서버 바이너리를 다운로드하라는 메시지가 표시되지 않습니다.
플러그인을로드하려면 vscode [(cmd/ctrl+shift+p)-> Reload]를 다시로드해야 할 수도 있습니다. clangd 다운로드는 완료되면 그렇게하라는 메시지가 표시됩니다.
... 그리고이 설정을 팀원에게 자동으로 적용하고 VSCODE WorksPace 설정에 설정을 추가 한 다음 .vscode/settings.json 소스 컨트롤로 확인하십시오.
다른 편집기를 사용하는 경우 위와 동일한 거친 단계를 따라야합니다. Editor를 확장하기 위해 최신 버전의 Clangd가 설정 한 다음 VScode와 동일한 플래그를 제공하십시오. 우리는 사람들이 예를 들어 EMACS 및 VIM+YouCompleteme (YCM)과 같은 다른 편집자와 함께이 도구를 쉽게 설정하는 데 쉬운 시간을 보냈습니다.
다른 편집자를 설정하는 데 성공하거나 clang-tidy 설정 하거나이 판결을 향상시킬 수있는 것을 보았을 때 우리는 당신이 알고있는 것을 돌려주고 기여한다면 그것을 좋아할 것입니다! github 에서이 README.md 편집하고 PR을 제출하십시오 :)
당신은 이제 모두 가야합니다! 설정을 통해이를 만드는 방법.
작업 공간의 루트에 compile_commands.json 파일이 있어야하므로 편집자가 Clang 기반의 자동 완성을 제공 할 수 있습니다. 그리고 당신은 BUILD -file 변경을 만들 때 새로 고침을 필요로 할 수있을 정도로 bazel run 그자가 완성을 새로 고치기 위해 어떤 목표를 달성하는지 알아야합니다.
무대 뒤에서 compile_commands.json 파일에는 프로젝트의 모든 소스 파일을 빌드하는 데 사용되는 모든 명령을 설명하는 항목이 포함되어 있습니다. 그리고 현재로서는 헤더 당 하나의 항목이 있습니다. (이것은 헤더 파일에서도 자동 완성을 얻을 수 있으므로 clangd 의 가장 큰 거친 가장자리에 대해 생각할 필요가 없습니다). 결정적으로, 이러한 모든 명령은 Clang 툴링 (또는 귀하)을 이해하기에 충분히 비 바젤되어 있습니다.
우리는 매일이 도구를 사용하여 iOS를위한 크로스 플랫폼 라이브러리를 개발하고 MACOS에서 Android를 개발합니다. Android 소스, MacOS의 MacOS, iOS의 iOS 등에서 Android 완료를 기대하십시오. 사람들은 Linux/Ubuntu 및 Windows에서도 사용합니다.
모든 일반적인 CLANGD 기능이 작동해야합니다. CMD/CTRL+CLICK NAVIGINS (또는 키 바인딩을 변경 한 경우 옵션), 스마트 이름, 자동 완성, 강조 표시 등 IDE에서 기대하는 모든 것이 있어야합니다 (대부분의 좋은 ID는 clangd 에 의해 뒷받침되기 때문에). 일반적인 원칙 : 프로그래밍 언어를 이해해야하는 툴링을 선택하는 경우, Clangd가 LLVM/Clang 프로젝트의 일환으로 수행하는 해당 언어의 컴파일러 프론트 엔드를 기반으로하기를 원합니다.
생성 된 파일이 존재하려면 빌드를 실행해야 할 수도 있지만 생성 된 파일에는 모든 것이 작동해야합니다. 원격 실행 또는 캐시와 함께 사용하는 경우 --remote_download_regex 사용하여 헤더 및 소스 파일을 끌어 내고 편집자 내 오류를 피하기 위해 바이트 ( --remote_download_toplevel )가 Bazel 기본값이됩니다. 당신이 이것을 통해 일한다면, 우리는 당신이 다른 모든 사람들에게 좋은 지침을 추가하는 PR을 돌려주고, 적어도 문제에서 배운 것을 공유한다면 우리는 그것을 좋아할 것입니다. 또한 비 창의에 대한 *.D 종속성 파일을 아래로 가져 가고 싶을 것입니다. 캐시로 사용할 수있을 때 헤더가 훨씬 빨리 찾을 수있었습니다. 또한 ( --noexperimental_inmemory_dotd_files ) 없이도 당겨 졌는지 확인하는 경우에도 감사하겠습니다. 도와 주셔서 감사합니다!
그렇지 않으면, 우리는 우리가 알고 있고 추적하는 거친 가장자리에 대한 스스로 제조 된 문제를 가지고 있습니다. 우리는 당신이보고있는 것, 좋고 나쁜 것에 대해 당신의 의견을 듣고 싶습니다. 더 거친 가장자리를 찾으면 물건을 추가하고 도움이 필요하거나 더 많은 기능이 필요한지 알려주십시오.
반면에, 당신이 물건을 설정하고 그들이 잘 일한다면, 우리는 여전히 당신의 의견을 듣고 싶어합니다. 성공을 설명하는 문제 탭에 "비 문제"를 제출하십시오! 우리는 작업중 인 작업, 사용중인 플랫폼 및 가장 유용한 것을 듣고 싶습니다. 그리고 아마도 우리가 당신에게 도움이된다는 것을 알기 위해 스타를 우리의 길로 던질 수도 있습니다.
우리는 또한 기여와 개선에 대해 여러분과 함께 일하는 것을 좋아합니다! 개발 설정은 쉽지 않고 쉽습니다. 우리는 당신이 필요한 변경을 신속하게 안내 할 수있는 훌륭한 문서를 가지고 있습니다. 코드베이스는 매우 깨끗하고 친절합니다. 코드를 밟는 것은 원하는 개선 사항을 얻는 재미 있고 효율적인 방법입니다.
C Language 제품군에 Bazel을 사용하는 경우 다른 툴링과 같은 다른 툴링을 원할 것입니다.
대신 구현 세부 정보를 찾고 계십니까? 코드베이스에 뛰어 들고 싶습니까? ubstionationationReadMe.md를 참조하십시오.
이것을 읽는 바젤/블레이즈 관리자? 이것을 공식 바 졸 도구에 통합하는 데 관심이 있다면 문제 나 이메일로 알려 주시고 이야기하겠습니다! 우리는 바젤을 사용하는 것을 좋아하고 도움을 좋아합니다.