在调用

时间:2017-02-13 01:24:59

标签: gcc compilation clang portability

我递交了一个变量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 个答案:

答案 0 :(得分:1)

我宁愿用一些虚拟代码调用编译器并传入这些标志。这也是Autotools和CMake之类的工具。

您当前方法的问题是您在--version输出中看到的文本字符串实际上可能是任意的。例如,当clang不那么受欢迎时,FreeBSD的cc --version一直在给予

  

GCC 4.2.1兼容的Clang 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