代码之家  ›  专栏  ›  技术社区  ›  dimba

G++、ColorGCC和CCACHE

  •  21
  • dimba  · 技术社区  · 15 年前

    尝试着将ccache和colorgcc结合起来。跟随 link text :

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

    运行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
    

    有什么解决办法吗?

    7 回复  |  直到 7 年前
        1
  •  22
  •   Malvineous    14 年前

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

    # 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 )告诉它打电话给中央结算系统:

    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的symlinks /usr/lib/colorgcc/bin 和CCACHE的符号链接 /usr/lib/ccache/bin -相应调整。

        2
  •  16
  •   Tripp Lilley    15 年前

    简短的回答

    无需修补 colorgcc.pl 解决这个问题的最简单方法就是为每个命令编写一个简单的包装器脚本,调用 ccache 使用该命令的适当参数,并传递脚本接收到的参数(有效地 currying 呼唤 中央结算系统 )

    例如,用于 海湾合作委员会 :

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

      #!/bin/bash
      ccache /usr/bin/gcc "$@"
      
    • CyOrgCC:

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

    为了 G+ :

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

      #!/bin/bash
      ccache /usr/bin/g++ "$@"
      
    • CyOrgCC:

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

    有一些方法可以清除这个问题,使您只使用一个脚本,每个变量都有符号链接,但这些超出了这个答案的范围,我将它们作为练习留给您:—)

    长的答案

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

    • 不正确的:

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

      (即“ 中央结算系统/USR/bin/g++ “是一个单独的参数。)

    但应该这样做:

    • 对的:

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

      (即“ 中央结算系统 “和” /urr/bin /g++ 两个分开的 争论。)

    珀尔 exec 最终调用 execvp 在可能将一些“做我想说的”逻辑应用到它的论点之后。 执行程序 然后做一些自己的DWIM。Perl的 执行程序 预处理,将单个参数字符串拆分为多个参数 执行程序 预期,只有在 执行程序 接收单个参数。在 白俄罗斯 ,呼叫 执行程序 大致如下:

    exec "${program}" @ARGV
    

    在哪里? ${program} 来自您的配置(或默认值),以及 @ARGV 是您(间接)调用时传递的参数列表 白俄罗斯 . 在你的情况下, $ {程序} 字面意思是 ccache /usr/bin/g++ (如上所述的一根绳子)当它应该是公正的时候 卡切什 ,带有 /usr/bin/g++ 准备 @ ARGV .


    (有些人可能想知道为什么我费尽心思解释这个问题,因为这是一条单行线 白俄罗斯 . 这是真的,但如果我这样做,世界将失去另一个机会来了解这类错误。另外,我得不到那么多选票。)

        3
  •  0
  •   scavenger    12 年前

    快速回答

    最好不要修改任何系统文件。以下是一些变量和简单的 科尔高克 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
    
        4
  •  0
  •   Jirka    11 年前

    下面是如何修补colorgcc。问题出在

    exec $compiler, @ARGV
    

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

    $编译程序 在您的情况下是“ccache/usr/bin/g++”。我们需要改变它以便 $编译程序 是中央结算系统 和/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"};
    

    吉尔卡

        5
  •  0
  •   Jirka    11 年前

    对我来说,最好的解决办法就是这个。在Fedora上安装ccache后,我的路径如下:

    路径=/usr/lib64/ccache:/usr/local/bin:/usr/bin:/bin

    gcc命令将调用ccache二进制:

    哪一个海湾合作委员会

    /美国存托凭证/lib64/ccache/gcc

    创建呼叫链 gcc->颜色gcc->ccache->gcc

    我只需要创建以下别名:

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

    把这两行放在~/.bashrc的末尾。 你完了!无需创建符号链接或修复颜色gcc源。

    (如果使用的是bash以外的shell,则需要将别名放入相应的shell设置文件中)

    吉尔卡

        6
  •  0
  •   Community CDub    8 年前

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

    下面是指向StackOverflow的链接,其中介绍了Gilcc:

    Improving g++ output

        7
  •  0
  •   nachoparker    7 年前

    正如其他人已经说过的,这是一个建立路径和符号链接的问题。

    追随无价的 Arch guide 对此。

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

    你可以去看看 here

    简而言之,使用这个别名

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

    并且做 mmake 而不是 make

    推荐文章