尝试将ccache和colorgcc结合使用。关注link text:
运行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
任何想法如何解决?
答案 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
,并传递参数已收到脚本(有效currying对ccache
的调用。)
,例如 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:
答案 6 :(得分:0)
正如其他人已经说过的那样,这是设置路径和符号链接的问题。
关注这个宝贵的Arch guide。
我这么做了很多次,这是一个非常棘手的设置,我最终设置了一个具有正确配置的docker包装器。
您可以查看here
简而言之,请使用此别名
alias mmake='docker run --rm -v "$(pwd):/src" -t ownyourbits/mmake'
并执行mmake
而不是make