2017-02-13 66 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

我寧願放棄一些僞代碼和這些標誌在經過一個編譯器。這也是什麼樣的自動工具和CMake的工具做。

與您當前方法的問題是您在--version輸出看到文本字符串實際上可以是任意的。例如,當鐺是不是受歡迎,FreeBSD的cc --version一直給

GCC 4.2.1兼容鏘喇嘛喇嘛

所以,只需要調用每個你感興趣的標誌編譯然後查看退出代碼。

如何做到這一點的一個例子:

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

編輯與我試圖去:) –