Fix treatment of symlinks directories that exist above output files. This condition never arises in a clean build, but may arise on incremental builds in which output artifacts from the first build become part of the directory hierarchy of an output file in the second builds.

The existing checks were insufficient for two primary reasons:
1. The fast path that creates output directories is not sensitive to symlinks. If a/b/c exists, where b is a symlink, the check happily reports that "a/b/c" is a directory.
2. The recovery path previously did the walk upwards from the output directory, stopping when it found a directory. Again, this fails to handle upward symlinks.

A cache is introduced to mitigate the additional system calls here.

An alternative approach would be to perform the symlink checks along with the artifact prefix conflict checks. These checks are done only when necessary (eg, when any configured targets are analyzed / re-analyzed). It would be nice to limit the cases in which we do the new symlink checks, but this is unsound in the face of external edits to the output tree. Blaze is sound in all other such mutations to the output tree, so I've attempted to maintain our correctness contract here.

RELNOTES: None
PiperOrigin-RevId: 284052424
3 files changed
tree: fb4f5c24a54c1bb8997260c8326c81b6d1a60746
  1. .bazelci/
  2. examples/
  3. scripts/
  4. site/
  5. src/
  6. third_party/
  7. tools/
  8. .bazelrc
  9. .gitattributes
  10. .gitignore
  11. AUTHORS
  12. BUILD
  13. CHANGELOG.md
  14. CODEOWNERS
  15. combine_distfiles.py
  16. combine_distfiles_to_tar.sh
  17. compile.sh
  18. CONTRIBUTING.md
  19. CONTRIBUTORS
  20. distdir.bzl
  21. ISSUE_TEMPLATE.md
  22. LICENSE
  23. README.md
  24. WORKSPACE
README.md

Bazel

{Fast, Correct} - Choose two

Build and test software of any size, quickly and reliably.

  • Speed up your builds and tests: Bazel rebuilds only what is necessary. With advanced local and distributed caching, optimized dependency analysis and parallel execution, you get fast and incremental builds.

  • One tool, multiple languages: Build and test Java, C++, Android, iOS, Go, and a wide variety of other language platforms. Bazel runs on Windows, macOS, and Linux.

  • Scalable: Bazel helps you scale your organization, codebase, and continuous integration solution. It handles codebases of any size, in multiple repositories or a huge monorepo.

  • Extensible to your needs: Easily add support for new languages and platforms with Bazel's familiar extension language. Share and re-use language rules written by the growing Bazel community.

Getting Started

Documentation

Contributing to Bazel

See CONTRIBUTING.md

Build status