Windows에서 Bazel 사용

이 페이지에서는 Windows에서 Bazel을 사용하기 위한 권장사항을 다룹니다. 설치 안내는 Windows에 Bazel 설치를 참고하세요.

알려진 문제

Windows 관련 Bazel 문제는 GitHub에서 'area-Windows' 라벨로 표시됩니다. GitHub-Windows.

권장사항

긴 경로 문제 방지

일부 도구에는 Windows의 최대 경로 길이 제한이 있으며 MSVC 컴파일러도 포함됩니다. 이 문제를 방지하려면 --output_user_root 플래그로 Bazel의 짧은 출력 디렉터리를 지정하면 됩니다.

예를 들어 bazelrc 파일에 다음 줄을 추가합니다.

startup --output_user_root=C:/tmp

일부 기능을 사용하려면 Bazel에서 Windows에 파일 심볼릭 링크를 만들 수 있어야 합니다. 개발자 모드 (Windows 10 버전 1703 이상)를 사용 설정하거나 Bazel을 관리자로 실행하면 됩니다. 이렇게 하면 다음 기능을 사용할 수 있습니다.

더 쉽게 하려면 bazelrc 파일에 다음 줄을 추가합니다.

startup --windows_enable_symlinks

build --enable_runfiles

참고: Windows에서 심볼릭 링크를 만드는 것은 비용이 많이 드는 작업입니다. --enable_runfiles 플래그는 많은 파일 심볼릭 링크를 만들 수 있습니다. 이 기능은 필요할 때만 사용 설정하세요.

Bazel 실행: MSYS2 셸, 명령 프롬프트, PowerShell

권장사항: 명령 프롬프트 (cmd.exe) 또는 PowerShell에서 Bazel을 실행합니다.

2020년 1월 15일 현재 Bazel을 bash에서 실행하지 마세요. MSYS2 셸, Git Bash, Cygwin 또는 기타 Bash 변형에서 실행하지 마세요. Bazel 은 대부분의 사용 사례에서 작동할 수 있지만 MSYS2에서 Ctrl+C로 빌드를 중단하는 것과 같은 일부 기능이 중단됩니다). 또한 MSYS2에서 실행하도록 선택하는 경우 MSYS2의 자동 경로 변환을 사용 중지해야 합니다. 그렇지 않으면 MSYS가 Unix 경로처럼 보이는 명령줄 인수 (예: //foo:bar)를 Windows 경로로 변환합니다. 자세한 내용은 이 StackOverflow 답변 을 참고하세요.

Bash (MSYS2) 없이 Bazel 사용

Bash 없이 bazel build 사용

1.0 이전 버전의 Bazel에서는 일부 규칙을 빌드하는 데 Bash가 필요했습니다.

Bazel 1.0부터는 다음과 같은 경우를 제외하고 Bash 없이 규칙을 빌드할 수 있습니다.

  • genrule: genrule은 Bash 명령어를 실행하기 때문입니다.
  • sh_binary 또는 sh_test 규칙: 이러한 규칙에는 기본적으로 Bash가 필요하기 때문입니다.
  • ctx.actions.run_shell() 또는 ctx.resolve_command()를 사용하는 Starlark 규칙

하지만 genrule은 파일을 복사하거나 텍스트 파일을 쓰는 것과 같은 간단한 작업에 자주 사용됩니다. genrule을 사용하고 Bash에 종속되는 대신 bazel-skylib 저장소에서 적절한 규칙 을 찾을 수 있습니다 . Windows에서 빌드할 때 이러한 규칙에는 Bash가 필요하지 않습니다.

Bash 없이 bazel test 사용

1.0 이전 버전의 Bazel에서는 모든 항목을 bazel test하는 데 Bash가 필요했습니다.

Bazel 1.0부터는 다음과 같은 경우를 제외하고 Bash 없이 규칙을 테스트할 수 있습니다.

  • --run_under를 사용하는 경우
  • 테스트 규칙 자체에 Bash가 필요한 경우 (실행 파일이 셸 스크립트이기 때문)

Bash 없이 bazel run 사용

1.0 이전 버전의 Bazel에서는 모든 항목을 bazel run하는 데 Bash가 필요했습니다.

Bazel 1.0부터는 다음과 같은 경우를 제외하고 Bash 없이 규칙을 실행할 수 있습니다.

  • --run_under 또는 --script_path를 사용하는 경우
  • 테스트 규칙 자체에 Bash가 필요한 경우 (실행 파일이 셸 스크립트이기 때문)

Bash 없이 sh_binary, sh_* 규칙, ctx.actions.run_shell() 사용

sh_* 규칙을 빌드하고 테스트하려면 Bash가 필요하며 ctx.actions.run_shell()ctx.resolve_command()를 사용하는 Starlark 규칙을 빌드하고 테스트하려면 Bash가 필요합니다. 이는 프로젝트의 규칙뿐만 아니라 프로젝트가 종속된 (전이적으로도) 외부 저장소의 규칙에도 적용됩니다.

향후에는 Linux용 Windows 하위 시스템 (WSL)을 사용하여 이러한 규칙을 빌드하는 옵션이 있을 수 있지만 현재는 Bazel-on-Windows 하위팀의 우선순위가 아닙니다.

환경 변수 설정

Windows 명령 프롬프트 (cmd.exe)에서 설정하는 환경 변수는 해당 명령 프롬프트 세션에서만 설정됩니다. 새 cmd.exe를 시작하는 경우 변수를 다시 설정해야 합니다. cmd.exe가 시작될 때 항상 변수를 설정하려면 Control Panel > System Properties > Advanced > Environment Variables... 대화상자의 사용자 변수 또는 시스템 변수에 변수를 추가하면 됩니다.

Windows에서 빌드

MSVC로 C++ 빌드

MSVC로 C++ 대상을 빌드하려면 다음이 필요합니다.

  • Visual C++ 컴파일러

  • (선택사항)BAZEL_VCBAZEL_VC_FULL_VERSION 환경 변수

    Bazel은 시스템에서 Visual C++ 컴파일러를 자동으로 감지합니다. Bazel에서 특정 VC 설치를 사용하도록 하려면 다음 환경 변수를 설정하면 됩니다.

    Visual Studio 2017 및 2019의 경우 BAZEL_VC 중 하나를 설정합니다. 또한 BAZEL_VC_FULL_VERSION을 설정할 수도 있습니다.

    • BAZEL_VC Visual C++ 빌드 도구 설치 디렉터리

      set BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC
      
    • BAZEL_VC_FULL_VERSION (선택사항) Visual Studio 2017 및 2019에만 해당되며 Visual C++ 빌드 도구의 전체 버전 번호입니다. 두 개 이상의 버전이 설치된 경우 BAZEL_VC_FULL_VERSION을 통해 정확한 Visual C++ 빌드 도구 버전을 선택할 수 있습니다. 그렇지 않으면 Bazel에서 최신 버전을 선택합니다.

      set BAZEL_VC_FULL_VERSION=14.16.27023
      

    Visual Studio 2015 이하의 경우 BAZEL_VC를 설정합니다. BAZEL_VC_FULL_VERSION은 지원되지 않습니다.

    • BAZEL_VC Visual C++ 빌드 도구 설치 디렉터리

      set BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
      
  • The Windows SDK

    Windows SDK에는 Bazel 자체를 비롯하여 Windows 애플리케이션을 빌드할 때 필요한 헤더 파일과 라이브러리가 포함되어 있습니다. 기본적으로 설치된 최신 Windows SDK가 사용됩니다. BAZEL_WINSDK_FULL_VERSION을 설정하여 Windows SDK 버전을 지정할 수도 있습니다. 전체 Windows 10 SDK 번호(예: 10.0.10240.0)를 사용하거나 8.1을 지정하여 Windows 8.1 SDK를 사용할 수 있습니다(Windows 8.1 SDK의 버전은 하나만 제공됨). 지정된 Windows SDK가 설치되어 있는지 확인하세요.

    요구사항: VC 2017 및 2019에서 지원됩니다. 독립형 VC 2015 빌드 도구는 Windows SDK 선택을 지원하지 않습니다. 전체 Visual Studio 2015 설치가 필요합니다. 그렇지 않으면 BAZEL_WINSDK_FULL_VERSION이 무시됩니다.

    set BAZEL_WINSDK_FULL_VERSION=10.0.10240.0
    

모든 항목이 설정되면 이제 C++ 대상을 빌드할 수 있습니다.

샘플 프로젝트 중 하나에서 대상을 빌드해 보세요.

bazel build //examples/cpp:hello-world
bazel-bin\examples\cpp\hello-world.exe

기본적으로 빌드된 바이너리는 x64 아키텍처를 타겟팅합니다. ARM64 아키텍처용으로 빌드하려면 다음을 사용하세요.

--platforms=//:windows_arm64  --extra_toolchains=@local_config_cc//:cc-toolchain-arm64_windows

MODULE.bazel@local_config_cc를 도입할 수 있습니다.

bazel_dep(name = "rules_cc", version = "0.1.1")
cc_configure = use_extension("@rules_cc//cc:extensions.bzl", "cc_configure_extension")
use_repo(cc_configure, "local_config_cc")

동적 링크 라이브러리 (DLL 파일)를 빌드하고 사용하려면 이 예시를 참고하세요.

명령줄 길이 제한: Windows 명령줄 길이 제한 문제를 방지하려면 컴파일러 매개변수 파일 기능을 --features=compiler_param_file을 통해 사용 설정하세요.

Clang으로 C++ 빌드

0.29.0부터 Bazel은 LLVM의 MSVC 호환 컴파일러 드라이버 (clang-cl.exe)를 사용하여 빌드를 지원합니다.

요구사항: Clang으로 빌드하려면 모두 LLVM과 Visual C++ 빌드 도구를 설치해야 합니다. 컴파일러로 clang-cl.exe를 사용하더라도 Visual C++ 라이브러리에 연결해야 하기 때문입니다.

Bazel은 시스템에서 LLVM 설치를 자동으로 감지할 수 있습니다. 또는 BAZEL_LLVM으로 LLVM이 설치된 위치를 Bazel에 명시적으로 알릴 수 있습니다.

  • BAZEL_LLVM LLVM 설치 디렉터리

    set BAZEL_LLVM=C:\Program Files\LLVM

Clang 도구 모음을 사용 설정하려면 Bazel 버전과 Bzlmod 또는 WORKSPACE를 사용하는지 여부에 따라 구성이 달라집니다.


Bazel 8 이상:

  • Bzlmod 사용 (권장):

    1. MODULE.bazelrules_cc가 로드되어 있고 CC 도구 모음이 구성되어 있는지 확인합니다. ```python bazel_dep(name = "rules_cc", version = "0.0.17") # Or newer

      cc_configure = use_extension("@rules_cc//cc:extensions.bzl", "cc_configure_extension") use_repo(cc_configure, "local_config_cc") ```

    2. BUILD 파일 (예: 루트 BUILD 파일)에서 platform 대상을 정의합니다. python platform( name = "x64_windows-clang-cl", constraint_values = [ "@platforms//cpu:x86_64", "@platforms//os:windows", "@bazel_tools//tools/cpp:clang-cl", # Alias to the @rules_cc constraint in Bazel 8+ ], )

    3. 다음 플래그를 사용하여 도구 모음을 사용 설정합니다. bash --extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-cl

  • WORKSPACE 사용:

    1. WORKSPACE 파일에서 rules_cc 종속 항목 및 도구 모음을 로드합니다. : python load("@rules_cc//cc:repositories.bzl", "rules_cc_dependencies", "rules_cc_toolchains") rules_cc_dependencies() rules_cc_toolchains()

    2. BUILD 파일 (예: 루트 BUILD 파일)에서 platform 대상을 정의합니다. python platform( name = "x64_windows-clang-cl", constraint_values = [ "@platforms//cpu:x86_64", "@platforms//os:windows", "@bazel_tools//tools/cpp:clang-cl", # Alias to the @rules_cc constraint in Bazel 8+ ], )

    3. 다음 플래그를 사용하여 도구 모음을 사용 설정합니다. bash --extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-cl


Bazel 7:

참고: Bazel 7에서 @bazel_tools//tools/cpp:clang-cl@rules_cc 제약조건의 별칭이 아닙니다. Bazel 7에서 rules_cc와 함께 clang-cl을 올바르게 사용하려면 @rules_cc 저장소 내에서 제약조건을 참조해야 합니다. @rules_cc//cc/private/toolchain:clang-cl 라벨은 기술적으로 비공개이지만 Bazel 7에서 WORKSPACE와 Bzlmod 설정 간의 일관된 동작에 필요합니다.

  • Bzlmod 사용:

    1. Bazel 8 예시와 같이 MODULE.bazel을 설정합니다.

    2. platform 대상을 @rules_cc 비공개 제약조건을 사용하여 정의합니다. python platform( name = "x64_windows-clang-cl", constraint_values = [ "@platforms//cpu:x86_64", "@platforms//os:windows", "@rules_cc//cc/private/toolchain:clang-cl", # Necessary for Bazel 7 ], )

    3. 다음 플래그를 사용하여 도구 모음을 사용 설정합니다. bash --extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-cl

  • WORKSPACE 사용:

    1. WORKSPACE 파일에서 rules_cc 종속 항목 및 도구 모음을 로드합니다. : python load("@rules_cc//cc:repositories.bzl", "rules_cc_dependencies", "rules_cc_toolchains") rules_cc_dependencies() rules_cc_toolchains()

    2. platform 대상을 @rules_cc 비공개 제약조건을 사용하여 정의합니다. python platform( name = "x64_windows-clang-cl", constraint_values = [ "@platforms//cpu:x86_64", "@platforms//os:windows", "@rules_cc//cc/private/toolchain:clang-cl", # Necessary for Bazel 7 ], )

    3. 다음 플래그를 사용하여 도구 모음을 사용 설정합니다. bash --extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-cl


Bazel 0.29~6.x:

  • 빌드 플래그 --compiler=clang-cl로 Clang 도구 모음을 사용 설정합니다.

  • 빌드에서 --incompatible_enable_cc_toolchain_resolution 플래그를 true로 설정하는 경우 Bazel 7.0.0의 접근 방식을 사용합니다.

Bazel 0.28 이하:

  • Clang은 지원되지 않습니다.

Java 빌드

Java 대상을 빌드하려면 다음이 필요합니다.

Windows에서 Bazel은 java_binary 규칙에 대해 두 개의 출력 파일을 빌드합니다.

  • .jar 파일
  • JVM의 환경을 설정하고 바이너리를 실행할 수 있는 .exe 파일

샘플 프로젝트 중 하나에서 대상을 빌드해 보세요.

  bazel build //examples/java-native/src/main/java/com/example/myproject:hello-world
  bazel-bin\examples\java-native\src\main\java\com\example\myproject\hello-world.exe

Python 빌드

Python 대상을 빌드하려면 다음이 필요합니다.

Windows에서 Bazel은 py_binary 규칙에 대해 두 개의 출력 파일을 빌드합니다.

  • 자동 압축 해제 zip 파일
  • 자동 압축 해제 zip 파일을 인수로 사용하여 Python 인터프리터를 실행할 수 있는 실행 파일

실행 파일 (.exe 확장자)을 실행하거나 자동 압축 해제 zip 파일을 인수로 사용하여 Python을 실행할 수 있습니다.

샘플 프로젝트 중 하나에서 대상을 빌드해 보세요.

  bazel build //examples/py_native:bin
  bazel-bin\examples\py_native\bin.exe
  python bazel-bin\examples\py_native\bin.zip

Windows에서 Bazel이 Python 대상을 빌드하는 방법에 관한 자세한 내용은 이 설계 문서를 참고하세요.