WORKSPACE 정의 및 사용법
Bazel의 핵심 개념 중 하나는 WORKSPACE 파일입니다. WORKSPACE 파일은 Bazel 프로젝트의 루트 디렉토리에 위치하며, 프로젝트를 정의하고 외부 종속성을 가져오는 데 사용됩니다.
WORKSPACE 파일을 설정하고 사용하는 방법은 다음과 같습니다.
1.
프로젝트 루트 디렉토리에 'WORKSPACE' 또는 'WORKSPACE.bazel'라는 이름의 파일을 생성합니다. Bazel은 이 파일을 찾아 프로젝트의 루트로 인식합니다.
2.
외부 종속성을 가져오려면 WORKSPACE 파일에 해당 규칙을 정의해야 합니다. Bazel은 여러 저장소 규칙을 제공하여 다양한 종류의 외부 종속성을 가져올 수 있습니다. 일반적인 저장소 규칙은 다음과 같습니다.
•
http_archive: 원격 저장소에서 압축된 파일을 다운로드하고 추출합니다.
•
git_repository: Git 저장소를 복제합니다.
•
local_repository: 로컬 파일 시스템의 디렉토리를 참조합니다.
예를 들어, Google Test를 외부 종속성으로 추가하려면 WORKSPACE 파일에 다음과 같이 작성할 수 있습니다.
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name = "com_google_googletest",
sha256 = "d1663e2d7e0f1d1eaf59a5d16e5f5c0e9a8ee3c3e47862a0e8b8eb1da7f1a0d5", # 파일의 해시값
strip_prefix = "googletest-release-1.11.0",
urls = ["https://github.com/google/googletest/archive/refs/tags/release-1.11.0.tar.gz"],
)
Python
복사
3.
외부 종속성을 사용하려면 BUILD 파일에서 해당 종속성을 참조해야 합니다. 예를 들어, 위에서 추가한 Google Test를 사용하는 경우 BUILD 파일에 다음과 같이 작성할 수 있습니다.
cc_test(
name = "my_test",
srcs = ["my_test.cc"],
deps = [
"@com_google_googletest//:gtest",
"@com_google_googletest//:gtest_main",
],
)
Python
복사
이제 Bazel을 사용하여 프로젝트를 빌드하고 테스트할 때, 외부 종속성을 올바르게 가져오고 사용할 수 있습니다.
참고로, 복잡한 프로젝트에서는 종속성 관리를 단순화하기 위해 'bazel-deps'와 같은 도구를 사용하기도 합니다.
BUILD 정의 및 사용법
Bazel에서 BUILD 파일은 프로젝트의 구성요소를 정의하고, 빌드 및 테스트 목표를 구성하는데 사용됩니다. BUILD 파일은 주로 Bazel의 규칙(rule)을 사용하여 작성되며, 각 규칙은 빌드 및 테스트 과정에서 생성되는 소스 파일, 종속성, 출력 등의 관계를 정의합니다.
BUILD 파일을 작성하는 방법을 자세히 살펴봅시다.
1.
프로젝트 디렉토리에 'BUILD' 또는 'BUILD.bazel'이라는 이름의 파일을 생성합니다. Bazel은 이 파일을 찾아 해당 디렉토리의 빌드 목표를 인식합니다.
2.
프로젝트의 구성요소에 맞는 Bazel 규칙을 사용하여 BUILD 파일을 작성합니다. Bazel은 여러 프로그래밍 언어 및 프레임워크에 대한 규칙을 제공합니다. 일반적인 규칙은 다음과 같습니다.
•
cc_library: C++ 라이브러리를 빌드합니다.
•
cc_binary: C++ 바이너리를 빌드합니다.
•
cc_test: C++ 테스트를 정의합니다.
•
java_library: Java 라이브러리를 빌드합니다.
•
java_binary: Java 바이너리를 빌드합니다.
•
java_test: Java 테스트를 정의합니다.
•
py_library: Python 라이브러리를 빌드합니다.
•
py_binary: Python 바이너리를 빌드합니다.
•
py_test: Python 테스트를 정의합니다.
3.
각 규칙에 필요한 속성을 설정하여 목표를 정의합니다. 일반적인 속성은 다음과 같습니다.
•
name: 목표의 고유한 이름입니다.
•
srcs: 소스 파일의 목록입니다.
•
hdrs: 헤더 파일의 목록입니다 (C++ 규칙에만 해당).
•
deps: 다른 라이브러리 또는 목표의 종속성 목록입니다.
•
data: 런타임 데이터 파일의 목록입니다.
예를 들어, 간단한 C++ 프로젝트의 경우 다음과 같이 BUILD 파일을 작성할 수 있습니다.
cc_library(
name = "my_library",
srcs = ["my_library.cc"],
hdrs = ["my_library.h"],
)
cc_binary(
name = "my_binary",
srcs = ["my_binary.cc"],
deps = [
":my_library",
],
)
cc_test(
name = "my_test",
srcs = ["my_test.cc"],
deps = [
":my_library",
"@com_google_googletest//:gtest",
"@com_google_googletest//:gtest_main",
],
)
Python
복사
이제 Bazel을 사용하여 이 프로젝트를 빌드하고 테스트할 수 있습니다. 위의 예제에서는 라이브러리, 바이너리, 테스트 세 가지 빌드 목표를 정의했습니다.
Bazel 명령어를 사용하여 빌드하거나 테스트를 실행할 수 있습니다.
•
라이브러리 빌드: bazel build //:my_library
•
바이너리 빌드: bazel build //:my_binary
•
테스트 실행: bazel test //:my_test
//는 프로젝트 루트를 나타내며, 이후에 목표 이름이 옵니다. 별도의 경로를 지정하려면 //:my_target 대신 //path/to/dir:my_target와 같이 작성할 수 있습니다.
Bazel은 빌드 목표와 관련된 소스 파일, 종속성 및 출력의 관계를 추적하며, 변경 사항이 발생할 때 최소한의 작업으로 빌드 및 테스트를 증분 업데이트할 수 있습니다. 또한, Bazel은 병렬 빌드를 지원하여 대규모 프로젝트의 빌드 시간을 단축할 수 있습니다.
간단한 예제를 통해 Bazel의 BUILD 파일 작성 방법을 살펴보았습니다. 프로젝트가 복잡해지면 여러 BUILD 파일을 사용하여 구조화하고, Bazel의 고급 기능(예: 플랫폼, 도커, 원격 빌드 등)을 활용하여 빌드 환경을 최적화할 수 있습니다.