Add support for unresolved symlinks as outputs of actions.

Implemented by adding a bit to Artifact that tells if it is an unresolved symlink. In the latter case, the digest of the artifact is computed from the return value of readlink() and a little tweaking to avoid hash collisions instead of resolving the symlink and using the checksum of its eventual target.

This bit is also added to ActionInput because execution strategies also need to know it (for example, when a sandbox strategy encounters a symlink, if the symlink is unresolved, it creates it within the sandbox verbatim, otherwise, it chases it and creates a file with the same contents as the target of the symlink)

Limitations:

- Does not work with RBE (this is doable with some coding, but I'm not familiar with the code base)
- Does not work with sandboxfs or the Windows sandbox

Other than these issues, this seems to work reasonably well. In particular, action caching works as expected (and is tested)

Progress towards #9075.

RELNOTES: None.
PiperOrigin-RevId: 262950280
38 files changed
tree: 23de81eda7792de224dc4af4377296decd7c9026
  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 only rebuilds 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

Bazel is released in ‘Beta’. See the product roadmap to learn about the path toward a stable 1.0 release.