일반적인 C++ 빌드 사용 사례

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

여기에서는 Bazel로 C++ 프로젝트를 빌드하는 가장 일반적인 사용 사례를 확인할 수 있습니다. 아직 하지 않았다면 튜토리얼 Bazel 소개: C++ 프로젝트 빌드를 완료하여 Bazel로 C++ 프로젝트 빌드를 시작하세요.

cc_library 및 hdrs 헤더 파일에 관한 자세한 내용은 cc_library를 참고하세요.

타겟에 여러 파일 포함

glob을 사용하여 단일 타겟에 여러 파일을 포함할 수 있습니다. 예를 들면 다음과 같습니다.

cc_library(
    name = "build-all-the-files",
    srcs = glob(["*.cc"]),
    hdrs = glob(["*.h"]),
)

이 타겟을 사용하면 Bazel이 이 타겟이 포함된 BUILD 파일과 동일한 디렉터리에서 찾은 모든 .cc.h 파일을 빌드합니다 (하위 디렉터리 제외).

전이적 포함 사용

파일에 헤더가 포함된 경우 해당 파일을 소스로 사용하는 규칙 (즉, srcs, hdrs 또는 textual_hdrs 속성에 해당 파일이 있음)은 포함된 헤더의 라이브러리 규칙에 종속되어야 합니다. 반대로 직접 종속 항목만 종속 항목으로 지정하면 됩니다. 예를 들어 sandwich.hbread.h이 포함되고 bread.hflour.h가 포함된다고 가정해 보겠습니다. sandwich.h에는 flour.h이 포함되지 않습니다 (샌드위치에 밀가루를 넣고 싶어하는 사람은 없겠죠). 따라서 BUILD 파일은 다음과 같습니다.

cc_library(
    name = "sandwich",
    srcs = ["sandwich.cc"],
    hdrs = ["sandwich.h"],
    deps = [":bread"],
)

cc_library(
    name = "bread",
    srcs = ["bread.cc"],
    hdrs = ["bread.h"],
    deps = [":flour"],
)

cc_library(
    name = "flour",
    srcs = ["flour.cc"],
    hdrs = ["flour.h"],
)

여기서 sandwich 라이브러리는 bread 라이브러리에 종속되고 bread 라이브러리는 flour 라이브러리에 종속됩니다.

포함 경로 추가

작업공간 루트에서 루트 포함 경로를 포함할 수 없거나 포함하고 싶지 않은 경우가 있습니다. 기존 라이브러리에는 작업공간의 경로와 일치하지 않는 include 디렉터리가 이미 있을 수 있습니다. 예를 들어 다음과 같은 디렉터리 구조가 있다고 가정해 보겠습니다.

└── my-project
    ├── legacy
       └── some_lib
           ├── BUILD
           ├── include
              └── some_lib.h
           └── some_lib.cc
    └── MODULE.bazel

Bazel은 some_lib.hlegacy/some_lib/include/some_lib.h로 포함될 것으로 예상하지만 some_lib.cc"some_lib.h"이 포함된다고 가정해 보겠습니다. 포함 경로가 유효하도록 하려면 legacy/some_lib/BUILD에서 some_lib/include 디렉터리가 포함 디렉터리임을 지정해야 합니다.

cc_library(
    name = "some_lib",
    srcs = ["some_lib.cc"],
    hdrs = ["include/some_lib.h"],
    copts = ["-Ilegacy/some_lib/include"],
)

이는 외부 종속 항목에 특히 유용합니다. 그렇지 않으면 헤더 파일이 / 접두사와 함께 포함되어야 하기 때문입니다.

외부 라이브러리 포함

Google Test{: .external}를 사용하고 있다고 가정해 보겠습니다. MODULE.bazel 파일에 종속 항목을 추가하여 Google Test를 다운로드하고 저장소에서 사용할 수 있도록 할 수 있습니다.

bazel_dep(name = "googletest", version = "1.15.2")

C++ 테스트 작성 및 실행

예를 들어 다음과 같은 테스트 ./test/hello-test.cc를 만들 수 있습니다.

#include "gtest/gtest.h"
#include "main/hello-greet.h"

TEST(HelloTest, GetGreet) {
  EXPECT_EQ(get_greet("Bazel"), "Hello Bazel");
}

그런 다음 테스트용 ./test/BUILD 파일을 만듭니다.

cc_test(
    name = "hello-test",
    srcs = ["hello-test.cc"],
    copts = [
      "-Iexternal/gtest/googletest/include",
      "-Iexternal/gtest/googletest",
    ],
    deps = [
        "@googletest//:gtest_main",
        "//main:hello-greet",
    ],
)

hello-greethello-test에 표시되도록 하려면 ./main/BUILDvisibility 속성에 "//test:__pkg__",를 추가해야 합니다.

이제 bazel test를 사용하여 테스트를 실행할 수 있습니다.

bazel test test:hello-test

그러면 다음과 같은 출력이 생성됩니다.

INFO: Found 1 test target...
Target //test:hello-test up-to-date:
  bazel-bin/test/hello-test
INFO: Elapsed time: 4.497s, Critical Path: 2.53s
//test:hello-test PASSED in 0.3s

Executed 1 out of 1 tests: 1 test passes.

사전 컴파일된 라이브러리에 종속 항목 추가

컴파일된 버전 (예: 헤더 및 .so 파일)만 있는 라이브러리를 사용하려면 cc_library 규칙으로 래핑하세요.

cc_library(
    name = "mylib",
    srcs = ["mylib.so"],
    hdrs = ["mylib.h"],
)

이렇게 하면 작업공간의 다른 C++ 타겟이 이 규칙에 종속될 수 있습니다.