クロスコンパイルの場合、最良の選択はCMakeまたはAutotoolsのいずれかだと思います。特に、複数のアーキテクチャ/プラットフォーム用にコードをコンパイルできる場合。私は通常、単体テストの目的でネイティブ マシン上でコードのサブセットをコンパイルし、そのすべてをターゲット プラットフォーム用にコンパイルします。CMake は、クロス コンパイルされたライブラリが存在する場所を指定できるため、これを特にうまく処理します。したがって、クロス コンパイルされた libpng を /usr/lib で検索するのではなく、/opt/arm-eabi-gcc/ またはビルド マシンにツール チェーン ライブラリがインストールされている場所を検索するように指示できます。さまざまなバリアント用に複数のビルド ディレクトリを作成し、make を使用して各バリアントを手動でコンパイルするか、脳死した手作業で再帰的な make を使用してロットをトリガーすることができます。
Ant には、基本的にバニラの Make と同じくらい良いか悪いかという欠点があり、C または C++ の特に主流ではないものを使用しているという追加の欠点があります。Cファイルからヘッダーファイル、ライブラリまたは実行可能ファイルなどの内部依存関係と、サードパーティのライブラリとリンクする必要があるなどの外部依存関係の両方で、すべての独自の依存関係に対処する必要があります。さらに、Ant C のタスクがそれほど維持されているとは思いません。Ant for C を使用しているのを見た人は皆、exec タスクで GCC を呼び出すことを推奨しています。
SCons の方が優れていますが、クロス コンパイルは得意ではありません。CMake や Autotools のような「ビルド システム」でもなく、単なるビルド ツールです。彼らのwikiにあるように、それはほとんど「Make in Python」です。ただし、依存関係の処理が組み込まれています。つまり、「gcc -MM -MD」などを使用して自分でロールバックする必要がないため、Make よりも有利です。SCons は、インストールされているサードパーティ ライブラリの検出もサポートしていますが、通常の方法ではビルド時間が大幅に長くなる可能性があります。他のシステムとは異なり、SCons は実行するたびにチェック ステージを実行しますが、ほとんどの結果はキャッシュされます。SCons はビルド時間が長いことでも有名ですが、ファイルが 50 個あれば問題ありません。メーリング リストのこのスレッドで議論されているように。通常、ビルドを Unix プラットフォームのように強制してから、C コンパイラの名前をオーバーライドします。複数のバリアントをビルドしたり、ビルド ディレクトリをソース ディレクトリから分離したりすることは、落とし穴がいっぱいあるため、コードをクロスしてネイティブ コンパイルする場合にはあまり適していません。
CMake と Autotools は依存関係の問題をうまく解決しており、autotools のクロス コンパイル サポートは成熟しています。CMake では、2008 年 4 月にリリースされたバージョン 2.6.0 からクロス コンパイルが使用されています。これらの機能に加えて、パッケージ化や単体テストの実行 ("make check" または同様のターゲット) などの機能を無料で利用できます。これらのツールの両方の欠点は、ブートストラップが必要なことです。CMake の場合、Makefile または Visual Studio ソリューション ファイルを作成するには、CMake バイナリをインストールする必要があります。Autotools の場合、ソフトウェアをコンパイルするすべての人が automake と autoconf をインストールする必要があるわけではなく、ビルド システムを変更する必要がある人だけが必要になるため、少し複雑です (新しいファイルの追加はビルド システムの変更としてカウントされます)。2 段階のブートストラップ (configure.ac -> configure、
編集者向け: クロス コンパイルは、プログラムとライブラリの自動検出が複雑になるため、ビルド システムでは特に頭の痛い問題です。SCons はこの問題に対処しません。それはあなた次第です。Ant も同様に何もしません。Autoconf は autotools の場合にこれを処理しますが、構成時にコマンド ラインで「--with-libfoobar=/some/path」を指定する必要がある場合や、リンク フェーズで /usr/lib を使用しようとするとリンクが壊れる場合があります。 . CMake のアプローチは、ツールチェーン ファイルを使用すると少し重くなりますが、すべてのツールとライブラリ (CC、CXX、RANLIB、-with-ibfoo= など) を指定する必要がないことを意味します。標準的なコンベンション。理論的には、適切に作成された CMake ツールチェーン ファイルを複数のプロジェクトで再利用して、それらをクロス コンパイルできます。