CMakeでCCacheを使用する方法は?


93

次のことを行います。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
gccをccacheにシンボリックリンクしてみませんか?あなたがこれを配布している場合と、私は...彼はccacheのがインストールされ、それが使用されることを望んでいた場合は、ユーザー自身がシンボリックリンクを行っているだろうと思うだろう
INT3

1
@ int3はい、おそらくそれでうまくいくでしょう(ccacheがオプションの引数としてコンパイラを持っていることに気づいていませんでした)。ただし、より明確にする方がクリーンです。
amit

回答:


69

私は個人的/usr/lib/ccacheに私の中に持ってい$PATHます。このディレクトリには、コンパイラは(などから呼び出すことができ、すべての可能な名前のためのシンボリックリンクの負荷が含まれていますgccし、gcc-4.3)、すべてccacheを指しています。

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


11
このccacheパスは、実際のコンパイラが機能するパスのに配置する必要があることに注意してください$PATH。のようなものexport PATH = /usr/lib/ccache:$PATH
Gui13 2011

6
@ Gui13:PATHを更新するよりも、cmakeに使用するgccの場所を明示的に指示することをお勧めします。例:cmake -DCMAKE_CXX_COMPILER = / usr / lib / ccache / bin / g ++
cib 2014

3
brew install ccache、私は持ってい/usr/local/Cellar/ccache/3.2.1/libexec/ます。
cdunn2001 2015年

98

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

-DCMAKE_CXX_COMPILER_LAUNCHER=ccache

1
そして-DCMAKE_CXX_COMPILER_LAUNCHER=ccache。これらは美しく機能します!cmakeがclangからで/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ccはなくから(シンボリックリンクのトリックが機能しない)を見つけることを主張する理由はわかりません$PATHが、とにかくあなたの答えは機能します。
cdunn2001 2017年

2
これが最良の答えです。パス変数とコンパイラのシンボリックリンクをいじる必要はもうありません!
ilyab。

1
これを試しましたが、「ccache:error:Recursive invocation(ccacheバイナリの名前は「ccache」である必要があります)」というエラーが表示されます。詳細なトレースを見ると、 "は/ usr / local /ビン/ ccacheのccacheのは/ usr / binに/ C ++" ...実行しようとしている
クリス・ドッド

3
RULE_LAUNCH_COMPILEとどのように相互作用しますか?
Trass3r

98

コンパイルコマンドとリンクコマンドのランチャーとして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の場合、CraigScottは彼の回答で回避策を示しています。

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

Edit2:@Emilio Cobosは、ccacheがリンク速度を改善せず、sccacheのような他のタイプのキャッシュを台無しにする可能性があるため、リンク部分に対してこれを行わないようにすることをお勧めします


多くのサイトはfind_program(CCACHE_FOUND "ccache")、のように二重引用符を使用して暗黙的にアドバイスしています。どちらがよりポータブルかはわかりません。私のマイレージは、二重引用符を必要とせずに完全にうまくいきました。
1737973 2015年

5
これは現在、Makefileジェネレーターでのみ機能することに注意してください(cmake 3.3.2以降)。のマニュアルページを参照してくださいcmake-properties
Lekensteyn 2015年

1
これがCTEST_USE_LAUNCHERS設定と競合することは注目に値します。これらのプロパティは、あまりにもここで設定されていますgithub.com/Kitware/CMake/blob/master/Modules/...
purpleKarrot

コードをこれ に変更することをお勧めします(ただし、内部からテキストを削除するendif()場合を除く)。改善点は次のとおりです。1。無効にする構成オプションがあります。2。この方法で使用すると、[バックエンドの作成]のGCC / Clangから色が消えます。ninjaバックエンドは追加することで回避しています-fdiagnostics-color、それがためにそうすることをお勧めですので、オプションをmakeあまりにもバックエンド。
ハイエンジェル

10

CMake 3.1から、Xcodeジェネレーターでccacheを使用することが可能になり、忍者はCMake3.4以降でサポートされます。NinjaはRULE_LAUNCH_COMPILEUnixMakefilesジェネレーターと同じように尊重します(したがって、@ 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}" "$@"

launch-cxx.in:

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

上記はRULE_LAUNCH_COMPILEUnixMakefileとNinjaに単独で使用しますが、XcodeジェネレーターにはCMakeのCMAKE_XCODE_ATTRIBUTE_...変数サポートの助けに依存しています。設定CCおよびCXXユーザ定義のXcodeは、コンパイラのコマンドを制御するための属性とLDし、LDPLUSPLUSリンカのコマンドについては、私の知る限り、Xcodeプロジェクトの文書化機能ではありませんが、それが動作するようには思えません。誰かがそれがAppleによって公式にサポートされていることを確認できたら、リンクされた記事とこの回答をそれに応じて更新します。


set(CMAKE_XCODE_ATTRIBUTE_LD "${CMAKE_C_COMPILER}") set(CMAKE_XCODE_ATTRIBUTE_LDPLUSPLUS "${CMAKE_CXX_COMPILER}")言及された記事からも必要でした。
ジョーンReimerdes

リマインダーをありがとう、私はLDとLDPLUSPLUSの設定を含むように答えを更新しました。
クレイグスコット

ccacheはVSコンパイラをサポートしていないため、そのために使用することはできません。VSに同じ機能を提供することを目的としたclcacheというプロジェクトがありますが、それがどれほどうまく機能するかについてはコメントできません。
クレイグスコット

9

からg++へのシンボリックリンクを設定するのは好きではありませんでしたccache。そしてCXX="ccache g++"、いくつかのcmakeテストケースが属性のないコンパイラプログラムだけを持ちたいと思ったので、私にはうまくいきませんでした。

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

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

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

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


5

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

export CC="ccache gcc" CXX="ccache g++" cmake ...

5

私は次の作品を検証しました(出典:このリンク):

        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" $*

更新:後で、これでも機能しないことに気づきました。不思議なことに、それは毎回機能します(他の時間はcmakeが文句を言います)。


4

ここで言及されていなかった重要な項目を1つ追加します。

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

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

sudo apt-get install ccache build-essential # and everyhting ... sudo /usr/sbin/update-ccache-symlinks export PATH="/usr/lib/ccache/:$PATH"

...そして(シンボリックリンクが更新されたため)ccとc ++の呼び出しもキャッチされます!


知らなかったおかげで、プロジェクトのスクリプトを使用してリンクをupdate-ccache-symlinks作成c++していましたが、別のプロジェクトでは機能していませんでした(理由はわかりませんが、リンクは問題ありませんでした)update-ccache-symlinks
アレックス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.