(这与问题ccache and absolute path不同,因为我只希望在ccache主机上不扩展命令路径)
当使用ccache和distcc时,ccache将编译器扩展为绝对路径,然后distcc无法使用远程机器上的PATH来选择使用哪个编译器。
e.g。我调用CCACHE_PREFIX=distcc ccache g++ foo.cc
并将ccache 扩展进入本地预处理步骤并进行缓存检查,然后调用distcc作为distcc /usr/bin/g++
,这是错误的版本(g ++存在于路径中)在/ usr / bin之前的遥控器上,但这并没有让它有机会搜索路径。
我有各种不同的机器被用作distcc主机,并且它们在不同的位置安装了相同版本的gcc / g ++(是的,如果我把它们放在像/ usr / local这样的地方,这个问题就消失了,但我目前不能这样做。)
是否有设置让ccache只将g++
传递给distcc,而不是将路径扩展到本地编译器的绝对路径?如果还没有设置,我不会完全反对修补ccache,但这是最后的手段:)
答案 0 :(得分:6)
原来有一种简单的方法可以做到这一点:直接使用CCACHE_PREFIX
而不是distcc
的包装器,如下所示:
档案:distcc-wrap.sh
#!/bin/sh
compiler=$(basename $1)
shift
exec distcc "$compiler" "$@"
export CCACHE_PREFIX=distcc-wrap.sh
然后这允许远程编译器在不同的地方生活,distcc将在PATH中搜索它。
(感谢Joel在ccache邮件列表中获取此答案;有关原始邮件,请参阅http://www.mail-archive.com/ccache@lists.samba.org/msg00670.html)
答案 1 :(得分:1)
我尝试大卫的解决方案,但遇到“distcc的问题似乎已经递归调用了自己!”在distcc普通模式下。这是因为当主机distcc进行预处理(cpp)时,它将调用主机ccache,但是distcc-wrap
拦截并生成嵌套的distcc,并形成一个递归调用:
g ++ - > ccache - > distcc - > distcc-wrap - >使用g ++预处理 - > ccache - > distcc - > ....等等。
我的解决方案是使用DISTCC_CMDLIST
中的man distccd
:
<强> DISTCC_CMDLIST 强>
如果设置了环境变量DISTCC_CMDLIST,则从DISTCC_CMDLIST命名的文件中加载支持的命令列表,并拒绝提供最后一个DISTCC_CMDLIST_MATCHWORDS最后一个单词与该列表中的命令不匹配的任何命令。请参阅src / serve.c中的注释。
假设在远程计算机上你想使用/usr/local/ccache/g++
(这是/usr/bin/ccache
的simulink)进行编译,而不是使用主机扩展的绝对路径,你可以这样做:
使用以下行创建文件/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 ++。映射完成于:
在接收命令中检索编译器路径中的basename(在这种情况下为g++
)
查找DIST_CMDLIST文件以查看是否有任何行的basename等于g++
。在这种情况下,它将是/usr/local/ccache/g++
将命令覆盖到/usr/local/ccache/g++ main.cc -c
。这将调用远程服务器上的ccache。
以上只是一个示例,您可以通过将 DISTCC_CMDLIST_NUMWORDS 的值从1更改为其他值来扩展编译器映射,以执行更多操作。