C++ 및 Bazel

문제 신고 소스 보기 나이틀리 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

이 페이지에는 C++ 프로젝트에서 Bazel을 사용하는 데 도움이 되는 리소스가 포함되어 있습니다. Bazel로 C++ 프로젝트를 빌드하는 데 필요한 튜토리얼, 빌드 규칙, 기타 정보로 연결됩니다.

Bazel 사용

다음 리소스는 C++ 프로젝트에서 Bazel을 사용하는 데 도움이 됩니다.

권장사항

일반 Bazel 권장사항 외에도 C++ 프로젝트에 특화된 권장사항은 아래를 참고하세요.

BUILD 파일

BUILD 파일을 만들 때는 아래 가이드라인을 따르세요.

  • BUILD 파일에는 디렉터리의 컴파일 단위당 하나의 cc_library 규칙 타겟이 포함되어야 합니다.

  • 증분성을 극대화하고 빌드를 병렬화하려면 C++ 라이브러리를 최대한 세분화해야 합니다.

  • srcs에 소스 파일이 하나 있는 경우 라이브러리 이름을 해당 C++ 파일의 이름과 동일하게 지정합니다. 이 라이브러리에는 C++ 파일, 일치하는 헤더 파일, 라이브러리의 직접 종속 항목이 포함되어야 합니다. 예를 들면 다음과 같습니다.

    cc_library(
        name = "mylib",
        srcs = ["mylib.cc"],
        hdrs = ["mylib.h"],
        deps = [":lower-level-lib"]
    )
    
  • 파일에서 cc_library 타겟당 하나의 cc_test 규칙 타겟을 사용합니다. 타겟을 [library-name]_test로, 소스 파일을 [library-name]_test.cc로 지정합니다. 예를 들어 위에 표시된 mylib 라이브러리 타겟의 테스트 타겟은 다음과 같습니다.

    cc_test(
        name = "mylib_test",
        srcs = ["mylib_test.cc"],
        deps = [":mylib"]
    )
    

경로 포함

다음 가이드라인을 따라 포함 경로를 지정하세요.

  • 모든 포함 경로를 작업공간 디렉터리를 기준으로 합니다.

  • 시스템이 아닌 헤더에는 꺾쇠괄호 (#include <foo/bar/baz.h>)가 아닌 따옴표로 묶인 include (#include "foo/bar/baz.h")를 사용합니다.

  • . (현재 디렉터리) 또는 ..(상위 디렉터리)와 같은 UNIX 디렉터리 바로가기를 사용하지 마세요.

  • 접두사가 필요한 외부 저장소 포함과 같이 프로젝트 저장소 외부를 가리키는 포함이 필요한 기존 코드 또는 third_party 코드의 경우 cc_library 규칙 타겟에서 include_prefixstrip_include_prefix 인수를 사용합니다.

도구 모음 기능

다음 선택적 기능을 사용하면 C++ 프로젝트의 위생을 개선할 수 있습니다. 이러한 기능은 --features 명령줄 플래그 또는 repo, package 또는 cc_* 규칙의 features 속성을 사용하여 사용 설정할 수 있습니다.

  • parse_headers 기능을 사용하면 --process_headers_in_dependencies 플래그를 사용할 때 C++ 컴파일러가 빌드된 타겟과 종속 항목의 모든 헤더 파일을 컴파일하지 않고 파싱합니다. 이를 통해 헤더 전용 라이브러리의 문제를 포착하고 헤더가 자체적으로 포함되며 포함된 순서와 독립적인지 확인할 수 있습니다.
  • layering_check 기능은 타겟이 직접 종속 항목에서 제공하는 헤더만 포함하도록 강제합니다. 기본 도구 모음은 컴파일러로 clang를 사용하여 Linux에서 이 기능을 지원합니다.