如何让ccache不通过编译器的完整路径来进行distcc

时间:2011-06-06 08:51:41

标签: path absolute distcc ccache

(这与问题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,但这是最后的手段:)

2 个答案:

答案 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)进行编译,而不是使用主机扩展的绝对路径,你可以这样做:

  1. 使用以下行创建文件/path/to/.distcc/DISTCC_CMDLIST

    /usr/local/ccache/g++

  2. export DISTCC_CMDLIST=/path/to/.distcc/DISTCC_CMDLIST

  3. 重新启动distccd守护程序 distccd --no-detach -a <host IPs> --daemon

  4. 当distcc远程服务器从主机lke /usr/bin/g++ main.cc -c接收扩展命令时,会发生什么,它会将真实编译器从/ usr / bin / g ++映射到/ usr / local / ccache / g ++。映射完成于:

    1. 在接收命令中检索编译器路径中的basename(在这种情况下为g++

    2. 查找DIST_CMDLIST文件以查看是否有任何行的basename等于g++。在这种情况下,它将是/usr/local/ccache/g++

    3. 将命令覆盖到/usr/local/ccache/g++ main.cc -c。这将调用远程服务器上的ccache。

    4. 以上只是一个示例,您可以通过将 DISTCC_CMDLIST_NUMWORDS 的值从1更改为其他值来扩展编译器映射,以执行更多操作。

相关问题