이 페이지에서는 출력 디렉터리의 요구사항과 레이아웃을 다룹니다.
요구사항
출력 디렉터리 레이아웃 요구사항:
- 여러 사용자가 같은 상자에서 빌드하더라도 충돌하지 않습니다.
- 동시에 여러 작업공간에서 빌드할 수 있습니다.
- 동일한 작업공간에서 여러 대상 구성을 빌드할 수 있습니다.
- 다른 도구와 충돌하지 않습니다.
- 쉽게 액세스할 수 있습니다.
- 선별하여 간편하게 세척할 수 있습니다.
- 사용자가 다음으로 변경할 때 심볼릭 링크를 사용하는 경우에도 명확합니다. 이름을 지정할 수 있습니다
- 사용자당 모든 빌드 상태는 하나의 디렉터리 아래에 있어야 합니다('I'd like to 모든 클라이언트에서 모든 .o 파일을 삭제합니다.')
현재 레이아웃
현재 구현된 솔루션은 다음과 같습니다.
- Bazel은 WORKSPACE 파일( '작업공간 디렉터리') 또는 이 디렉터리의 하위 디렉터리입니다. 오류가 발생하면 그렇지 않습니다.
- Linux에서는 outputRoot 디렉터리의 기본값은
~/.cache/bazel
입니다. macOS에서는/private/var/tmp
이며, Windows에서는 설정된 경우 기본값이%HOME%
입니다. 설정된 경우 else%USERPROFILE%
, 그렇지 않은 경우 호출 결과FOLDERID_Profile
플래그가 설정된SHGetKnownFolderPath()
만약 Bazel 자체 테스트에서와 같이 환경 변수$TEST_TMPDIR
가 설정됩니다. 이 값이 기본값보다 우선 적용됩니다. - Bazel 사용자의 빌드 상태는
outputRoot/_bazel_$USER
아래에 있습니다. 이를 outputUserRoot 디렉터리라고 합니다. outputUserRoot
디렉터리 아래에는install
디렉터리가 있으며 이름이 Bazel의 MD5 해시인installBase
디렉터리입니다. 설치 매니페스트를 참조하세요.outputUserRoot
디렉터리 아래outputBase
디렉터리 작업공간의 경로 이름에 대한 MD5 해시인 이름도 생성됩니다. 를 참조하세요. 예를 들어 Bazel이 작업공간 디렉터리에서 실행 중인 경우/home/user/src/my-project
(또는 이 디렉터리에 심볼릭 링크로 연결된 디렉터리에서) 다음과 같은 출력 기본 디렉터리가 생성됩니다./home/user/.cache/bazel/_bazel_user/7ffd56a6e4cb724ea575aba15733d113
나 Bazel 작업공간에서echo -n $(pwd) | md5sum
를 실행하여 MD5를 가져올 수도 있습니다.- Bazel의
--output_base
시작 옵션을 사용하여 기본값을 재정의할 수 있습니다. 출력 기본 디렉토리에 저장합니다 예를 들면bazel --output_base=/tmp/bazel/output build x/y:z
입니다. - Bazel의
--output_user_root
시작 옵션을 사용하여 기본 설치한 사용자 및 출력 기본 디렉터리를 사용합니다. 예를 들면bazel --output_user_root=/tmp/bazel build x/y:z
입니다.
'bazel-<workspace-name>', 'bazel-out', 'bazel-testlogs'의 심볼릭 링크 및 'bazel-bin' 작업공간 디렉터리에 저장됩니다 이러한 심볼릭 링크는 타겟별 디렉터리에 있는 모든 디렉터리를 생성합니다 이러한 심볼릭 링크는 사용자의 편의를 위해서만 사용되며, Bazel 자체는 사용할 수 있습니다 또한 이는 작업공간 디렉터리에 쓰기 가능한 경우에만 실행됩니다.
레이아웃 다이어그램
디렉터리는 다음과 같이 구성됩니다.
<workspace-name>/ <== The workspace directory bazel-my-project => <...my-project> <== Symlink to execRoot bazel-out => <...bin> <== Convenience symlink to outputPath bazel-bin => <...bin> <== Convenience symlink to most recent written bin dir $(BINDIR) bazel-testlogs => <...testlogs> <== Convenience symlink to the test logs directory /home/user/.cache/bazel/ <== Root for all Bazel output on a machine: outputRoot _bazel_$USER/ <== Top level directory for a given user depends on the user name: outputUserRoot install/ fba9a2c87ee9589d72889caf082f1029/ <== Hash of the Bazel install manifest: installBase _embedded_binaries/ <== Contains binaries and scripts unpacked from the data section of the bazel executable on first run (such as helper scripts and the main Java file BazelServer_deploy.jar) 7ffd56a6e4cb724ea575aba15733d113/ <== Hash of the client's workspace directory (such as /home/user/src/my-project): outputBase action_cache/ <== Action cache directory hierarchy This contains the persistent record of the file metadata (timestamps, and perhaps eventually also MD5 sums) used by the FilesystemValueChecker. action_outs/ <== Action output directory. This contains a file with the stdout/stderr for every action from the most recent bazel run that produced output. command.log <== A copy of the stdout/stderr output from the most recent bazel command. external/ <== The directory that remote repositories are downloaded/symlinked into. server/ <== The Bazel server puts all server-related files (such as socket file, logs, etc) here. jvm.out <== The debugging output for the server. execroot/ <== The working directory for all actions. For special cases such as sandboxing and remote execution, the actions run in a directory that mimics execroot. Implementation details, such as where the directories are created, are intentionally hidden from the action. Every action can access its inputs and outputs relative to the execroot directory. <workspace-name>/ <== Working tree for the Bazel build & root of symlink forest: execRoot _bin/ <== Helper tools are linked from or copied to here. bazel-out/ <== All actual output of the build is under here: outputPath local_linux-fastbuild/ <== one subdirectory per unique target BuildConfiguration instance; this is currently encoded bin/ <== Bazel outputs binaries for target configuration here: $(BINDIR) foo/bar/_objs/baz/ <== Object files for a cc_* rule named //foo/bar:baz foo/bar/baz1.o <== Object files from source //foo/bar:baz1.cc other_package/other.o <== Object files from source //other_package:other.cc foo/bar/baz <== foo/bar/baz might be the artifact generated by a cc_binary named //foo/bar:baz foo/bar/baz.runfiles/ <== The runfiles symlink farm for the //foo/bar:baz executable. MANIFEST <workspace-name>/ ... genfiles/ <== Bazel puts generated source for the target configuration here: $(GENDIR) foo/bar.h such as foo/bar.h might be a headerfile generated by //foo:bargen testlogs/ <== Bazel internal test runner puts test log files here foo/bartest.log such as foo/bar.log might be an output of the //foo:bartest test with foo/bartest.status foo/bartest.status containing exit status of the test (such as PASSED or FAILED (Exit 1), etc) include/ <== a tree with include symlinks, generated as needed. The bazel-include symlinks point to here. This is used for linkstamp stuff, etc. host/ <== BuildConfiguration for build host (user's workstation), for building prerequisite tools, that will be used in later stages of the build (ex: Protocol Compiler) <packages>/ <== Packages referenced in the build appear as if under a regular workspace
*.runfiles 디렉터리의 레이아웃은 RunfilesSupport가 가리키는 위치에 자세히 설명되어 있습니다.
bazel clean
bazel clean
가 outputPath
및 action_cache
에서 rm -rf
를 실행합니다.
를 참조하세요. 작업공간 심볼릭 링크도 삭제됩니다. --expunge
옵션
전체 outputBase를 정리합니다