2015-09-24 16 views
6

既存のコンパイラを使用するユーティリティは、コマンドを接頭辞として追加することで(cc -c file.cを呼び出すのではなくdistcc cc -c file.cと呼ぶことができます)CMake(distcc、ccache)でのコンパイラプレフィックスコマンドの使用

CMakeを使用するとコンパイラコマンドを変更できますが、distccを使用しようとすると問題が発生しましたが、これはコンパイラのコマンドプレフィックス(ccacheも)に当てはまります。

  • CMakeのは、コンパイラは絶対パスであることを期待
    そう/usr/bin/distcc /usr/bin/ccからCMAKE_C_COMPILER設定、エラーを与える:
    開始する/usr/bin/distcc及び
    CMAKE_C_COMPILER_ARG1またはCMAKE_C_FLAGSにコンパイラを設定

    /usr/bin/distcc /usr/bin/cc is not a full path to an existing compiler tool.

  • /usr/bin/ccを使用するとエラーが発生することがありますが、失敗するのはCHECK_C_SOURCE_COMPILES
    ですこれをサポートする何らかの方法がありましたが、接頭辞プレフィックスCMAKE_REQUIRED_FLAGSは動作しませんでした)

私はこれを行うために見つけた唯一の方法は、シェルスクリプトでコマンドをラップすることです。

#!/bin/sh 
exec /usr/bin/distcc /usr/bin/cc "[email protected]" 

これは動作しますが、シェルスクリプト(ビルドシステムは、単にコマンドプレフィックスを使用することができたときにいくつかの小さなオーバーヘッドを与える)にもかかわらず移動することなく、CMakeのでコンパイラヘルパーを使用できるようにするとよいでしょう。


だから私の質問は次のとおりです。

cmakeのは、シェルスクリプトラッパーなしで?,直接(例えばdistccのような)コンパイラ接頭辞コマンドを使用することはできますか?

+1

はあなた' CC'/'CXX'環境変数を設定していますcmake .. ')何かの理由で不十分? –

+0

@Iskar Jarak、これは機能します! (私はこれが答えになると思うので)。 興味深いことに、内部的には、最初のコマンドに 'CMAKE_C_COMPILER'、2番目に' CMAKE_C_COMPILER_ARG1'を使用しています。何が起きているのか分かりません - cmake-guiでこれらを設定しようとしたので、 'CMAKE_C_COMPILER_ARG1'は' CHECK_C_SOURCE_COMPILES'で無視されていました。 – ideasman42

+0

うれしいです。環境変数を設定すると、おそらく他のものも設定されます。私は100%ではありませんが、CHECK_C_SOURCE_COMPILESが使用しているのは...なぜなら、CMakeの個々の変数を混乱させるのはそのような痛みです。 –

答えて

8

CMake 3.4.0から、CMAKE_<LANG>_COMPILER_LAUNCHERの変数および対応するターゲット特性<LANG>_COMPILER_LAUNCHERがありました。あなたがC++プロジェクトを持っている場合は、

cmake -DCMAKE_C_COMPILER_LAUNCHER=ccache /path/to/source 
CCACHE_PREFIX=distcc make -j`distcc -j` 

-DCMAKE_CXX_COMPILER_LAUNCHER=ccacheを使用する:プロジェクトがC-だけであれば、あなたのような何かをするだろう。

それとも、あなたのCMakeLists.txtは、スマート作ると、それは見つけることができる場合は、自動的にccacheを使用します(例えば、 `CC = "distccののgccの" cmakeのを呼び出すときに

#----------------------------------------------------------------------------- 
# Enable ccache if not already enabled by symlink masquerading and if no other 
# CMake compiler launchers are already defined 
#----------------------------------------------------------------------------- 
find_program(CCACHE_EXECUTABLE ccache) 
mark_as_advanced(CCACHE_EXECUTABLE) 
if(CCACHE_EXECUTABLE) 
    foreach(LANG C CXX) 
    if(NOT DEFINED CMAKE_${LANG}_COMPILER_LAUNCHER AND NOT CMAKE_${LANG}_COMPILER MATCHES ".*/ccache$") 
     message(STATUS "Enabling ccache for ${LANG}") 
     set(CMAKE_${LANG}_COMPILER_LAUNCHER ${CCACHE_EXECUTABLE} CACHE STRING "") 
    endif() 
    endforeach() 
endif() 
+0

CMakeの文書によると、 ' _COMPILER_LAUNCHER'のターゲットプロパティは、MakefilesとNinjaジェネレータによってのみ受け付けられます。 Xcodeにランチャーを使用させるためには、もっと多くの作業が必要です。古いRULE_LAUNCH_COMPILE変数とCMAKE_XCODE_ATTRIBUTE _...を使用するより一般的な方法については、[こちらの回答](http://stackoverflow.com/a/36515503/1938798)を参照してください。 –

+0

悲しいことに、CMAKE_ _COMPILER_LAUNCHERは、最新のcmake(3.10.1)であっても、CHECK_ _SOURCE_COMPILESでは無視されます。つまり、テスト結果がランチャーに依存する場合、ラッパーはまだ必要です。 – proski

関連する問題