21

ccache と colorgcc を組み合わせようとしています。次のリンク テキスト:

  • 私の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

それを解決する方法はありますか?

4

7 に答える 7

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 のシンボリック リンクがインストールされていて、ccache のシンボリックリンクがインストールされている場合にのみ機能します/usr/lib/ccache/bin- それに応じて調整してください。

于 2011-05-02T07:31:13.540 に答える
17

短い答え

これを修正colorgcc.plする最も簡単な方法は、コマンドごとに単純なラッパー スクリプトを作成し、ccacheそのコマンドに適切な引数を指定して呼び出し、スクリプトが受け取った引数を渡すことです (実質的に への呼び出しをカリー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++」は2 つの別個の引数です。)

Perlexecは最終的に を呼び出しexecvpます。これは、引数に「do what I mean」ロジックを適用した後です。execvp次に、独自の DWIM を実行します。単一の引数文字列を予想execされる複数の引数に分割するPerl の前処理は、単一の引数を受け取ったときにのみ開始されます。では、 への呼び出しは(おおよそ) 次のようになります。execvpexeccolorgcc.plexec

exec "${program}" @ARGV

where${program}は構成 (またはデフォルト) から取得@ARGVされ、(間接的に) を呼び出したときに渡した引数のリストですcolorgcc.pl。あなたの場合${program}は、文字通り、ccache /usr/bin/g++(上記のように単一の文字列ccache/usr/bin/g++です@ARGV


(1 行の修正であるのに、なぜわざわざこれを説明したのか不思議に思う人もいるかもしれませんcolorgcc.pl。それは本当ですが、もし私がそんなことをしたとしたら、世界はこのクラスのクラスについて学ぶ機会を失うことになります。さらに、私はそれほど多くの票を獲得できません。)

于 2010-04-28T20:08:38.617 に答える
0

私にとって最良の解決策はこれです。Fedora に ccache をインストールした後、PATH に次のように記述しました。

PATH=/usr/lib64/ccache:/usr/local/bin:/usr/bin:/bin

gcc コマンドは ccache バイナリを呼び出します。

どの gcc

/usr/lib64/ccache/gcc

呼び出しチェーンを作成するには gcc -> color-gcc -> ccache -> gcc

次のエイリアスを作成するだけです。

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

~/.bashrc の最後にこの 2 行を追加すれば完了です。シンボリック リンクを作成したり、color-gcc ソースを修正したりする必要はありません。

(BASH 以外のシェルを使用している場合は、エイリアスを適切なシェル設定ファイルに入れる必要があります)

ジルカ

于 2014-01-02T16:23:13.587 に答える
0

GCC をカラー化する別の方法があります。.bash などのシステム ファイルを編集する必要がないため、インストールがはるかに簡単だと思います。たとえば、GilCC は、警告の数、エラーの数、およびコンパイル時間を表示します。これは、ビルド時間をクリーンアップまたは改善したい場合に非常に便利です。

GilCCについて話しているstackoverflowへのリンクは次のとおりです。

g++ 出力の改善

于 2014-01-20T14:43:09.130 に答える
0

クイックアンサー

システム ファイルを変更しないことをお勧めします。ここにいくつかの変数と、コンパイルの出力をパイプする単純なcolorgccシェル関数があります。戻りコードを失いますが、本当に必要な場合は別の方法で処理できます。

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
于 2013-04-07T11:38:01.203 に答える
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"};

ジルカ

于 2013-12-19T09:51:12.030 に答える