Hello Bazel!

이번 주말동안 나는 약 8시간을 Bazel에 사용했다.

처음엔 Facebook Buck에 관심있었으나 어차피 Buck은 Bazel위에 만들어진것이고 솔직히 스크립트 작성하는데 여러방면에 있어서는 큰 차이가 없다.

iOS개발자 시각으로 봤을 때, 딱히 Bazel + tulsi섞어서 굳이 빌드툴을 만들어서 할 필요없다 Xcode에서 기본적으로 설정된 셋팅값만으로도 충분하다. 여러 각종 cocoapod을 섞어 써야한다면 오히려 시간대비 효율이 떨어진다.

이러한 점을 보완해준 PodToBuild라는 Pinterest에서 만든 라이브러리가 있지만 이거 마저 Build 스크립트 쓰기가 정말 귀찮다.

pinterest/PodToBUILD
_An easy way to integrate CocoaPods into Bazel. Contribute to pinterest/PodToBUILD development by creating an account on…_github.com

https://www.youtube.com/watch?v=wewAVF-DVhs

iOS build tool용도는 좀 아닌듯하고 
Bazel이랑 정 떨어지기 싫으면 순수하게 c나 c++로 짜여진 대규모 3rd-party or application building 용에 쓰는게 가장 효율적이라 생각한다.

사실 Build Tool에 관심을 가지게 된 계기가 아래의 Youtube영상을 보고 난 뒤 였다. 바로 Building Real-time Systems with Bazel w/ SpaceX, SpaceX에서 Bazel을 이용해서 RTS 를 빌드한다는 부분이 굉장히 인상적이었다.

(Falcon쏘는 모습이 겹쳐져서 그런지 Bazel이 더 빛나보였다.)

https://www.youtube.com/watch?v=t_3bckhV_YI

그래서 이번에 SDL을 이용한 Cube 띄우는 소스를 Bazel로 간단히 build해보고자 한다.

1. Bazel Build하기 위한 기본적인 설치를 하자

https://docs.bazel.build/versions/master/install-os-x.html 자세한건 여기로

2. SDL2 Build Script를 작성한다.

우선 필자는 다음과 같은 디렉토리로 구성할 것이다.

그리고 편의를 위한 Makefile을 만들었다.

bazel build를 돌리면 bazel-bin 에 결과물이 나오고 bazel clean때려주면 모든 cache와 build, bin파일들이 삭제된다.

Workspace file에선 기본적인 build하기전 필요한 도구나 3rd-party, macro, 각종 rules을 정의 해준다. 즉 build전과정에 필요한 것들을 처리하는 파일이라 보면 된다.

그리고 별도의 sdl2를 위한 BUILD 파일을 생성해준다.

BUILD파일에선 cc_library object에 각종 name, hdrs etc 값들이 있는 걸 볼 수 있다. cc_binary, cc_library 와 같은 기능들이 제공되는데 이것들은 https://docs.bazel.build/versions/master/bazel-and-cpp.html API guide를 보면 자세히 알 수 있다.

간단히 요약하자면 cc_library 는 하나의 모듈 블록이라 생각하면 편하다.

linkopts 가 좀 복잡한데 사실 대학시절 배운 기본기만 다시 잘 살려내면 별거 아닌 내용이다. 즉 lib path지정해주고 lib file 명시해주고 필요한 framework 가져오는 모든 options을 linkopts에서 처리한다 보면 된다.

3. Application(Cube) Build Script를 작성한다.

이전 sdl2.BUILD에서 작성해준 cc_library는 visiblity 덕분에 해당 Application의 BUILD script에서 사용 할 수가 있다. 여기서 cc_library를 사용하기 위해선 “@SDL2//:SDL2” 로 정의해주면 끝이다.

“@(PACKAGE_NAME)//:(TARGET_BUILD_NAME)”

PACKAGE_NAME: WORKSPACE file의 new_local_repository 에 정의 된 name, 사용할 때 외부 Package 앞에는 “@”를 붙이고 // 를 마지막에 붙여준다.

TARGET_BUILD_NAME: sdl2.BUILD에 정의 된 cc_library의 name, dependency lib name앞에는 항상 :를 붙여준다.

그리고 cc_binary는 실질적으로 bin파일을 만드는 녀석이다. 여기에 일반적으로 main file 을 넣어주고 필요한 dependencies 를 정의해준다.

그리고 좀 전에 맨들어 놓은 Makefile을 다시보자.

이제 build를 할 껀데 빌드 스크립트는 bazel build //Cube:CubeExample로 정의 되어 있는 걸 볼 수 있다.

//Cube는 Application의 BUILD file이 있는 dir를 의미하고 :CubeExample은 좀 전에 cc_binary에 정의된 name값이다.

이렇게 돌리면 아래와 같은 파일들이 생성된 걸 볼 수 있다.

build로그를 보면 마지막에 bazel-bin/Cube/CubeExample이라는 application이 만들어 진걸 확인 할 수 있다.

이제 앱을 실행 시키기만 하면 끝이다.

Bazel은 Buck과 다르게 Build Trace를 기본적으로 탑재된 상태로 제공해주지 않는다.

Performance Tuning
_Buck does a lot of work to make builds as fast as possible, and we also give developers tools to figure out where the…_buckbuild.com

catapult-project/catapult
_Catapult. Contribute to catapult-project/catapult development by creating an account on GitHub._github.com

Sample Repo는 여기로! (star 감사히받습니다.)

GeekTree0101/SDLBazelExample
_SDL Cube Bazel builder example. Contribute to GeekTree0101/SDLBazelExample development by creating an account on…_github.com