私は次のことをしたいと思います: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の使用でテストが失敗したという不満を述べます(これは予想できます)。
個人的には/usr/lib/ccache
私の$PATH
。このディレクトリには、コンパイラを呼び出すことができるあらゆる名前のシンボリックリンクが含まれています(gcc
やgcc-4.3
)、すべてccacheを指します。
そして、私もシンボリックリンクを作成しませんでした。 Debianにccacheをインストールすると、そのディレクトリは事前に入力されています。
コンパイルコマンドとリンクコマンドのランチャーとして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が利用可能かどうか、またどのジェネレーターでコンパイルランチャーを使用できるかを確認するために回答を編集しました。
CMAKE 3.4以降、次のことができます。
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache
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}" "$@"
launch-cxx.in:
#!/bin/sh
export CCACHE_CPP2=true
exec "${RULE_LAUNCH_COMPILE}" "${CMAKE_CXX_COMPILER}" "$@"
上記はUnix MakefileとNinjaに対してRULE_LAUNCH_COMPILE
のみを使用しますが、XcodeジェネレーターはCMakeのCMAKE_XCODE_ATTRIBUTE_...
変数サポートからのヘルプに依存しています。コンパイラコマンドを制御するCC
およびCXX
ユーザー定義のXcode属性の設定と、リンカコマンドのLD
およびLDPLUSPLUS
の設定は、今のところそうではありません私が言うことができるように、Xcodeプロジェクトの文書化された機能ですが、それはうまくいくようです。 Appleによって公式にサポートされていることを誰でも確認できる場合は、リンク先の記事とこの回答を適宜更新します。
g++
からccache
へのシンボリックリンクを設定したくありませんでした。また、一部のcmakeテストケースでは、属性のないコンパイラプログラムだけが必要であったため、CXX="ccache g++"
は機能しませんでした。
そこで、代わりに小さなbashスクリプトを使用しました。
#!/bin/bash
ccache g++ "$@"
/usr/bin/ccache-g++
に実行可能ファイルとして保存しました。
次に、Cは/usr/bin/ccache-g++
をC++コンパイラとして使用するようにcmakeを構成しました。このように、それはcmakeテストケースに合格し、2、3週間で忘れてしまうシンボリックリンクを持っているよりも快適で、何かがうまくいかないのではないかと思うかもしれません...
次の動作を確認しました(ソース: このリンク ):
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が文句を言います)。
私の意見では、gcc、g ++をccacheにシンボリックリンクするのが最善の方法ですが、cmake内で使用する場合は、これを試してください。
export CC="ccache gcc" CXX="ccache g++" cmake ...
ここでこれまで言及されていなかった重要な項目を1つ追加します。
Ubunutu:18.04ドッカーイメージからミニマルなビルドシステムをブートストラップしているときに、インストールの順序が違いを生むことがわかりました。
私の場合、gcc
を呼び出すとccacheは正常に機能しましたが、他の名前cc
とc++
による同じコンパイラーの呼び出しをキャッチできませんでした。 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 ++への呼び出しもキャッチされます!