Dav*_*ner 4 path absolute ccache distcc
(这与ccache和绝对路径的问题不同,因为我只希望在ccache主机上不扩展命令路径)
当使用ccache和distcc时,ccache将编译器扩展为绝对路径,然后distcc不能使用远程机器上的PATH来选择使用哪个编译器.
例如,我调用CCACHE_PREFIX=distcc ccache g++ foo.cc和ccache 将其扩展为本地预处理步骤和缓存检查,然后调用distcc as distcc /usr/bin/g++,这是错误的版本(g ++存在于/ usr/bin之前的远程路径中,但是这并没有给它完全搜索路径的机会).
我有各种不同的机器用作distcc主机,并且它们在不同的位置安装了相同版本的gcc/g ++(是的,如果我把它们放在像/ usr/local这样的地方,这个问题就会消失,但我不能这样做).
有没有设置让ccache只传递g++给distcc而不是将路径扩展到本地编译器的绝对路径?如果还没有设置,我不会完全反对修补ccache,但这是最后的手段:)
原来有一种简单的方法可以做到这一点:只使用包装CCACHE_PREFIX而不是distcc直接使用,如下所示:
文件:distcc-wrap.sh
#!/bin/sh
compiler=$(basename $1)
shift
exec distcc "$compiler" "$@"
Run Code Online (Sandbox Code Playgroud)
export CCACHE_PREFIX=distcc-wrap.sh 然后这允许远程编译器生活在不同的地方,distcc将搜索PATH.
(感谢Joel在ccache邮件列表中获取此答案; 有关原始邮件,请参阅http://www.mail-archive.com/ccache@lists.samba.org/msg00670.html)
我尝试了 David 的解决方案,但遇到了“distcc 似乎递归调用了自身!”的问题。在 distcc 普通模式下。这是因为当主机 distcc 进行预处理(cpp)时,它会调用主机 ccache,但distcc-wrap拦截并生成一个嵌套的 distcc,并形成递归调用:
g++ -> ccache -> distcc -> distcc-wrap -> 使用 g++ 进行预处理 -> ccache -> distcc -> .... 等等。
我的解决方案是使用DISTCC_CMDLIST, from man distccd:
DISTCC_CMDLIST
如果设置了环境变量 DISTCC_CMDLIST,则从 DISTCC_CMDLIST 命名的文件中加载支持的命令列表,并拒绝提供最后一个 DISTCC_CMDLIST_MATCHWORDS 最后单词与该列表中命令的单词不匹配的任何命令。请参阅 src/serve.c 中的注释。
假设在远程计算机上您想要使用/usr/local/ccache/g++(这是 simulink to /usr/bin/ccache)进行编译,而不是使用主机扩展的绝对路径,您可以这样做:
/path/to/.distcc/DISTCC_CMDLIST使用此行创建一个文件:
/usr/local/ccache/g++
export DISTCC_CMDLIST=/path/to/.distcc/DISTCC_CMDLIST
重新启动 distccd 守护进程
distccd --no-detach -a <host IPs> --daemon
每当 distcc 远程服务器从主机 lke 接收到扩展命令时/usr/bin/g++ main.cc -c,它就会将真正的编译器从 /usr/bin/g++ 映射到 /usr/local/ccache/g++ 。映射是通过以下方式完成的:
在接收命令时从编译器路径检索基本名称(g++在本例中)
查找 DIST_CMDLIST 文件以查看是否有任何行的基本名称等于g++。在这种情况下,它将是/usr/local/ccache/g++
将命令覆盖为/usr/local/ccache/g++ main.cc -c. 这将调用远程服务器上的 ccache。
上面只是一个示例,您可以通过将DISTCC_CMDLIST_NUMWORDS的值从 1 更改为其他值来扩展编译器映射,以实现更多技巧。
| 归档时间: |
|
| 查看次数: |
1749 次 |
| 最近记录: |