Path 如何使ccache不将编译器的完整路径传递给distcc

Path 如何使ccache不将编译器的完整路径传递给distcc,path,absolute,distcc,ccache,Path,Absolute,Distcc,Ccache,(这与问题不同,因为我只希望不在ccache主机上扩展命令路径) 当同时使用ccache和distcc时,ccache将编译器扩展到一个绝对路径,然后distcc无法使用远程计算机上的路径来选择要使用的编译器 e、 g.我调用CCACHE\u PREFIX=distcc CCACHE g++foo.cc,CCACHE将其扩展为本地预处理步骤和缓存检查,然后调用distcc asdistcc/usr/bin/g++,这是错误的版本(g++位于/usr/bin之前的远程路径中,但它根本没有机会搜索路

(这与问题不同,因为我只希望不在ccache主机上扩展命令路径)

当同时使用ccache和distcc时,ccache将编译器扩展到一个绝对路径,然后distcc无法使用远程计算机上的路径来选择要使用的编译器

e、 g.我调用
CCACHE\u 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\u前缀的包装器,而不是直接使用
distcc
,如下所示:

文件:distcc-wrap.sh

#!/bin/sh
compiler=$(basename $1)
shift
exec distcc "$compiler" "$@"
导出CCACHE\u PREFIX=distcc wrap.sh
,这样远程编译器就可以住在不同的地方,distcc会搜索路径来找到它


(感谢ccache邮件列表上的Joel给出了这个答案;原始消息请参阅)

我尝试了David的解决方案,但遇到了问题“distcc似乎是在distcc普通模式下递归调用的!”。这是因为当主机distcc执行预处理(cpp)时,它将调用主机ccache,但
distcc wrap
截取并生成嵌套的distcc,并形成递归调用:

g++->ccache->distcc->distcc wrap->使用g++->ccache->distcc->预处理。。。。等等

我的解决方案是使用
DISTCC\u CMDLIST
,从
man distccd

DISTCC\u CMDLIST

如果设置了环境变量DISTCC_CMDLIST,请从DISTCC_CMDLIST命名的文件中加载受支持命令的列表,并拒绝提供其最后一个DISTCC_CMDLIST_MATCHWORDS last words与该列表中某个命令的last words不匹配的任何命令。请参见src/service.c中的注释

假设在远程计算机上,您希望使用
/usr/local/ccache/g++
(这是
/usr/bin/ccache
的simulink)进行编译,而不是使用主机扩展的绝对路径,您可以这样做:

  • 使用此行创建文件
    /path/to/.distcc/distcc\u CMDLIST

    /usr/local/ccache/g++

  • export DISTCC\u CMDLIST=/path/to/.DISTCC/DISTCC\u CMDLIST

  • 重新启动distccd守护程序
    distccd--no detach-a--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\u CMDLIST\u NUMWORDS的值从1更改为其他值来扩展编译器映射,以执行更多操作