Fedora27下Bazel编译C++示例报错:无法创建临时文件求助
我之前在Fedora系统折腾Bazel的时候也碰到过几乎一模一样的问题,试了几个方法才搞定,给你列几个针对性的排查方向:
手动指定Bazel临时目录
系统默认的/tmp目录有时候会因为权限、tmpfs空间或者SELinux限制出问题。你可以给自己建一个专属的临时目录,让Bazel用这个目录来生成临时文件:- 先创建目录:
mkdir -p ~/bazel_temp - 编译时指定临时目录:
export TMPDIR=~/bazel_temp && bazel build //main:hello-world
要是管用的话,把export TMPDIR=~/bazel_temp加到你的~/.bashrc或者~/.zshrc里,以后就不用每次手动输了。
- 先创建目录:
检查系统/tmp目录的状态
Fedora的/tmp默认是tmpfs挂载的,先确认它的权限和剩余空间:- 查看权限:
ls -ld /tmp,正常应该显示drwxrwxrwt,保证所有用户都有读写执行的权限 - 查看剩余空间:
df -h /tmp,如果空间不够,清理掉/tmp里的过期文件,或者修改/etc/fstab里的tmpfs条目,增大size参数(比如改成tmpfs /tmp tmpfs defaults,size=4G 0 0)
- 查看权限:
排查ccache的问题
你提到修改了/.ccache/tmp的权限,但根目录下的.ccache普通用户本来就没权限写啊!应该是用户家目录下的~/.ccache才对。先试试禁用ccache编译,看是不是它的问题:bazel build --action_env=CCACHE_DISABLE=1 //main:hello-world
如果能成功,那就是ccache的锅:- 清空ccache缓存:
ccache -C - 确保家目录下的ccache目录权限正确:
chown -R $USER:$USER ~/.ccache
- 清空ccache缓存:
检查SELinux的限制
Fedora默认开着SELinux,很可能它阻止了Bazel创建临时文件。先临时关闭SELinux测试:sudo setenforce 0
然后再跑编译命令,如果成功了,就说明是SELinux策略的问题。可以给Bazel添加对应的SELinux规则:- 生成规则文件:
sudo ausearch -c 'bazel' --raw | sudo audit2allow -M my-bazel - 加载规则:
sudo semodule -i my-bazel.pp
之后再把SELinux开回去:sudo setenforce 1
- 生成规则文件:
尝试升级或重新安装Bazel
要是上面的方法都不管用,可能是你用的Bazel版本和Fedora 27兼容性不好。试试用Fedora的包管理器安装Bazel:sudo dnf install bazel
或者去Bazel官方下载适配Fedora 27的特定版本,替换掉当前的Bazel二进制。
内容的提问来源于stack exchange,提问作者modkin

