だから私は私の問題に対してかなり創造的な解決策を考案しました... CMakeにはターゲットアーキテクチャを検出する機能がまったくないようです。
これで、環境に応じて 、 などの記号が定義される__i386__
ため、C でこれを簡単に実行できることがわかりました。__x86_64__
幸いなことに、CMake には、configure 段階で任意の C ソース コード ファイルをコンパイルして実行する try_run 関数があります。
次に、一連の ifdef を使用し、アーキテクチャ名を文字列としてコンソールに書き込む小さなプログラムを作成できます。唯一の問題は、ホストとターゲット システムが同じ場合にのみ機能することです...バイナリをコンパイルすることはできますが、バイナリを実行して出力を確認することはできないため、クロス コンパイル中には機能しません。
ここからが興味深いところです。故意に壊れた C プログラムを作成することで、C プリプロセッサを利用して必要な情報を取得できます... ifdefs に基づいてアーキテクチャ名をコンソールに書き込むという元の概念を使用しますが、それを行う代わりに、単純に # を配置しますprintf 呼び出しの代わりにエラー プリプロセッサ ディレクティブを使用します。
CMake の try_run 関数が C ファイルをコンパイルするとき、コンパイルは常に失敗しますが、#error ディレクティブに配置したメッセージは、try_run が返すコンパイラのエラー出力に表示されます。
したがって、いくつかの CMake 文字列コマンドを使用して、コンパイラのエラー出力からアーキテクチャ名を解析するだけで、ターゲット アーキテクチャを取得できます...クロス コンパイル時でも。
コードの OS X 固有の部分は、主に CMAKE_OSX_ARCHITECTURES を使用してターゲット アーキテクチャを決定しますが、指定されていない場合は、他のシステムと同じコードを使用し、x86_64 (コンパイラのデフォルトである最新のシステムの場合) または i386 を正しく返します。 (Leopard などの古い OS X システムの場合)。
Visual Studio 9 および 10 ジェネレーター (x86、x86_64、ia64)、Xcode、NMake、MSYS Makefile、および Unix Makefile を使用して、これが Windows、OS X、および Linux で動作することをテストおよび検証しました。毎回正しい結果が返されます。
注意:このソリューションは、コンパイラに -m32 または -m64 を渡すなどのことを意図的に行った場合、またはターゲット アーキテクチャに影響を与える可能性のあるその他のフラグを実行した場合に失敗する可能性があります (すべての環境設定を try_run に渡す方法はありますか?)。これは私がテストしたものではありません。ジェネレーターのデフォルト設定を使用していて、すべてのターゲットが同じアーキテクチャー用にコンパイルされている限り、問題はありません。
私のソリューションの完全なソース コードは GitHub にあります: https://github.com/petroules/solar-cmake/blob/master/TargetArch.cmake