私のプロジェクトでは、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++' で終わるため、私のコンパイラは clang++ ではなく g++ であると見なされました。
次に考えたのは、後方検索を行い、最初に出現するパス区切り文字 (「\」または「/」) を探すことでしたが、これは複数のコンパイラ バージョンを使用している場合には機能しないことに気付きました。「g++-4.7」でコンパイルした人は、g++ として登録されません。
では、どのコンパイラが要求されたかを判断する簡単な方法はありますか?
現在、c++11 をサポートしているため、g++ と clang++ のみがサポートされています (そして、最近リリースされたバージョンのみ)。ただし、私の最終的な目標は、少なくとも g++、clang++、icc、および msvc++ (必要な c++11 機能をサポートした後) をサポートすることなので、より一般的なソリューションが優先されます。