首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >g++,colorgcc和ccache

g++,colorgcc和ccache
EN

Stack Overflow用户
提问于 2010-01-03 16:07:12
回答 7查看 11.5K关注 0票数 22

试图把ccache和colorgcc结合起来。跟随链接文本

  • 我的g++是到彩色g++的软链接。
  • ~/..colorgccrc包含一行:"g++:ccache /usr/bin/g++“

运行g++时--版本接收:

代码语言:javascript
复制
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

有什么办法解决吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-05-02 07:31:13

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

代码语言:javascript
复制
# 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:

代码语言:javascript
复制
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的符号链接时,才能这样做--相应地进行调整。

票数 23
EN

Stack Overflow用户

发布于 2010-04-28 20:08:38

简短的回答

在不修补colorgcc.pl本身的情况下,最简单的修复方法是为每个命令编写一个简单的包装脚本,使用该命令的适当参数调用ccache,并传递脚本收到的参数(实际上是竞逐ccache的调用)。

例如,gcc

  • /usr/local/bin/ccache-gcc.sh: #/bin/ /usr/bin/gcc "$@“
  • ~/.colorgcc: gcc: /usr/local/bin/ccache-gcc.sh

以及g++

  • /usr/local/bin/ccache-g++.sh: #/bin//usr/bin/g+ "$@“
  • ~/.colorgcc: gcc: /usr/local/bin/ccache-g++..sh

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

长篇大论

问题是,脚本将prefs文件中冒号右侧的所有内容视为传递给exec的“命令”,而不是“命令”和额外的“参数”。也就是说,在您的例子中,脚本最终会尝试这样做:

  • 不正确: exec "ccache /usr/bin/g++“--版本 (即"ccache /usr/bin/g++“是一个参数)。

但它应该这样做:

  • 正确: exec "ccache“"/usr/bin/g++”--版本 (也就是说,“"/usr/bin/g++”ccache“和ccache是两个独立的参数。)

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

代码语言:javascript
复制
exec "${program}" @ARGV

${program}来自您的配置(或默认设置),而@ARGV是您(间接)调用colorgcc.pl时传递的参数列表。在您的示例中,${program}实际上是ccache /usr/bin/g++ (正如上面所指出的,它是一个字符串),而它应该只是ccache,,而/usr/bin/g++被放在@ARGV的前面。

(你们中的一些人可能想知道,为什么我会费尽心思来解释这个问题,因为这是colorgcc.pl的一行修复。这是真的,但如果我这么做了,这个世界就会失去另一个学习这类错误的机会。另外,我不会得到那么多的选票。)

票数 17
EN

Stack Overflow用户

发布于 2013-04-07 11:38:01

快速回答

最好不要修改任何系统文件。下面是一些变量&一个简单的colorgcc shell函数,用于引导编译的输出。您可以释放返回代码,但是如果您真的需要它,您可以以不同的方式处理它。

代码语言:javascript
复制
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; '
    }

像这样使用它:

代码语言:javascript
复制
./configure | tee -a yourlog.configure.log | colorgcc
make | tee -a yourlog.make.log | colorgcc
make install | tee -a yourlog.install.log | colorgcc
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1995415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档