2017-02-13 6 views
1

システム上のコンパイラを参照する実行可能ファイルを含む変数CCが渡されました。私はこの実行可能ファイルを取得し、最終的にいくつかのコンパイラ固有のリンク引数で呼び出す必要があります。コンパイルを検出し、コンパイラ固有のフラグを使用して呼び出します。

私の現在のアプローチは非常に壊れやすいようだ:

def guess_compiler(cc): 
    out = subprocess.check_output((cc, '--version')) 
    for possible in (b'clang', b'gcc'): 
     if possible in out: 
      return possible.decode() 
    else: 
     # Fall back to gcc 
     return 'gcc' 

このことから私は、私が気に特定のリンカー引数のマッピングを使用しています:

要するに
return { 
    'clang': '-Wl,-undefined,dynamic_lookup', 
    'gcc': '-Wl,--unresolved-symbols=ignore-all', 
}[cc] 

、私があります願っています私が成し遂げたことをより良い(脆弱ではない)方法です。

なぜ私がこのようなものを望んでいるのかについては、ほとんどが移植性のためにa project I'm implementingです。

答えて

1

私はむしろいくつかのダミーコードでこれらのフラグを渡してコンパイラを呼びたいと思います。これはAutotoolsやCMakeのようなツールでもあります。

現時点でのアプローチの問題は、--versionの出力に表示されるテキスト文字列が実際には任意である可能性があることです。打ち鳴らすが、その人気がなかったとき例えば、FreeBSDのcc --versionはちょうどあなたが興味を持っている各フラグでコンパイラを呼び出し、

GCC 4.2.1互換クランのBLAのBLAので

を与えてきました終了コードを見てください。

これを行う方法の例:

for flag in FLAGS: 
    try: 
     subprocess.check_call((cc, 'test.c', flag), cwd=tmpdir) 
     return flag 
    except subprocess.CalledProcessError: 
     pass 
else: 
    # wellp, none of them worked, fall back to gcc and they'll get a 
    # hopefully reasonable error message 
    return FLAG_GCC 
+0

は、私は:)と一緒に行くことを試み何で編集 –

関連する問題