이 페이지에서는 Windows에서 Bazel을 사용하기 위한 권장사항을 설명합니다. 설치 안내는 Windows에 Bazel 설치를 참고하세요.
알려진 문제
Windows 관련 Bazel 문제는 GitHub에서 'team-Windows' 라벨로 표시됩니다. 미해결 문제는 여기에서 확인할 수 있습니다.
권장사항
긴 경로 문제 방지
MSVC 컴파일러를 비롯한 일부 도구에는 Windows의 최대 경로 길이 제한이 있습니다. 이 문제가 발생하지 않도록 하려면 --output_user_root 플래그를 사용하여 Bazel의 짧은 출력 디렉터리를 지정하면 됩니다.
예를 들어 bazelrc 파일에 다음 줄을 추가합니다.
startup --output_user_root=C:/tmp
8.3 파일 이름 지원 사용 설정
Bazel은 긴 파일 경로의 짧은 이름 버전을 만들려고 시도합니다. 하지만 이렇게 하려면 긴 경로가 있는 파일이 있는 볼륨에 8.3 파일 이름 지원이 사용 설정되어 있어야 합니다. 다음 명령어를 실행하여 모든 볼륨에서 8.3 이름 생성을 사용 설정할 수 있습니다.
fsutil 8dot3name set 0
심볼릭 링크 지원 사용 설정
일부 기능을 사용하려면 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 빌드 사용
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 테스트 사용
1.0 이전 버전의 Bazel에서는 모든 항목을 bazel test
하려면 Bash가 필요했습니다.
Bazel 1.0부터는 다음 경우를 제외하고 Bash 없이 규칙을 테스트할 수 있습니다.
--run_under
를 사용하는 경우- 테스트 규칙 자체에 Bash가 필요합니다 (실행 파일이 셸 스크립트이기 때문).
Bash 없이 bazel 실행 사용
1.0 이전 버전의 Bazel에서는 모든 항목을 bazel run
하려면 Bash가 필요했습니다.
Bazel 1.0부터는 다음 경우를 제외하고 Bash 없이 규칙을 실행할 수 있습니다.
--run_under
또는--script_path
을 사용하는 경우- 테스트 규칙 자체에 Bash가 필요합니다 (실행 파일이 셸 스크립트이기 때문).
sh바이너리 및 sh* 규칙과 Bash 없이 ctx.actions.run_shell() 사용
sh_*
규칙을 빌드하고 테스트하고 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++ 타겟을 빌드하려면 다음이 필요합니다.
(선택사항)
BAZEL_VC
및BAZEL_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
-
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 아키텍처를 타겟팅합니다. 다른 타겟 아키텍처를 지정하려면 타겟 아키텍처의 --cpu
빌드 옵션을 설정하세요.
* x64 (기본값): --cpu=x64_windows
또는 옵션 없음
* x86: --cpu=x64_x86_windows
* ARM: --cpu=x64_arm_windows
* ARM64: --cpu=arm64_windows
예를 들어 ARM 아키텍처용 타겟을 빌드하려면 다음을 실행합니다.
bazel build //examples/cpp:hello-world --cpu=x64_arm_windows
동적 링크 라이브러리 (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 0.28 이하: Clang이 지원되지 않습니다.
--incompatible_enable_cc_toolchain_resolution
가 없는 경우: 빌드 플래그--compiler=clang-cl
로 Clang 도구 체인을 사용 설정할 수 있습니다.--incompatible_enable_cc_toolchain_resolution
: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
WORKSPACE
파일에 플랫폼과 도구 모음을 등록합니다.
register_execution_platforms( ":x64_windows-clang-cl" ) register_toolchains( "@local_config_cc//:cc-toolchain-x64_windows-clang-cl", )
--incompatible_enable_cc_toolchain_resolution 플래그는 향후 Bazel 출시에서 기본적으로 사용 설정될 예정입니다. 따라서 두 번째 방법으로 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
Bazel이 Windows에서 Python 타겟을 빌드하는 방법에 관한 자세한 내용은 이 설계 문서를 참고하세요.