繁体   English   中英

如何确定请求的编译器

[英]How to determine which compiler was requested

我的项目使用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++时,这会立即失败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,它被命名为 - 工具。 支持的工具列表from box ,你可以在看手册页 :通过搜索声明SCons supports the following tool specifications out of the box: ...刀具设置必要SCons环境变量,它的记录在这里

Scons自动检测OS中的编译器并优先选择其中一个,当然如果PATH变量设置为必要的dirs,autodetect将正常工作。 例如,你在Windows上有msvc和mingw,scons选择msvc工具。 对于强制使用工具使用工具('名称')(env)。 例如:

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

现在env强制使用mingw。

所以,铛是目前不支持工具之一from box的scons的。 你需要实现它,或设置env变种,如CC,CXX,它使用scons生成构建命令。

你可以只是简单使用Python os.path.basename()os.path.split()函数,指定在这里

您可以通过将此问题分成两个不同的问题来完成人们在评论中建议的内容,但我认为能够使用编译器指定路径可能是一个好主意,因为您可以安装2个版本的g ++,如果用户只指定g ++,他们可能无法获得预期的版本。

这个问题促成了SCons项目的开发,可以解决这个问题:

https://bitbucket.org/davidstone/scons-template/

相关代码位于build_scripts/compiler_settings.py SCons选项在SConstruct文件中设置,包含以下行:

AddOption('--compiler', dest = 'compiler', type = 'string', action = 'store', help = 'Name of the compiler to use.')
AddOption('--compiler-command', dest = 'compiler_command', type = 'string', action = 'store', help = 'Command to launch the compiler.')

用户可以指定0,1或2个命令行选项。

如果您没有指定任何内容( scons ),那么它将使用DefaultEnvironment中的编译器进行构建。

您可以选择指定编译器的名称( scons --compiler=g++ )。 然后我的脚本假定用于编译的命令与名称相同。

您还可以选择指定要编译的命令( scons --compiler-command=~/llvm-3.1-obj/Release+Asserts/bin/clang++ )。 然后我的脚本假定您使用的编译器的名称是可执行文件的名称(最终目录分隔符之后的所有内容,由os.path.basename确定)。

您可以指定两者。 这允许你处理奇怪的情况: scons --compiler-command=/path/to/executable/that/is/not/clang++ --compiler=g++

它使用名称来确定要打开的警告/优化。 我甚至为名称添加了一些规范化,因此就编译器名称而言,g ++,gcc和GcC都被视为同一个东西。

它仍然有很多工作要做,例如支持更多的编译器,更好地支持mingw编译器,以及检测编译器版本,以便更好地处理仅在xyz +版本中可用的标志。 如果我能做一些像scons --compiler-command=/path/to/gcc-4.7.1这样的东西并让它检测到编译器是gcc而不必我明确告诉它也会很好。

但是,它解决了我打算修复的初始问题。 为了让我走上正确的轨道,大部分功劳都归功于Voo。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM