Path 如何使ccache不将编译器的完整路径传递给distcc
(这与问题不同,因为我只希望不在ccache主机上扩展命令路径) 当同时使用ccache和distcc时,ccache将编译器扩展到一个绝对路径,然后distcc无法使用远程计算机上的路径来选择要使用的编译器 e、 g.我调用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\u PREFIX=distcc CCACHE g++foo.cc
,CCACHE将其扩展为本地预处理步骤和缓存检查,然后调用distcc asdistcc/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更改为其他值来扩展编译器映射,以执行更多操作