Как определить, какой компилятор был запрошен

Мой проект использует 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++.

Итак, есть ли простой способ определить, какой компилятор был запрошен?

В настоящее время поддерживаются только g++ и clang++ (и только их самые последние выпущенные версии )из-за их поддержки c++11, поэтому решение, которое работает только для этих двух, будет достаточно хорошим на данный момент. Однако моей конечной целью является поддержка хотя бы g++, clang++, icc,и msvc++ (, поскольку они поддерживают необходимые функции c++11 ), поэтому предпочтение отдается более общим решениям.

5
задан David Stone 7 July 2012 в 17:42
поделиться