我递交了一个变量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中的便携性。
答案 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