c++ - 如何确定请求了哪个编译器

标签 c++ python scons

我的项目使用 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 功能),因此首选更通用的解决方案。

最佳答案

编译器只是构建过程的一部分。您还需要链接器工具,并且可能是其他附加程序。在 Scons 中它被命名为 - 工具。您可以在 man page 中看到支持的工具列表 from box , 按语句搜索:SCons 开箱即用地支持以下工具规范: ... 工具设置必要的 scons 环境变量,已记录 here .

Scons 自动检测操作系统中的编译器,并有一定的优先权选择其中之一,当然,如果 PATH 变量设置为必要的目录,自动检测将正常工作。例如你在 windows 上有 msvc 和 mingw,scons 选择 msvc 工具。要强制使用工具,请使用 Tool('name')(env)。例如:

env = Environment()
Tool('mingw')(env)

现在 env 强制使用 mingw。

因此,clang 是目前 scons 不支持 from box 的工具之一。您需要实现它,或者设置 env vars,例如 CC、CXX,使用 scons 生成构建命令。

关于c++ - 如何确定请求了哪个编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11377274/

相关文章:

c++ - 我能否获取模板类型的 "iterator",无论该类型是数组还是类似 STL 的容器?

javascript - 如何将 v8 值转换为数组

c++ - 用 Lapack 的 dgeqrf_ 求解线性系统

python - 在 Python 中搜索列表中的元素

java - Java 的 SCons;是否有 env.Program() 的类似物?

c++ - 如何让项目将其构建输出与 Scons 放在同一目录中?

c++ - 如何使用 scons 和 Visual C++ 链接到使用静态库本身的静态库?

c++ - 我可以检查一个地址是否在共享内存中吗?

python - Redis:如何从 Lua 脚本中 HMSET 字典?

python - 属性错误: 'tuple' object has no attribute 'layer' when trying transfer learning with keras