Bazel 설치 사용법
바젤(Bazel)을 설치하고 사용법에 대해서 설명드립니다. 소프트웨어 빌드 및 테스트 자동화를 가능하게하는 오픈 소스 도구입니다. 머신러닝 프레임워크인 텐서플로우(Tensorflow)뿐만 아니라 구글 내부 프로젝트 및 많은 오픈소스 등에도 사용됩니다.
텐서플로우 빌드에서 어떻게 Bazel 사용이 되는지는 아래의 글을 참고하실 수 있습니다.
Bazel 설치
설치 환경은 우분투 16.04 버전과 18.04 버전 등이 차이가 나지 않습니다. 설치 방법은 우분투 패키지를 이용하여 설치할 수 있고, 설치 파일을 사용하여 특정 버전으로 수동 설치 하실 수도 있습니다. 아래의 2가지 방법 중 선호하시는 방법으로 설치하시면 됩니다.
- 패키지 설치 : Repository를 추가하여 Bazel을 설치하는 방법입니다. 현재는 최신버전의 Bazel만을 설치 할 수 있습니다.
- 바이너리 설치 : 바이너리로 배포되는 Bazel을 직접 설치하는 방법입니다. 직접 버전을 선택하여 설치 할 수 있습니다.
패키지 설치
먼저 아래의 명령어로 JDK 8을 설치해 주시기 바랍니다.
$ sudo apt-get install openjdk-8-jdk
그 다음 아래의 명령어로 Bazel 배포 URI를 등록해 주시기 바랍니다.
$ echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
$ curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -
그리고 아래의 명령어로 Bazel을 설치해 주시면 됩니다.
$ sudo apt-get update && sudo apt-get install bazel
Bazel이 성공적으로 설치가 되었을 경우, 아래의 명령어로 Bazel을 업데이트 하실 수 있습니다.
$ sudo apt-get upgrade bazel
바이너리 설치
바이너리 파일을 이용하여 Bazel을 설치하는 방법입니다. 텐서플로우등 오픈소스를 빌드 할 때에는 최신 버전이 이나라, 특정 버전의 Bazel이 필요할 수 있습니다. 아래의 페이지를 방문 한 다음 설치 하고자 하시는 버전의 Bazel 설치 파일을 다운 받습니다.
https://github.com/bazelbuild/bazel/releases
예를 들어 64bit 리눅스 환경일 경우 bazel-<version>-installer-linux-x86_64.sh
파일을 다운받으시면 됩니다. 그리고 아래의 명령어를 실행하면 Bazel이 설치되게 됩니다.
$ chmod +x bazel-<version>-installer-linux-x86_64.sh
$ sudo ./bazel-<version>-installer-linux-x86_64.sh
Bazel 사용법
Bazel 설치 사용법 Bazel은 Java, C++ 뿐만 아니라 Android, iOS 어플리케이션 개발에도 사용될 수 있습니다. 이번 글에서는 C++ 프로젝트에서 어떻게 Bazel을 사용할 수 있는지 설명드리겠습니다. 예제파일은 아래의 명령어로 다운 받으실 수 있습니다.
$ git clone https://github.com/bazelbuild/examples/
위의 예제 파일을 이용하여 Bazel의 컨셉을 설명드리고, target과 BUILD 파일들에 대해서 설명드리도록 하겠습니다.
C++ 프로젝트를 빌드해 볼 것이기 때문에 예제 파일들은 examples/cpp-tutorial 이곳에 있는 파일들을 참고하시면 됩니다. 파일 및 디렉토리 구조는 아래와 같습니다.
examples
└── cpp-tutorial
├──stage1
│ └── main
│ ├── BUILD
│ ├── hello-world.cc
│ └── WORKSPACE
├──stage2
│ ├── main
│ │ ├── BUILD
│ │ ├── hello-world.cc
│ │ ├── hello-greet.cc
│ │ ├── hello-greet.h
│ └── WORKSPACE
└──stage3
├── main
│ ├── BUILD
│ ├── hello-world.cc
│ ├── hello-greet.cc
│ └── hello-greet.h
├── lib
│ ├── BUILD
│ ├── hello-time.cc
│ └── hello-time.h
└── WORKSPACE
위의 디렉토리 구조를 보시면 아시겠지만, 3단계(stage1, stage2, stage3)로 각각의 프로젝트 디렉토리로 나눠져 있습니다.
stage1에서는 하나의 target으로 빌드해 보는 내용이고, stage2에서는 하나의 패키지로 유지하면서 여러 target으로 프로젝트를 나눠서 빌드해 보는 내용입니다. 그리고 마지막 stage3에서는 프로젝트를 여러 패키지와 여러 target으로 나눠서 빌드해 보는 내용입니다.
먼저 stage1를 이용하여 기본 적인 사용법을 설명드리도록 하겠습니다.
workspace 설정
프로젝트를 빌드하기 전에 프로젝트의 workspace를 설정할 필요가 있습니다. workspace란 프로젝트의 소스파일과 빌드 결과물이 관리되는 디렉토리입니다. workspace 디렉토리는 아래와 같은 특별한 파일들을 포함합니다.
- WORKSPACE : 최상위 프로젝트 디렉토리에 존재하며, Bazel의 workspace 디렉토리임을 알립니다. 예제 소스코드는 모두 stage1, stage2, stage3로 3개의 Bazel 프로젝트로 나눠져 있습니다.
- 하나 또는 그 이상의 BUILD 파일 : 프로젝트를 어떻게 빌드할 것인지 Bazel에게 알리는 역할을 하는 파일입니다.
BUILD 파일 이해
하나의 빌드 파일은 다른 유형의 내용이 있을 수 있습니다. 하지만 가장 중요한 유형은 빌드 규칙을 정의하는 것입니다. Bazel에게 어떻게 소스코드를 빌드하고, 결과물이 라이브러 또는 실행가능한 바이너리 파일인지 알려주는 역할을 합니다. BUILD 파일 안에서 빌드 규칙은 target이라고 불리기도 하며, 구체적인 소스코드 파일들과 의존성을 정의하기도 합니다.
cpp-tutorial/stage1/main 디렉토리에서 BUILD 파일의 내용을 확인해 보도록 하겠습니다.
cc_binary(
name = "hello-world",
srcs = ["hello-world.cc"],
)
위의 내용은 hello-world.cc 로부터, 추가 의존성 없이 실행가능한 바이너리 파일을 빌드하는 내용입니다.
프로젝트 BUILD
Bazel 프로젝트에서 소스코드를 빌드하기 위해서는 bazel 빌드라는 명령어를 사용합니다. 첫 번째 예제소스코드를 빌드하기 위해서 cpp-tutorial/stage1 디렉토리로 이동합니다. 그리고 아래의 명령어를 실행합니다.
$ bazel build //main:hello-world
//main: 이라는 부분은 workspace 에서 BUILD 파일이 존재하는 상대 위치로, hello-world라는 내용은 BUILD 파일 내부에서 target으로 정의된 내용입니다. 아래의 내용은 위에서 실행한 결과 내용입니다.
Extracting Bazel installation...
..........................
INFO: Analysed target //main:hello-world (6 packages loaded).
INFO: Found 1 target...
Target //main:hello-world up-to-date:
bazel-bin/main/hello-world
INFO: Elapsed time: 12.670s, Critical Path: 1.20s
INFO: Build completed successfully, 6 total actions
위의 내용과 같이 빌드가 성공적으로 되었을 경우, bazel-bin 디렉토리에 빌드 결과물이 위치하게 됩니다. 아래의 명령어로 바이너리를 실행할 수 있습니다.
$ bazel-bin/main/hello-world
( 본문 인용시 출처를 밝혀 주시면 감사하겠습니다.)