使用SCons TryCompile检查Windows上的编译器标志支持

时间:2013-03-07 15:03:33

标签: visual-studio warnings configure scons

使用GCC和clang,我已经能够使用SCons的“TryCompile”功能来构建一个简单的配置检查,以确定当前配置的编译器是否支持给定的编译标志。基本上,克隆env,根据需要将有问题的标志添加到CFLAGS,CCFLAGS或CXXFLAGS,执行TryCompile,如果TryCompile成功,则支持该标志,我们可以将其添加到真实的环境中。

  • 这与gcc完美配合,因为未知标志是错误,编译器以非零状态退出。
  • 使用clang,它也可以很好地工作:默认情况下clang将未知错误视为警告,但是如果你传递它 - 错误它将把未知标志变成错误。所以我的TryCompile包装器总是传递-Werror以及要测试的标志,如果它知道我们正在使用clang。

但是,这一切都归功于Microsoft工具链,因为据我所知,有无法来说服编译器将未知标志视为错误:它们始终是警告,即使你传递旗帜以发出警告错误。由于编译退出干净或不接受标志,TryCompile总是成功。有关我为使MSVC以非零状态退出而进行的各种尝试的详细信息,请参阅this question

关于如何使这项工作的任何想法?是否有另一个SCons设施,我忽略了可以为我做这个工作?我应该在MS平台上插入TryCompile并解析编译器输出而不是检查退出状态。我很高兴使用TryCompile进行clang和gcc的配置时间标志检测,但如果我不能让MSVC合作,我将需要放弃这整个方法,而且我很不喜欢这样做它到目前为止工作得很好。

1 个答案:

答案 0 :(得分:1)

将它留在Windows上再次下雨游行:)显然Windows编译器总是会返回成功,无论发生什么。

我可以想到你可以尝试的几个选项。

首先,SCons提供Multi-Platform Configuration (Autoconf Functionality)可以帮助您获得相同的结果。它不包含编译器选项的任何内容,但至少包括以下内容:

  • 检查标头文件是否存在
  • 检查功能的可用性
  • 检查库的可用性
  • 检查typedef的可用性
  • 添加自己的自定义检查

另一种选择是使用Microsoft编译选项构建某种字典。每个编译器版本可能需要一个字典。这个特殊的选择可能需要很长时间来准备,而且可能不值得。

另一种选择是使用Object()或Program()构建器而不是TryCompile()构建器,并尝试捕获失败并做出相应的反应。我不确定SCons是否允许您将编译失败作为异常捕获并继续进行,如果失败,但值得检查。