私のプロジェクトはSConsを使用してビルドプロセスを管理します。私は複数のコンパイラをサポートしたいので、AddOption
を使うことにしました。そのため、ユーザーはコマンドラインでどのコンパイラを使うかを指定できます(デフォルトは現在のコンパイラが何であれ)。要求されたコンパイラを特定する方法
AddOption('--compiler', dest = 'compiler', type = 'string', action = 'store', default = DefaultEnvironment()['CXX'], help = 'Name of the compiler to use.')
は、私が(例えば、特定のコンパイラのための最大の警告レベルなど、物事を含む)、各種コンパイラの組み込みのコンパイラ設定を持つことができるようにしたいです。しかし、私はis_compiler()
機能は次のように見えるようにするかわからないんだけど
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
:これが解決策で私の最初の試みは、現在のように見えるものです。私が最初に考えたのは、コンパイラ名( '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 ++として登録されません。
したがって、どのコンパイラが要求されたかを簡単に判断する方法はありますか?
現在のところ、g ++とclang ++のみがサポートされています(最近リリースされたバージョンのみ)。そのため、現在のところ、これらの2つだけで動作するソリューションは十分です。しかし、私の究極の目標は、少なくともg ++、clang ++、icc、msvC++(一度必要なC++ 11の機能をサポートする)をサポートすることです。
私はここで2つの問題を分けたいと思います。コンパイルが要求されている#2)*は*要求されたコンパイラが置かれている場所です(ほとんどの場合、適切なデフォルトを使用することができ、デフォルトのclang/gcc /何でも)。 2つのことはあまり共通していないので、結局私が望むなら 'msvc'と呼ばれるソフトリンクを簡単に作成することができます(実際に試したことはありませんが、どうしてですか?) – Voo
@Vooがあなたに与えた提案に同意します。これを編集して1つの質問に絞り込み、新しい質問を作成します。あなたには2つの良い質問があります。それはあなたが作成したものを(今までのところ)私がアップした理由です。 – octopusgrabbus
@Vooこれを答えとして書くと、問題を解決するために使った重要な洞察だったので、私はそれを受け入れます。 –