4

GCC と clang を使用すると、SCons の「TryCompile」機能を使用して、現在構成されているコンパイラが特定のコンパイル フラグをサポートしているかどうかを判断する簡単な構成チェックを構築できました。基本的に、env を複製し、問題のフラグを CFLAGS、CCFLAGS、または CXXFLAGS に適宜追加し、TryCompile を実行します。TryCompile が成功すると、フラグがサポートされ、実際の env に追加できます。

  • 不明なフラグはエラーであり、コンパイラはゼロ以外のステータスで終了するため、これは gcc で完全に機能します。
  • デフォルトでは、clang は不明なエラーを警告として扱いますが、-Werror を渡すと、不明なフラグがエラーに変わります。したがって、TryCompile のラッパーは、clang を使用していることを認識している場合は、テスト対象のフラグと共に常に -Werror を渡します。

ただし、これはすべて Microsoft ツールチェーンに当てはまります。私が発見した限りでは、不明なフラグをエラーとして処理するようにコンパイラを説得する方法がないためです。フラグを渡して警告エラーを発生させたとしても、それらは常に警告です。フラグが受け入れられるかどうかにかかわらず、コンパイルはきれいに終了するため、TryCompile は常に成功します。MSVC をゼロ以外のステータスで終了させるために行ったさまざまな試みの詳細については、この質問を参照してください。

これをどのように機能させることができるかについてのアイデアはありますか? 私が見落としている、この仕事をしてくれる別の SCons 施設はありますか? 終了ステータスを調べるのではなく、MS プラットフォームで TryCompile に割り込んで、コンパイラの出力を解析する必要があります。私は、clang と gcc を使用して時刻フラグの検出を構成するために TryCompile を使用することに非常に満足していますが、MSVC を連携させることができない場合は、このアプローチ全体を放棄する必要があります。これまでのところうまくいっています。

4

1 に答える 1

1

再びパレードの雨が降るように Windows に任せてください :) 明らかに、Windows コンパイラは、何が起こっても関係なく、常に成功を返します。

あなたが試すことができるいくつかのオプションを考えることができます。

まず、SCons はマルチプラットフォーム構成 (Autoconf 機能)を提供し、同じ結果を達成するのに役立ちます。コンパイラ オプションは何も含まれていませんが、少なくとも次のものが含まれています。

  • ヘッダファイルの存在確認
  • 関数の可用性の確認
  • ライブラリの可用性の確認
  • typedef の可用性の確認
  • 独自のカスタム チェックを追加する

もう 1 つのオプションは、Microsoft のコンパイル オプションを使用して何らかの辞書を作成することです。おそらく、コンパイラのバージョンごとに 1 つの辞書が必要になるでしょう。この特定のオプションは、おそらく準備に長い時間がかかり、おそらく価値がないでしょう.

もう 1 つのオプションは、TryCompile() ビルダーの代わりに Object() または Program() ビルダーを使用し、失敗をキャッチしてそれに応じて対応することです。SCons を使用してコンパイルの失敗を例外としてキャッチし、失敗した場合に続行できるかどうかはわかりませんが、チェックする価値はあります。

于 2013-03-09T11:45:10.867 に答える