web-dev-qa-db-ja.com

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

私は次のことをしたいと思います: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の使用でテストが失敗したという不満を述べます(これは予想できます)。

80
amit

個人的には/usr/lib/ccache私の$PATH。このディレクトリには、コンパイラを呼び出すことができるあらゆる名前のシンボリックリンクが含まれています(gccgcc-4.3)、すべてccacheを指します。

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

62
Nicolás

コンパイルコマンドとリンクコマンドのランチャーとして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)
endif(CCACHE_FOUND)

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

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

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

83
Babcool

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

-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
69
Jacob

CMake 3.1から、Xcodeジェネレーターでccacheを使用することが可能になり、CMake 3.4以降ではNinjaがサポートされます。 Ninjaは、Unix Makefilesジェネレーターと同じようにRULE_LAUNCH_COMPILEを尊重します(したがって、@ 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ファイルと同じディレクトリにある必要があります)。

launch-c.in:

#!/bin/sh
export CCACHE_CPP2=true
exec "${RULE_LAUNCH_COMPILE}" "${CMAKE_C_COMPILER}" "[email protected]"

launch-cxx.in:

#!/bin/sh
export CCACHE_CPP2=true
exec "${RULE_LAUNCH_COMPILE}" "${CMAKE_CXX_COMPILER}" "[email protected]"

上記はUnix MakefileとNinjaに対してRULE_LAUNCH_COMPILEのみを使用しますが、XcodeジェネレーターはCMakeのCMAKE_XCODE_ATTRIBUTE_...変数サポートからのヘルプに依存しています。コンパイラコマンドを制御するCCおよびCXXユーザー定義のXcode属性の設定と、リンカコマンドのLDおよびLDPLUSPLUSの設定は、今のところそうではありません私が言うことができるように、Xcodeプロジェクトの文書化された機能ですが、それはうまくいくようです。 Appleによって公式にサポートされていることを誰でも確認できる場合は、リンク先の記事とこの回答を適宜更新します。

9
Craig Scott

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

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

#!/bin/bash
ccache g++ "[email protected]"

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

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

8
jonas

次の動作を確認しました(ソース: このリンク ):

        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:後でこれでも機能しないことに気付きました。奇妙なことに、それは毎回交互に動作します(他の回はcmakeが文句を言います)。

6
amit

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

export CC="ccache gcc" CXX="ccache g++" cmake ...
4
Nadir SOUALEM

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

Ubunutu:18.04ドッカーイメージからミニマルなビルドシステムをブートストラップしているときに、インストールの順序が違いを生むことがわかりました。

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

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

...そして(更新されたシンボリックリンクにより)ccおよびc ++への呼び出しもキャッチされます!

3
Jürgen Weigert