원문: https://docs.bazel.build/versions/master/bazel-overview.html


Bazel 개요

Make, Maven, Gradle 과 유사한 오픈소스 빌드도구. 사람이 읽을수 있는 하이레벨 빌드언어.

여러 프로그래밍 언어를 지원하며 다양한 플랫폼을 대상으로 결과물 생성이 가능하다.


특장점

  • High-level build language - 추상화된 사람이 읽을수 있는 언어를 사용한다. 의미를 설명하는 수준의 프로젝트 빌드설정 가능. 라이브라리, 바이너리, 스크립트, 데이터셋 등에 대한 개념을 운영할 수 있다.
  • Bazel is fast and reliable - 이전 단계에서 실행된 파일내용 변경과 빌드명령에 실행을 캐싱할 수 있어서 언제 어떤것이 리빌드되어야 하는지 알 수 있다. 이는 빌드를 가속시키고 증분내용만 병렬로 설정가능하다.
  • Bazel is multi-platform - 동일한 프로젝트를 데스크탑, 서버, 모바일 등 멀티플랫폼을 위한 바이너리와 배포패키지로 빌드 가능하다.
  • Bazel scales- 10만개 이상의 소스파이를 처리할 때에도 고속이다. 여러개의 리포지토리와 수만명의 사용자를 지원한다.
  • Bazel is extensible - 다양한 개발언어를 지원한다.


Bazel 지원환경

  • Programming languages: Java, C++, Objective-C, Python, JavaScript, Go
  • Operating systems: Linux, macOS, Windows
  • Target platforms: Linux, macOS, Windows, Android, iOS, Google App Engine


사용방법

빌드하기

  1. Set up Bazel : Download and install Bazel.
  2. Set up a project : workspace는 위한 입력과 필드파일을 찾고 결과를 저장하는 디렉토리이다.
  3. Write a BUILD file : 빌드대상과 빌드방법을 정의한다.
    • 파이선과 유사한 추상언어로 빌드 타겟을 정의한다. (아래 사례)
      package(default_visibility = ["//visibility:public"])
      	cc_library(
      	    name = "hello-lib",
      	    srcs = ["hello-lib.cc"],
      	    hdrs = ["hello-lib.h"],
      	)
      	cc_binary(
      	    name = "hello-world",
      	    srcs = ["hello-world.cc"],
      	    deps = [":hello-lib"],
      	)
      	cc_test(
      	    name = "hello-success_test",
      	    srcs = ["hello-world.cc"],
      	    deps = [":hello-lib"],
      	)
      	cc_test(
      	    name = "hello-fail_test",
      	    srcs = ["hello-fail.cc"],
      	    deps = [":hello-lib"],
      	)
      	filegroup(
      	    name = "srcs",
      	    srcs = glob(["**"]),
      	)
      
    • 빌드타겟은 의존관계, 빌드룰, 빌드룰 옵션과 함께 Bazel이 빌드할 추가 부산물들을 정의한다.
    • 빌드룰은 컴파일러, 링크, 그리고 이들을 위한 설정들을 구체화한다. Bazel은 빌드룰을 포함하며, 빌드룰은 수많은 지원 플랫폼과 지원언어에서의 부산물 타입을 정의한다.
  4. Run Bazel : 명령라인에서 Bazel 실행. workspace에 결과물이 출력된다.

그리고 test 명령을 이용하여 테스트하거나 query명령을 이용하여 종속관계를 쿼리할 수 있다.


Bazel 동작방식

  1. 빌드파일 Load
  2. 입력과 입력에 대한 종속관계 분석, 빌드룰 적용, 액션그래프 생성
  3. 입력에 대한 빌드액션 실행

Bazel에서는 모든 이전 빌드결과가 캐시되어 있기 때문에 중간결과물은 재사용하고 변화된 내용만 빌드 또는 테스트하게 됨

설정에 따라 Sandboxing을 통해 폐쇄적 환경에서 빌드할 수도 있다.


액션그래프

액션그래프는 빌드의 부산물과 이들의 관계, 그리고 빌드액션을 나타낸다.

Bazel은 액션그래프를 통해 파일의 내용 변화와 액션(빌드, 테스트)의 변화를 추적하고 이전에 실행된 작업을 알 수 있게 된다.

코드의 종속관계도 추적할 수 있도록 해준다.