试图把ccache和colorgcc结合起来。跟随链接文本
运行g++时--版本接收:
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有什么办法解决吗?
发布于 2011-05-02 07:31:13
刚刚遇到了同样的问题。对我来说,这个问题可以通过仔细设置环境变量来解决:
# 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中安装了彩色and的符号链接,在/usr/lib/ccache/bin中安装了ccache的符号链接时,才能这样做--相应地进行调整。
发布于 2010-04-28 20:08:38
简短的回答
在不修补colorgcc.pl本身的情况下,最简单的修复方法是为每个命令编写一个简单的包装脚本,使用该命令的适当参数调用ccache,并传递脚本收到的参数(实际上是竞逐对ccache的调用)。
例如,gcc
以及g++
有一些方法可以使您只使用单个脚本,每个变体都有符号链接,但这些都超出了这个答案的范围,我把它们留给您作为摘录:-)
长篇大论
问题是,脚本将prefs文件中冒号右侧的所有内容视为传递给exec的“命令”,而不是“命令”和额外的“参数”。也就是说,在您的例子中,脚本最终会尝试这样做:
但它应该这样做:
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的一行修复。这是真的,但如果我这么做了,这个世界就会失去另一个学习这类错误的机会。另外,我不会得到那么多的选票。)
发布于 2013-04-07 11:38:01
快速回答
最好不要修改任何系统文件。下面是一些变量&一个简单的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 | colorgcchttps://stackoverflow.com/questions/1995415
复制相似问题