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일부터 MSYS2 셸, Git Bash, Cygwin 또는 기타 Bash 변형에서 bash로 Bazel을 실행하지마세요. 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 버전을 지정할 수도 있습니다. 10.0.10240.0과 같은 전체 Windows 10 SDK 번호를 사용하거나 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

C++ 빌드를 위한 Clang 도구 모음을 사용 설정하는 데는 몇 가지 상황이 있습니다.

  • Bazel 7.0.0 이상: BUILD file에 플랫폼 대상을 추가합니다 (예: 최상위 BUILD 파일).

    platform(
        name = "x64_windows-clang-cl",
        constraint_values = [
            "@platforms//cpu:x86_64",
            "@platforms//os:windows",
            "@bazel_tools//tools/cpp:clang-cl",
        ],
    )
    

    그런 다음 다음 빌드 플래그를 지정하여 Clang 도구 모음을 사용 설정합니다.

    --extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-cl
    
  • Bazel 7.0.0 이전 버전이지만 0.28보다 최신 버전: 빌드 플래그 --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 대상을 빌드하는 방법에 관한 자세한 내용은 이 설계 문서를 참고하세요.