106

私は次のことをしたいと思います: CCache が PATH に存在する場合は、コンパイルに "ccache g++" を使用し、それ以外の場合は g++ を使用します。を含む小さな my-cmake スクリプトを書いてみました

    CC="ccache gcc" CXX="ccache g++" cmake $*

しかし、うまくいかないようです (make を実行しても ccache は使用されません。CMAKE_VERBOSE_MAKEFILE をオンにして確認しました)。

アップデート:

このリンクに従って、スクリプトを次のように変更しようとしました

     cmake -D CMAKE_CXX_COMPILER="ccache" -D CMAKE_CXX_COMPILER_ARG1="g++" -D CMAKE_C_COMPILER="ccache" -D CMAKE_C_COMPILER_ARG1="gcc" $*

しかし、cmake は、コンパイラの ccache を使用するとテストが失敗したと不平を言います (これは予想されることです)。

4

9 に答える 9

132

CMAKE 3.4以降、次のことができます:

-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
于 2016-06-15T07:19:31.613 に答える
111

コンパイル コマンドとリンク コマンドのランチャーとして ccache を指定できるようになりました (cmake 2.8.0 以降)。これは、Makefile と Ninja ジェネレーターで機能します。これを行うには、次のプロパティを設定するだけです:

find_program(CCACHE_FOUND ccache)
if(CCACHE_FOUND)
    set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
    set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache) # Less useful to do it for linking, see edit2
endif(CCACHE_FOUND)

これらのプロパティを特定のディレクトリまたはターゲットに対してのみ設定することもできます。

Ninja の場合、これはバージョン 3.4 以降で可能です。XCode については、Craig Scott が回答で回避策を示しています。

編集: uprego と Lekensteyn のコメントのおかげで、回答を編集して、ccache をランチャーとして使用する前に使用できるかどうか、およびコンパイル ランチャーを使用できるジェネレーターを確認しました。

Edit2:@Emilio Cobosは、ccacheはリンク速度を向上させず、sccacheなどの他のタイプのキャッシュを台無しにする可能性があるため、リンク部分でそれを行うことを避けることを推奨しました

于 2014-06-19T11:48:08.670 に答える
72

私は個人的/usr/lib/ccacheに私の中に持ってい$PATHます。gccこのディレクトリには、コンパイラが呼び出される可能性のあるすべての名前 (や など)のシンボリック リンクが多数含まれておりgcc-4.3、すべて ccache を指しています。

そして、シンボリックリンクも作成しませんでした。Debian に ccache をインストールすると、そのディレクトリが事前に入力されます。

于 2009-12-23T17:21:12.157 に答える
11

CMake 3.1 から、Xcode ジェネレーターで ccache を使用することが可能になり、Ninja は CMake 3.4 以降でサポートされます。Ninja はRULE_LAUNCH_COMPILEUnix Makefiles ジェネレーターと同じように尊重します (したがって、@Babcool の答えは Ninja にも対応します) が、Xcode ジェネレーターで ccache を機能させるには、もう少し作業が必要です。次の記事では、3 つの CMake ジェネレーターすべてで機能する一般的な実装に焦点を当て、ccache シンボリック リンクの設定や使用される基になるコンパイラーについての仮定を行わずに、メソッドを詳細に説明します (それでも CMake にコンパイラーを決定させます)。

https://crascit.com/2016/04/09/using-ccache-with-cmake/

記事の大まかな要旨は以下の通りです。ファイルの先頭は、次のCMakeLists.txtように設定する必要があります。

cmake_minimum_required(VERSION 2.8)

find_program(CCACHE_PROGRAM ccache)
if(CCACHE_PROGRAM)
    # Support Unix Makefiles and Ninja
    set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}")
endif()

project(SomeProject)

get_property(RULE_LAUNCH_COMPILE GLOBAL PROPERTY RULE_LAUNCH_COMPILE)
if(RULE_LAUNCH_COMPILE AND CMAKE_GENERATOR STREQUAL "Xcode")
    # Set up wrapper scripts
    configure_file(launch-c.in   launch-c)
    configure_file(launch-cxx.in launch-cxx)
    execute_process(COMMAND chmod a+rx
                            "${CMAKE_BINARY_DIR}/launch-c"
                            "${CMAKE_BINARY_DIR}/launch-cxx")

    # Set Xcode project attributes to route compilation through our scripts
    set(CMAKE_XCODE_ATTRIBUTE_CC         "${CMAKE_BINARY_DIR}/launch-c")
    set(CMAKE_XCODE_ATTRIBUTE_CXX        "${CMAKE_BINARY_DIR}/launch-cxx")
    set(CMAKE_XCODE_ATTRIBUTE_LD         "${CMAKE_BINARY_DIR}/launch-c")
    set(CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS "${CMAKE_BINARY_DIR}/launch-cxx")
endif()

2 つのスクリプト テンプレート ファイルは次のようにlaunch-c.inなります (ファイルとlaunch-cxx.in同じディレクトリにある必要がありCMakeLists.txtます)。

起動-c.in:

#!/bin/sh
export CCACHE_CPP2=true
exec "${RULE_LAUNCH_COMPILE}" "${CMAKE_C_COMPILER}" "$@"

起動-cxx.in:

#!/bin/sh
export CCACHE_CPP2=true
exec "${RULE_LAUNCH_COMPILE}" "${CMAKE_CXX_COMPILER}" "$@"

上記はUnix Makefile と Ninja に対して単独で使用しますが、Xcode ジェネレーターに対しては、CMake の変数サポートRULE_LAUNCH_COMPILEの助けに依存しています。コンパイラ コマンドとリンカー コマンドを制御するユーザー定義の Xcode 属性CMAKE_XCODE_ATTRIBUTE_...の設定は、CC私が知る限り、Xcode プロジェクトの文書化された機能ではありませんが、機能しているようです。Apple によって公式にサポートされていることを誰かが確認できれば、リンクされた記事とこの回答を適宜更新します。CXXLDLDPLUSPLUS

于 2016-04-09T10:22:00.553 に答える
8

g++からへのシンボリックリンクを設定するのは好きではありませんでしたccacheCXX="ccache g++"一部のcmakeテストケースでは、属性のないコンパイラプログラムだけが必要だったため、うまくいきませんでした。

そこで、代わりに小さな bash スクリプトを使用しました。

#!/bin/bash
ccache g++ "$@"

に実行可能ファイルとして保存しました/usr/bin/ccache-g++

次に、C は cmake を/usr/bin/ccache-g++C++ コンパイラとして使用するように構成しました。このようにしてcmakeのテストケースに合格し、2、3週間で忘れてしまい、何かがうまくいかないのではないかと思うかもしれないシンボリックリンクを持つよりも快適に感じます...

于 2012-10-29T19:53:14.307 に答える
6

I verified the following works (source: this link):

        CC="gcc" CXX="g++" cmake -D CMAKE_CXX_COMPILER="ccache" -D CMAKE_CXX_COMPILER_ARG1="g++" -D CMAKE_C_COMPILER="ccache" -D CMAKE_C_COMPILER_ARG1="gcc" $*

Update: I later realized that even this does not work. Strangely it works every alternate time (the other times cmake complains).

于 2009-11-29T14:58:48.960 に答える
5

私の意見では、gcc,g++ を ccache にシンボリック リンクするのが最善の方法ですが、cmake 内で使用したい場合は、次のようにしてください。

export CC="ccache gcc" CXX="ccache g++" cmake ...
于 2009-11-30T10:25:52.747 に答える
5

前にここで言及されなかった重要な項目を 1 つ追加させてください。

ubuntu:18.04 docker イメージから最小限のビルド システムをブートストラップしているときに、インストールの順序によって違いが生じることがわかりました。

私の場合、 ccache を呼び出すと正常に機能gccしましたが、同じコンパイラの呼び出しを別の名前でキャッチできませんでした:ccc++. ccache を完全にインストールするには、最初にすべてのコンパイラがインストールされていることを確認するか、安全のために update-ccache シンボリックリンクへの呼び出しを追加する必要があります。

sudo /usr/sbin/update-ccache-symlinks
export PATH="/usr/lib/ccache/:$PATH"```

... and then (due to updated symlinks) also calls to cc and c++ get caught!
于 2018-04-13T13:04:38.820 に答える