21

试图结合 ccache 和 colorgcc。以下链接文字

  • 我的 g++ 是到 colorgcc 的软链接
  • ~/.colorgccrc 包含行:“g++: ccache /usr/bin/g++”

运行 g++ --version 时收到:

Can't exec "ccache  /usr/bin/gcc": No such file or directory at /usr/lib/perl5/5.8.8/IPC/Open3.pm line 246.
open3: exec of ccache  /usr/bin/gcc --version failed at /usr/local/bin/colorgcc/gcc line 208

任何想法如何解决它?

4

7 回答 7

22

刚刚遇到同样的问题。对我来说,这个问题可以通过仔细设置环境变量来解决:

# Make "g++" command call colorgcc
export PATH="/usr/lib/colorgcc/bin:$PATH"

# Tell ccache to invoke compilers in /usr/bin
export CCACHE_PATH="/usr/bin"

然后我所要做的就是编辑 colorgcc 的配置文件(/etc/colorgcc/colorgcc~/.colorgcc)并告诉它调用 ccache:

g++: /usr/lib/ccache/bin/g++
gcc: /usr/lib/ccache/bin/gcc
c++: /usr/lib/ccache/bin/g++
cc:  /usr/lib/ccache/bin/gcc
g77: /usr/lib/ccache/bin/g77
f77: /usr/lib/ccache/bin/g77
gcj: /usr/lib/ccache/bin/gcj

这当然只有在您安装了 colorgcc 的符号链接/usr/lib/colorgcc/bin和 ccache 的符号链接时才有效/usr/lib/ccache/bin- 相应地进行调整。

于 2011-05-02T07:31:13.540 回答
17

简短的回答

在不修补colorgcc.pl自身的情况下,解决此问题的最简单方法是为每个命令编写一个简单的包装脚本,使用该命令ccache的适当参数调用,并传递脚本接收到的参数(有效地将调用curryccache.)

例如,对于gcc

  • /usr/local/bin/ccache-gcc.sh:

    #!/bin/bash
    ccache /usr/bin/gcc "$@"
    
  • 〜/ .colorgcc:

    gcc: /usr/local/bin/ccache-gcc.sh
    

对于g++

  • /usr/local/bin/ccache-g++.sh:

    #!/bin/bash
    ccache /usr/bin/g++ "$@"
    
  • 〜/ .colorgcc:

    gcc: /usr/local/bin/ccache-g++.sh
    

有一些方法可以清理它,以便您只使用一个脚本,每个变体都有符号链接,但这些超出了这个答案的范围,我把它们留给你作为练习:-)

长答案

问题是该脚本将 prefs 文件中冒号右侧的所有内容视为传递给 exec 的“命令”,而不是“命令”和额外的“参数”。即,在您的情况下,脚本最终尝试执行此操作:

  • 不正确:

    exec "ccache /usr/bin/g++" "--version"
    

    (即,“ ccache /usr/bin/g++ ”是单个参数。)

但它应该这样做:

  • 正确的:

    exec "ccache" "/usr/bin/g++" "--version"
    

    (即,“ ccache ”和“ /usr/bin/g++ ”是两个独立的参数。)

Perlexec最终调用execvp,在可能对其参数应用一些“按我的意思做”逻辑之后。execvp然后做一些自己的DWIM。Perl 的exec预处理将单个参数字符串拆分为execvp期望的多个参数,仅在exec接收到单个参数时才会启动。在colorgcc.pl中,调用exec看起来像这样(大致):

exec "${program}" @ARGV

where${program}来自您的配置(或默认值),并且@ARGV是您(间接)调用时传递的参数列表colorgcc.pl。在你的情况下${program},从字面上看,是ccache /usr/bin/g++(一个单一的字符串,如上所述,)当它应该只是ccache/usr/bin/g++并被添加到@ARGV.


(你们中的一些人可能想知道,当它是对colorgcc.pl.错误。另外,我不会得到那么多选票。)

于 2010-04-28T20:08:38.617 回答
0

快速回答

最好不要修改任何系统文件。这是一些变量和一个简单的colorgcc shell 函数,用于管道输出编译的输出。您丢失了返回代码,但如果您真的需要它,您可以以不同的方式处理它。

n=$(tput setaf 0)
r=$(tput setaf 1)
g=$(tput setaf 2)
y=$(tput setaf 3)
b=$(tput setaf 4)
m=$(tput setaf 5)
c=$(tput setaf 6)
w=$(tput setaf 7)
N=$(tput setaf 8)
R=$(tput setaf 9)
G=$(tput setaf 10)
Y=$(tput setaf 11)
B=$(tput setaf 12)
M=$(tput setaf 13)
C=$(tput setaf 14)
W=$(tput setaf 15)
END=$(tput sgr0)

colorgcc()
    {
    perl -wln -M'Term::ANSIColor' -e '
    m/not found$/ and print "$ENV{N}$`$ENV{END}", "$&", "$ENV{END}"
    or
    m/found$/ and print "$ENV{N}$`${g}", "$&", "$ENV{END}"
    or
    m/yes$/ and print "$ENV{N}$`${g}", "$&", "$ENV{END}"
    or
    m/no$/ and print "$ENV{N}$`$ENV{END}", "$&", "$ENV{END}"
    or
    m/undefined reference to/i and print "$ENV{r}", "$_", "$ENV{END}"
    or
    m/ Error |error:/i and print "$ENV{r}", "$_", "$ENV{END}"
    or
    m/ Warning |warning:/i and print "$ENV{y}", "$_", "$ENV{END}"
    or
    m/nsinstall / and print "$ENV{c}", "$_", "$ENV{END}"
    or
    m/Linking |\.a\b/ and print "$ENV{C}", "$_", "$ENV{END}"
    or
    m/Building|gcc|g\+\+|\bCC\b|\bcc\b/ and print "$ENV{N}", "$_", "$ENV{END}"
    or
    print; '
    }

像这样使用它:

./configure | tee -a yourlog.configure.log | colorgcc
make | tee -a yourlog.make.log | colorgcc
make install | tee -a yourlog.install.log | colorgcc
于 2013-04-07T11:38:01.203 回答
0

这是修补 colorgcc 的方法。问题在于

exec $compiler, @ARGV

$compiler_pid = open3('<&STDIN', \*GCCOUT, '', $compiler, @ARGV);

$compiler在您的情况下是“ccache /usr/bin/g++”。我们需要更改它,以便 $compiler是 ccache 并且 /usr/bin/g++ 被添加到@ARGV

线后

$progName = $1 || $0;

做以下修改:

$shell_command = $compilerPaths{$progName} || $compilerPaths{"gcc"};
@shell_array = split(' ',$shell_command);
$compiler = shift @shell_array;
if ( scalar (@shell_array) > 0 ) {
  unshift (@ARGV, @shell_array);
}

更换线路

$compiler = $compilerPaths{$progName} || $compilerPaths{"gcc"};

吉尔卡

于 2013-12-19T09:51:12.030 回答
0

对我来说,最好的解决方案是这个。在 Fedora 上安装 ccache 后,我的 PATH 中有以下内容:

PATH=/usr/lib64/ccache:/usr/local/bin:/usr/bin:/bin

gcc 命令将调用 ccache 二进制文件:

哪个 gcc

/usr/lib64/ccache/gcc

创建调用链 gcc -> color-gcc -> ccache -> gcc

我只需要创建以下别名:

alias gcc="color-gcc"
alias g++="color-gcc"

将这两行放在 ~/.bashrc 的末尾就完成了!无需创建符号链接或修复 color-gcc 源。

(如果您使用 BASH 以外的其他 shell,则需要将别名放入适当的 shell 设置文件中)

吉尔卡

于 2014-01-02T16:23:13.587 回答
0

还有另一种为 GCC 着色的方法,我认为它更容易安装,因为您不必编辑任何系统文件,例如 .bash 此外,它基于 Ruby,允许使用 Ruby gem 进行广泛的自定义。例如,GilCC 显示警告数、错误数和编译时间,当您想要清理或改进构建时间时非常方便。

这是讨论 GilCC 的 stackoverflow 的链接:

改善 g++ 输出

于 2014-01-20T14:43:09.130 回答
0

正如其他人已经说过的,这是设置路径和符号链接的问题。

遵循宝贵的Arch 指南

我这样做了很多次,而且设置如此棘手,以至于我最终设置了一个具有正确配置的 docker 包装器。

你可以在这里查看

简而言之,使用这个别名

alias mmake='docker run --rm -v "$(pwd):/src" -t ownyourbits/mmake'

并做mmake而不是make

于 2017-06-24T22:40:24.697 回答