CMakeは、すべてのC++ソースファイルに対してCMAKE_CXX_COMPILERが1つだけ存在するように見えます。ターゲットごとにこれをオーバーライドする方法を見つけることができません。これにより、組み込みのCMakeの機能では、1つのCMakeLists.txtでのホストとクロスのコンパイルが非常に難しくなります。同じ言語の複数のコンパイラでCMakeを使用する
私の質問は、同じ言語(つまりC++)で複数のコンパイラを使用する最良の方法は何ですか?
CMakeは、すべてのC++ソースファイルに対してCMAKE_CXX_COMPILERが1つだけ存在するように見えます。ターゲットごとにこれをオーバーライドする方法を見つけることができません。これにより、組み込みのCMakeの機能では、1つのCMakeLists.txtでのホストとクロスのコンパイルが非常に難しくなります。同じ言語の複数のコンパイラでCMakeを使用する
私の質問は、同じ言語(つまりC++)で複数のコンパイラを使用する最良の方法は何ですか?
CMakeでこれを行うことは不可能です。
CMakeは、CMakeLists.txtファイルのすべてのターゲットで共有される1組のコンパイラプロパティのみを保持します。 2つのコンパイラを使用する場合は、CMakeを2回実行する必要があります。これは、例えば、同じコンパイラツールチェーンから32ビットと64ビットのバイナリをビルドします。
これを回避するには、カスタムコマンドを使用します。しかし、基本的に栄光のシェルスクリプトで終わることになります。これはおそらくあなたが望むものではありません。
清潔な解決策は:同じCMakeLists.txtに入れないでください!とにかく、異なるアーキテクチャーをリンクすることはできないので、同じファイルに入れる必要はありません。 CMakeスクリプトの一般的な部分を別々のファイルにリファクタリングして、冗長性を減らすことができます。include()
ここでの主な欠点は、1つのコマンドでビルドする能力を失うことですが、異なるCMake-makefileを呼び出すためのラッパーを好みのスクリプト言語で記述することで解決できます。
あなたはExternalProjectで見たいと思うかもしれません:設定されますここで1 https://github.com/Sarcasm/cmake-superbuild のようにテンプレートのいくつかの種類を使用することにより、 はスーパービルドとしてプロジェクトをビルドします。 http://www.kitware.com/media/html/BuildingExternalProjectsWithCMake2.8.html
が@Billホフマンの答えを拡張するにはExternalProject(スタンドアロンのcmakeのconfigure/build/install環境)としての依存関係とプロジェクトの両方。
カスタムラッパーを作成するのとは対照的に、add_directory(other_build_kind_folder)のように見えるかもしれません。これは私がやってきたことであり、うまくいくようです。 :-) – cdleary
@cdlearyその仕組みを明確にすることはできますか? 'add_subdirectory'(あるいは本当に' add_directory'を意味しましたか?)ではツールチェーンを切り替えることができますか? –
うわー、これは実際には本当に悪いデザインです... –