5

私のプロジェクトでは、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 機能をサポートした後) をサポートすることなので、より一般的なソリューションが優先されます。

4

3 に答える 3

2

コンパイラはビルドプロセスの一部です。また、リンカツールが必要で、他の追加プログラムである可能性があります。Scons では、名前は - ツールです。サポートされているツールのリストは、 man ページfrom boxで確認できます。ステートメントで検索してください: ... ツールは、必要な scons 環境変数を設定します。ここに記載されています。SCons supports the following tool specifications out of the box:

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

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

envmingwを使用して強制します。

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

于 2012-07-09T08:53:48.540 に答える
1

ここでos.path.basename()指定されているように、Pythonまたはos.path.split()関数を使用するだけで済みます。

この質問を2つの異なる問題に分割することで、コメントで人々が提案したことを実行できますが、2つのバージョンのg ++​​をインストールできるため、コンパイラでパスを指定できるようにすることをお勧めします。ユーザーはg++のみを指定し、期待されるバージョンを取得できない場合があります。

于 2012-07-07T20:41:13.193 に答える
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 コンパイラのサポートの向上、バージョン xyz+ でのみ使用可能なフラグのより適切な処理を可能にするコンパイラ バージョンの検出など、まだ多くの作業が残っています。scons --compiler-command=/path/to/gcc-4.7.1また、明示的に通知しなくても、コンパイラが gcc であることを検出できるようにするとよいでしょう。

ただし、最初に修正しようとした問題は解決しました。これに対する功績の多くは、コメントで私を正しい軌道に乗せてくれた Voo に帰する必要があります。

于 2012-12-19T04:41:44.083 に答える