我尝试了 David 的解决方案,但遇到了“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++
(这是一个 simulink /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 文件以查看是否有任何行的 basename 等于g++
. 在这种情况下,它将是/usr/local/ccache/g++
将命令覆盖到/usr/local/ccache/g++ main.cc -c
. 这将在远程服务器上调用 ccache。
以上只是一个示例,您可以通过将DISTCC_CMDLIST_NUMWORDS的值从 1 更改为其他值来扩展编译器映射以执行更多操作。