2012-07-07 13 views
5

私のプロジェクトは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つの問題を分けたいと思います。コンパイルが要求されている#2)*は*要求されたコンパイラが置かれている場所です(ほとんどの場合、適切なデフォルトを使用することができ、デフォルトのclang/gcc /何でも)。 2つのことはあまり共通していないので、結局私が望むなら 'msvc'と呼ばれるソフトリンクを簡単に作成することができます(実際に試したことはありませんが、どうしてですか?) – Voo

+0

@Vooがあなたに与えた提案に同意します。これを編集して1つの質問に絞り込み、新しい質問を作成します。あなたには2つの良い質問があります。それはあなたが作成したものを(今までのところ)私がアップした理由です。 – octopusgrabbus

+0

@Vooこれを答えとして書くと、問題を解決するために使った重要な洞察だったので、私はそれを受け入れます。 –

答えて

1

この質問は、これを扱うことができる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コンパイラのサポート、バージョンx.y.z +でのみ使用可能なフラグの処理を改善するコンパイラバージョンの検出など、まだ多くの作業が残っています。もし私がscons --compiler-command=/path/to/gcc-4.7.1のような何かをして、コンパイラが明示的にそれを伝えなくてもgccであることが検出されれば、それはいいかもしれません。

しかし、私は修正するために設定した初期の問題を解決しました。これについてのクレジットの多くは、私を正しい軌道に乗せるためのコメントでVooに行く必要があります。

1

hereのように、Python os.path.basename()またはos.path.split()関数をそのまま使用することができます。

この質問を2つの異なる問題に分割することで、人々がコメントに示唆したことを行うことができますが、g ++の2つのバージョンを持つことができるので、コンパイラでパスを指定することができるユーザーがg ++だけを指定した場合、期待されるバージョンが得られない可能性があります。

2

コンパイラはビルドプロセスの一部です。またリンカツールが必要で、他の追加プログラムでも可能です。 Sconsでは、それはToolという名前です。 from boxman pageに、SCons supports the following tool specifications out of the box: ... ツールセットに必要なscons環境変数は、hereに記載されています。

Sconsは、OSのコンパイラを自動的に検出し、それらのうちの1つを選択することを優先します。もちろん、PATH変数が必要なディレクトリに設定されていれば自動的に検出されます。たとえば、msvcとmingwをWindows上に持つ場合、sconsはmsvcツールを選択します。ツール使用ツールを使用する力( '名前')(env)。例:

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

今すぐenv force using mingw。

したがって、clangは現在sconsによってfrom boxをサポートしていないツールの1つです。あなたはそれを実装するか、またはビルドコマンドを生成するためにsconsを使用するCC、CXXなどのenv varsを設定する必要があります。

関連する問題