g ++,colorgcc和ccache

时间:2010-01-03 16:07:13

标签: gcc ccache

尝试将ccache和colorgcc结合使用。关注link text

  • my 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

任何想法如何解决?

7 个答案:

答案 0 :(得分: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

这当然只有在/usr/lib/colorgcc/bin中安装了colorgcc的符号链接且/usr/lib/ccache/bin中的ccache的符号链接 - 才会有效。

答案 1 :(得分:16)

简答

在没有修补colorgcc.pl本身的情况下,最简单的解决方法是为每个命令编写一个简单的包装脚本,使用该命令的相应参数调用ccache,并传递参数已收到脚本(有效curryingccache的调用。)

,例如 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 ++ ”是两个单独的参数。)

    < / LI>

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

exec "${program}" @ARGV

其中 ${program} 来自您的配置(或默认设置),而 @ARGV 是您传递的参数列表(间接) )调用了colorgcc.pl。在您的情况下, ${program} ,字面意思是 ccache /usr/bin/g++ (如上所述,单个字符串),当它应该只是 ccache /usr/bin/g++ 被添加到@ARGV


(你们当中有些人可能想知道为什么我在解释这个问题时遇到了麻烦,当它是对colorgcc.pl的单行修正时。这是真的,但如果我这样做,那么世界就会失去另一个了解这类错误的机会。另外,我不会得到那么多的选票。)

答案 2 :(得分:0)

快速回答

最好不要修改任何系统文件。这里有一些变数&amp;一个简单的 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

答案 3 :(得分: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"};

日尔卡

答案 4 :(得分:0)

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

  

PATH =的/ usr / lib64下/ ccache的:在/ usr / local / bin中:在/ usr / bin中:/ bin中

和gcc命令将调用ccache binary:

  

哪个gcc

     

的/ usr / lib64下/ ccache的/ GCC

创建一个调用链 gcc - &gt; color-gcc - &gt; ccache - &gt; GCC

我只需要创建以下别名:

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

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

(如果您使用的是除BASH之外的其他shell,则需要将别名放入相应的shell设置文件中)

日尔卡

答案 5 :(得分:0)

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

这里是stackoverflow的链接,讨论GilCC:

Improving g++ output

答案 6 :(得分:0)

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

关注这个宝贵的Arch guide

我这么做了很多次,这是一个非常棘手的设置,我最终设置了一个具有正确配置的docker包装器。

您可以查看here

简而言之,请使用此别名

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

并执行mmake而不是make