6

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

当ccache和distcc一起使用时,ccache是​​把编译器扩展成绝对路径,然后distcc就不能使用远程机器上的PATH来选择使用哪个编译器了。

例如,我调用CCACHE_PREFIX=distcc ccache g++ foo.ccccache将其扩展为本地预处理步骤和缓存检查,然后调用 distcc as distcc /usr/bin/g++,这是错误的版本(g++ 位于 /usr/bin 之前的远程路径中,但这并没有给出它完全有机会搜索路径)。

我有各种不同的机器被用作 distcc 主机,它们在不同的位置安装了相同版本的 gcc/g++(是的,如果我把它们都放在像 /usr/local 这样的地方,这个问题就会消失,但我不能现在就这样做)。

是否有设置让 ccache 仅传递g++给 distcc 而不是将路径扩展到本地编译器的绝对路径?如果还没有设置,我并不完全反对修补 ccache,但这是最后的手段:)

4

2 回答 2

7

原来有一种简单的方法可以做到这一点:只需使用包装器CCACHE_PREFIX而不是distcc直接使用包装器,如下所示:

文件:distcc-wrap.sh

#!/bin/sh
compiler=$(basename $1)
shift
exec distcc "$compiler" "$@"

export CCACHE_PREFIX=distcc-wrap.sh然后这允许远程编译器位于不同的位置,并且 distcc 将在 PATH 中搜索它。

(感谢 ccache 邮件列表中的 Joel 提供此答案;有关原始消息,请参见http://www.mail-archive.com/ccache@lists.samba.org/msg00670.html )

于 2011-06-08T12:11:14.580 回答
4

我尝试了 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)来进行编译,而不是使用主机扩展的绝对路径,您可以这样做:

  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

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

  1. 在接收命令时从编译器路径中检索基本名称(g++在这种情况下)

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

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

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

于 2016-05-23T00:59:55.360 回答