使用GCC和clang,我已经能够使用SCons的“TryCompile”功能来构建一个简单的配置检查,以确定当前配置的编译器是否支持给定的编译标志。基本上,克隆env,根据需要将有问题的标志添加到CFLAGS,CCFLAGS或CXXFLAGS,执行TryCompile,如果TryCompile成功,则支持该标志,我们可以将其添加到真实的环境中。
但是,这一切都归功于Microsoft工具链,因为据我所知,有无法来说服编译器将未知标志视为错误:它们始终是警告,即使你传递旗帜以发出警告错误。由于编译退出干净或不接受标志,TryCompile总是成功。有关我为使MSVC以非零状态退出而进行的各种尝试的详细信息,请参阅this question。
关于如何使这项工作的任何想法?是否有另一个SCons设施,我忽略了可以为我做这个工作?我应该在MS平台上插入TryCompile并解析编译器输出而不是检查退出状态。我很高兴使用TryCompile进行clang和gcc的配置时间标志检测,但如果我不能让MSVC合作,我将需要放弃这整个方法,而且我很不喜欢这样做它到目前为止工作得很好。
答案 0 :(得分:1)
将它留在Windows上再次下雨游行:)显然Windows编译器总是会返回成功,无论发生什么。
我可以想到你可以尝试的几个选项。
首先,SCons提供Multi-Platform Configuration (Autoconf Functionality)可以帮助您获得相同的结果。它不包含编译器选项的任何内容,但至少包括以下内容:
另一种选择是使用Microsoft编译选项构建某种字典。每个编译器版本可能需要一个字典。这个特殊的选择可能需要很长时间来准备,而且可能不值得。
另一种选择是使用Object()或Program()构建器而不是TryCompile()构建器,并尝试捕获失败并做出相应的反应。我不确定SCons是否允许您将编译失败作为异常捕获并继续进行,如果失败,但值得检查。