bazel: cant build with bazel and ccache

Description of the problem / feature request:

Bazel fails to build tcmalloc with message

ccache: error: Failed to create temporary file for /home/user/.ccache/tmp/string_uti.stdout: Read-only file system

Bugs: what’s the simplest, easiest way to reproduce this bug? Please provide a minimal example if possible.

I guess no special steps needed. ccache works fine, I’m able to build without using sudo with CMake, for example

What operating system are you running Bazel on?

Ubuntu 20.04

What’s the output of bazel info release?

release 3.5.0

Have you found anything relevant by searching the web?

semi-related https://github.com/bazelbuild/bazel/issues/1540 but I installed the Bazel using apt

Any other information, logs, or outputs that you want to share?

worked as expected once I ran Bazel under sudo, but I guess it is not the expected behavior let me know if you need any additional information

About this issue

  • Original URL
  • State: open
  • Created 4 years ago
  • Comments: 24 (11 by maintainers)

Most upvoted comments

It looks like this is a documentation request at this point, to clarify that users should pass --sandbox_writeable_path to enable ccache with sandboxing. Does that sound right to you?

Discovered this issue building https://github.com/ankitects/anki on my Fedora 36 system. The command I invoked was:

bazel build --sandbox_writable_path="$HOME/.ccache" --config opt wheels

and ccache complains it cannot locate gcc on the path, which is somewhat amusing. /usr/lib64/ccache/gcc does in fact exist.

The workaround for me was to explicitly define CC=/usr/bin/gcc and CXX=/usr/bin/g++ to force Bazel to not use ccache at all as per https://stackoverflow.com/a/53517061. I have tried all the steps indicated in this thread (server shutdown, and even bazel cleans between runs).

$ lsb_release --all
LSB Version:	:core-4.1-amd64:core-4.1-noarch
Distributor ID:	Fedora
Description:	Fedora release 36 (Thirty Six)
Release:	36
Codename:	ThirtySix
$ uname -sm
Linux x86_64
$ bazel version
Bazelisk version: v1.12.0
Build label: 5.2.0
Build target: bazel-out/k8-opt/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
Build time: Tue Jun 7 16:02:26 2022 (1654617746)
Build timestamp: 1654617746
Build timestamp as int: 1654617746

This feels like surprisingly brittle behaviour.

You can create config file $HOME/.bazelrc with the option, https://docs.bazel.build/versions/master/guide.html#bazelrc-syntax-and-semantics.

build --sandbox_writable_path=/home/user/.ccache

in bazel.rc should work. What does not work is using env variables, such as $HOME in .bazel.rc. https://github.com/bazelbuild/bazel/issues/10904. And env variables there never worked, as far as I remember.

worked too

In that case, what does using the sandbox writable path argument, that is --sandbox_writable_path=$HOME/.ccache do?