5

-march=nativeコマンドラインで何も指定されていない場合にパスするようにスペックファイルを変更する方法はありますか?

デフォルトの specs ファイルの関連事項は次のとおりです。

*cc1:
%(cc1_cpu)

*cc1_cpu:
%{march=native:%>march=native %:local_cpu_detect(arch)   %{!mtune=*:%>mtune=native %:local_cpu_detect(tune)}} %{mtune=native:%>mtune=native %:local_cpu_detect(tune)}

仕様がどう動くかはわかりません。-march=nativebefore または afterを指定するだけで%(cc1_cpu)は機能しません。-something_wierdただし、の代わりに置くとGCCがエラーを報告するため、この行は有効になります-march=native

私が気づいたもう1つのことは、の%{march=i386:-something_wierd}前に置く%(cc1_cpu)と、gccがエラーを報告するので、何も指定されていない場合は常に渡されるように見えるため、何も指定されていないこととspecファイル-march=i386にあることを区別する方法はありますか?-march=i386

ところで、何をし%>ますか?ドキュメントには明記されていないようです。

MinGW を使用していgcc-4.6.2ます。

4

3 に答える 3

4

最後の質問を参照してください: gcc 4.6.1ソース(gcc/gcc.c)には、次のコメントが含まれています%>

 %>S    Similar to "%<S", but keep it in the GCC command line.

%<完全を期すために、同じファイルのフォームのコメントに続いて:

 %<S    remove all occurrences of -S from the command line.
        Note - this command is position dependent.  % commands in the
        spec string before this one will see -S, % commands in the
        spec string after this one will not.

要するに最初の質問に答えるために:はい、しかし...。

...私が見つけた唯一の一般的な解決策には、オプションが無視されるという重大な欠点がある-marchため、すべてのビルドは-march=native指定されているかのように実行されます。とにかく、それには回避策があります。

1解決策(回避策なし)

specs.nativealwaysたとえば、次のものを含むという仕様ファイルを作成します。

*cc1_cpu:
%<march=* -march=native %>march=native %:local_cpu_detect(arch) %{!mtune=*:%>mtune=native %:local_cpu_detect(tune)} %{mtune=native:%>mtune=native %:local_cpu_detect(tune)}

specs-fileを使用する場合(たとえばgcc、オプションを使用して呼び出す場合-specs=specs.nativealways)、ビルドは指定された場合と同じように実行されます(オプションの出現は単に無視される-march=nativeという前述の欠点があります)。-march=<arch>

2回避策

新しく構成されたデフォルトの動作をオーバーライドできるようにするには、上記の仕様ファイルの変更バージョンを-myarch使用して、と同じ構文を使用して呼び出される新しいオプションを導入できます-march(ただし、-myarch=nativeは機能しません。native現在がデフォルトです)。

変更されたspecs-fileは次のようになります。

*cc1_cpu:
%<march=* %{myarch=*:%<myarch* -march=%* ; :-march=native %>march=native %:local_cpu_detect(arch) %{!mtune=*:%>mtune=native %:local_cpu_detect(tune)}}  %{mtune=native:%>mtune=native %:local_cpu_detect(tune)}

PS:これはLinuxのgcc 4.6.2でテストされていますが、MinGWで動作するはずです。

于 2012-01-04T16:00:18.680 に答える
1

質問に対する直接の答えではありませんが、シェルの初期化ファイルでCFLAGS定義することにより、非常によく似た効果を得ることができます。CXXFLAGSMakefileの99%は、環境値を取得してフラグをに渡すのに十分な標準gccです。

于 2012-01-04T17:10:21.953 に答える
1
*cc1_cpu:
+ %{!march*:-march=native}
于 2012-05-31T10:19:08.303 に答える