Pass absolute path to gold when using Clang

Prior to this change Bazel's C++ toolchain autoconfiguration generated
toolchain that passed `-fuse-ld=gold` when gold linker was detected.
After this change this will be `-fuse-ld=/usr/bin/ld.gold` or similar
depending on what clang reported.

Gcc will still use -fuse-ld=gold (as it doesn't accept absolute
path argument to `-fuse-ld`).

This is to make the Clang autogenerated toolchain not depend on PATH if
we can help it. Gcc is still leaking the PATH.

The leak:

1) CC is installed in a non-standard location, or is checked-in into the
   workspace.
2) CC is passed to Bazel's cc_configure, Bazel autoconfigures the
   toolchain using CC.
3) Remote worker has CC installed in the same non-standard location, or
   gets CC in action inputs.
4) If Host system has gold on its PATH (potentially to the surprise
   of the user, user might assume that since they provide CC explicitly
   only that installation is used), Bazel will autoconfigure the
   toolchain to use gold linker.
5) Remote system doesn't have gold installed, build fails.

Alternative solutions:
* Pass -B$(dirname $(which gcc)) to CC and pass empty PATH to all
  Bazel's C++ autoconfiguration commands
* Do not detect gold automatically at all, require environment variable
  to be explicitly set to enable gold

Both are backwards incompatible changes. Solution in this PR is
backwards compatible. It's also not fixing the issue for Gcc.

Closes #8580.

PiperOrigin-RevId: 256623542
1 file changed
tree: 9d716ef4aa778de9a28e3a93f247973939b7348e
  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.