구글은 다중 언어 (C ++, 자바, 이동 ..) 컴파일 도구를 게시 - Bazel을

바젤

Bazel은 오픈 소스 빌드하고, 메이븐 및 Gradle을 확인 유사한 테스트 도구입니다. 그것은 사람이 읽을 수있는, 높은 수준의 빌드 언어를 사용합니다. Bazel 여러 언어로 프로젝트를 지원하고 여러 플랫폼에 대한 출력을 작성합니다. Bazel는 여러 저장소에서 큰 코드베이스, 그리고 많은 수의 사용자를 지원합니다.

Bazel은 오픈 소스 만들기 유사한 편집 도구를 사용하여, 여러 언어, 크로스 플랫폼을 지원합니다.

설치
공식의 예

첫 번째 복제 프로젝트 :

:git clone https://github.com/bazelbuild/examples
正克隆到 'examples'...
remote: Enumerating objects: 14, done.
remote: Counting objects: 100% (14/14), done.
remote: Compressing objects: 100% (12/12), done.
remote: Total 1183 (delta 3), reused 6 (delta 2), pack-reused 1169
接收对象中: 100% (1183/1183), 362.71 KiB | 113.00 KiB/s, 完成.
处理 delta 中: 100% (439/439), 完成.

여러 언어로 제공되는 예는 CPP를 보면 :

:cd examples/cpp-tutorial

디렉토리 아래에있는 파일을 보려면 :

:tree
.
├── README.md
├── stage1
│   ├── README.md
│   ├── WORKSPACE
│   └── main
│       ├── BUILD
│       └── hello-world.cc
├── stage2
│   ├── README.md
│   ├── WORKSPACE
│   └── main
│       ├── BUILD
│       ├── hello-greet.cc
│       ├── hello-greet.h
│       └── hello-world.cc
└── stage3
    ├── README.md
    ├── WORKSPACE
    ├── lib
    │   ├── BUILD
    │   ├── hello-time.cc
    │   └── hello-time.h
    └── main
        ├── BUILD
        ├── hello-greet.cc
        ├── hello-greet.h
        └── hello-world.cc

7 directories, 20 files

당신이 볼 수 있듯이, 파일의 세 세트,이 튜토리얼의 단계를 나타내는 각각의 세트가있다. 첫 번째 단계에서, 당신은 하나의 패키지에 거주하는 단일 대상을 구축 할 것입니다. 두 번째 단계에서는 여러 대상으로 프로젝트를 분할하지만 그것은 하나의 패키지에 보관하십시오. 세 번째이자 마지막 단계에서, 당신은 여러 패키지로 프로젝트를 분할하고 여러 대상으로 구축.

우선, WORKSPACE에게 소정의 면적을 볼 수 있습니다 다음이 BUILD 파일에서 다른 파일을 컴파일하는 규칙을 정의합니다.

설정 작업 공간

당신이 프로젝트를 빌드하기 전에, 당신은 작업 공간을 설정해야합니다. 작업 영역은 프로젝트의 소스 파일과 Bazel의 빌드 출력을 유지하는 디렉토리입니다. 또한 Bazel 특수로 인식하는 파일이 포함되어 있습니다 :

  • 디렉토리와 Bazel 작업 공간 등의 내용을 식별하고 프로젝트의 디렉토리 구조의 루트에 사는 작업 영역 파일,
  • 하나 방법이 프로젝트의 다른 부분을 구축하는 Bazel에게 더 BUILD 파일. (빌드 파일이 포함 된 작업 공간 내의 디렉토리는 패키지입니다.이 튜토리얼에서 나중에 패키지에 대해 배우게됩니다.)

작업 영역 파일은이 프로젝트의 루트 디렉토리에 위치해야합니다, 하나 개의 프로젝트를 구별하는 데 사용됩니다.

어떻게 다른 모듈에서 프로젝트 컴파일 하나 이상의 빌드 파일을 정의합니다.

Bazel 작업 공간으로 디렉토리를 지정하려면 해당 디렉토리에 WORKSPACE라는 빈 파일을 만듭니다.

Bazel 프로젝트를 빌드 할 때 모든 입력 및 종속성은 동일한 작업 공간에 있어야합니다. 다른 작업 공간에 존재하는 파일은이 튜토리얼의 범위를 벗어 인, 링크 된 다른 않는 하나의 독립적입니다.

Bazel은 모든 입력의 프로젝트를 컴파일 할 때 종속 파일은 동일한 작업 공간 (작업 공간)에 있어야하고, 다른 작업 공간에서 어떤 링크가 존재하지 않는 경우는, Bazel을 컴파일 할 수있는 방법은 없습니다.

짓다

빌드 파일은 Bazel에 대한 지침의 여러 가지 종류가 포함되어 있습니다. 가장 중요한 유형은 Bazel 방법 등의 실행 바이너리 또는 라이브러리로 원하는 출력을 만들도록 지시 빌드 규칙이다. 빌드 파일의 빌드 규칙의 각 인스턴스는 소스 파일과 종속의 특정 세트에 대상 포인트라고합니다. 대상은 다른 대상을 가리킬 수 있습니다.

지침 Bazel의 다른 유형을 포함 BUILD 파일, 가장 중요한 것은 지정하는 규칙을 컴파일하는 방법 (예 : 실행 바이너리 또는 라이브러리)를 출력. 규칙을 컴파일하는 소스 파일과 종속 파일을 여러 포인트, 당신은 또 다른 대상을 가리킬 수있는 목표입니다.

예를 들면 :

cc_binary(
    name = "hello-world",
    srcs = ["hello-world.cc"],
)

헬로 세계 대상 Bazel의 내장에서 cc_binary 규칙을 인스턴스화합니다. 규칙은 종속되지와 hello-world.cc 소스 파일 자체에 포함 된 실행 바이너리를 구축 Bazel을 알려줍니다.

정의 위 Cc_binary는 컴파일 이름의 유형은이 파일이 실행 파일로 컴파일 hello-world.cc합니다, 안녕하세요 - 세계를 지배.

프로젝트가 프로젝트를 빌드 컴파일

다음과 같이 명령은 다음과 같습니다

bazel build //main:hello-world

대상 레이블을 주목하라 - // 주 : 일부 작업 공간의 루트에 우리의 빌드 파일의 위치, 그리고 안녕하세요 세계는 우리가 이름이 무엇 빌드 파일의 대상이. (이 튜토리얼의 끝에서 자세히 대상 레이블에 대해 배우게됩니다.)

// 빌드 경로 Bazel /에 / 패키지 처벌에 대한 : 대상 이름
규칙 이름 : 작업 공간 디렉토리를 기준으로 Bazel 빌드 //
실행 :

:cd stage1
:bazel build //main:hello-world
Starting local Bazel server and connecting to it...
INFO: Analyzed target //main:hello-world (13 packages loaded, 49 targets configured).
INFO: Found 1 target...
Target //main:hello-world up-to-date:
  bazel-bin/main/hello-world
INFO: Elapsed time: 31.900s, Critical Path: 1.47s
INFO: 2 processes: 2 darwin-sandbox.
INFO: Build completed successfully, 5 total actions

당신은 파일을 실행하려면 :

bazel-bin/main/hello-world

bazel 빌드 파일을 가지고 무엇을 살펴 후 :

:cd stage1
:ls
README.md	WORKSPACE	bazel-bin	bazel-out	bazel-stage1	bazel-testlogs	main
:tree
.
├── README.md
├── WORKSPACE
├── bazel-bin -> /private/var/tmp/_bazel_lurongming/f341b2c050b4058e9d9fef7c2d35da5d/execroot/__main__/bazel-out/darwin-fastbuild/bin
├── bazel-out -> /private/var/tmp/_bazel_lurongming/f341b2c050b4058e9d9fef7c2d35da5d/execroot/__main__/bazel-out
├── bazel-stage1 -> /private/var/tmp/_bazel_lurongming/f341b2c050b4058e9d9fef7c2d35da5d/execroot/__main__
├── bazel-testlogs -> /private/var/tmp/_bazel_lurongming/f341b2c050b4058e9d9fef7c2d35da5d/execroot/__main__/bazel-out/darwin-fastbuild/testlogs
└── main
    ├── BUILD
    └── hello-world.cc

5 directories, 4 files
리뷰
:bazel query --notool_deps --noimplicit_deps 'deps(//main:hello-world)'   --output graph
digraph mygraph {
  node [shape=box];
  "//main:hello-world"
  "//main:hello-world" -> "//main:hello-world.cc"
  "//main:hello-world.cc"
}

사용 bazel 쿼리 컴파일 규칙을 조회 할 수 있습니다.

좀 더 복잡한에서 살펴 보자 :

└── stage3
    ├── README.md
    ├── WORKSPACE
    ├── lib
    │   ├── BUILD
    │   ├── hello-time.cc
    │   └── hello-time.h
    └── main
        ├── BUILD
        ├── hello-greet.cc
        ├── hello-greet.h
        └── hello-world.cc

그것은 컴파일 규칙입니다 :

lib 디렉토리 / BUILD :

cc_library(
    name = "hello-time",
    srcs = ["hello-time.cc"],
    hdrs = ["hello-time.h"],
    visibility = ["//main:__pkg__"],
)

주 / BUILD :

cc_library(
    name = "hello-greet",
    srcs = ["hello-greet.cc"],
    hdrs = ["hello-greet.h"],
)

cc_binary(
    name = "hello-world",
    srcs = ["hello-world.cc"],
    deps = [
        ":hello-greet",
        "//lib:hello-time",
    ],
)

가시성 속성을 사용하여 주 / 빌드에서 대상에 명시 적으로 볼 lib 디렉토리 / BUILD에서 안녕하세요 타임 타겟 : 빌드가 성공하기 위해, 우리는 // LIB을 알 수 있습니다. 기본 목표로 동일한 빌드 파일에서 다른 목표 만 볼 수 있기 때문입니다. (Bazel는 공개 API에 누출 구현 세부 사항을 포함하는 라이브러리와 같은 문제를 방지하기 위해 대상 가시성을 사용합니다.)

그것을 볼 수있는 다른 BUILD 필요, 가시성을 사용하십시오 경우이 문서의 유일한 목표의 기본 빌드 파일은 볼 수 있습니다.

게시 99 개 원래 기사 · 원 찬양 5 ·은 10000 +를 볼

추천

출처blog.csdn.net/LU_ZHAO/article/details/104756897