我的项目使用 SCons 来管理构建过程。我想支持多个编译器,所以我决定使用AddOption
这样用户可以指定在命令行上使用哪个编译器(默认是他们当前的编译器)。
AddOption('--compiler', dest = 'compiler', type = 'string', action = 'store', default = DefaultEnvironment()['CXX'], help = 'Name of the compiler to use.')
我希望能够为各种编译器提供内置编译器设置(包括该特定编译器的最大警告级别等内容)。这是我目前第一次尝试解决方案的样子:
if is_compiler('g++'):
from build_scripts.gcc.std import cxx_std
from build_scripts.gcc.warnings import warnings, warnings_debug, warnings_optimized
from build_scripts.gcc.optimizations import optimizations, preprocessor_optimizations, linker_optimizations
elif is_compiler('clang++'):
from build_scripts.clang.std import cxx_std
from build_scripts.clang.warnings import warnings, warnings_debug, warnings_optimized
from build_scripts.clang.optimizations import optimizations, preprocessor_optimizations, linker_optimizations
但是,我不确定该is_compiler()
功能是什么样的。我的第一个想法是直接将编译器名称(例如“clang++”)与用户传入的内容进行比较。但是,当我尝试使用scons --compiler=~/data/llvm-3.1-obj/Release+Asserts/bin/clang++
.
所以我想我会变得更聪明一点并使用这个功能
cxx = GetOption('compiler')
def is_compiler (compiler):
return cxx[-len(compiler):] == compiler
这只会查看编译器字符串的末尾,因此它会忽略目录。不幸的是,“clang++”以“g++”结尾,所以我的编译器被认为是g++而不是clang++。
我的下一个想法是进行向后搜索并查找第一次出现的路径分隔符('\' 或 '/'),但后来我意识到这不适用于拥有多个编译器版本的人。使用“g++-4.7”编译的人不会注册为 g++。
那么,是否有一些简单的方法可以确定请求了哪个编译器?
目前,由于它们对 c++11 的支持,仅支持 g++ 和 clang++(并且仅支持它们最近发布的版本),因此目前仅适用于这两者的解决方案就足够了。但是,我的最终目标是至少支持 g++、clang++、icc 和 msvc++(一旦它们支持所需的 c++11 特性),因此首选更通用的解决方案。