2011-11-24 9 views
5

SConsを使用してビルドシステムを準備しようとしています。私は、コード生成段階ではclangを使用し、それ以外の場合にはカスタムコンパイラツールチェーンを使用したいと考えています。コード生成とアセンブリに別々のツールを使用するSConsの設定

デフォルトでは、SCons構成には、アセンブリの(.s)ファイルが生成される明示的な手順はありません。

これを回避するために、自分でBuilderを作成し、アセンブリファイルを生成しました。

code_generator = Builder(action = '$CC -$LOTS_OF_FLAGS -S $SOURCE -o $TARGET', suffix = '.s') 
env.Append(BUILDERS = {'CodeGenerator':code_generator}) 

私はその後、私のソースファイルでこのBuilderを使用してProgramに結果NodeListを渡します。

これは、変数を変更しないとうまく動作します。 gccを使用して実行可能ファイルを取得します。

ただし、SConsが(env.Replace(CC='clang')...を使用して)カスタムツールチェーンを使用するように適切な変数を置き換えると、1つのアセンブリファイルしか生成されません。私のカスタムBuilderは、他のファイルに呼び出され、SConsはどのように私はSConsは、すべてのファイル上でBuilderを実行し、リンクするためのそれらの オブジェクトファイルを含めることができます唯一のオブジェクトファイル(明らかに失敗した)

  1. とリンクしようとしていません?
  2. は何をしようとしているのですか?私はSConsと仕事を始めたばかりです。

答えて

3

ユーザーマニュアルに記載されていないSConsはman pageに記載されていますBuilderクラスのキーワード引数、多数のがあります。これはSConsのドキュメンテーションの弱点の1つであり、しばらくありました。この場合

は、私はあなたがsingle_sourceキーワード引数を探していると信じて:

すると、このビルダーは、呼び出しごとに1つのソースファイルを期待していることを指定します。 ターゲットファイルなしで複数のソースファイルを指定すると、 は暗黙的にビルダーを複数回呼び出します(ソースごとに1度、 が指定されています)。

Builderのソースを見ると、single_sourceはTrue(または同等のもの)と評価する必要があります。したがって、あなたのコードは1つの小さな変更で書き直すことができます。

ファイルとディレクトリの
env = Environment() 
code_generator = Builder(action = '$CC $CCFLAGS -S $SOURCE -o $TARGET', 
         single_source = 1, 
         suffix = '.s') 
env.Replace(CC= 'clang') 
env.Append(BUILDERS = {'CodeGenerator' : code_generator}) 
sources = env.CodeGenerator(file) 
env.Program('say_hello', sources) 

:でも、提案の修正の後、私は同じ問題に直面し続ける

scons: Reading SConscript files ... 
scons: done reading SConscript files. 
scons: Building targets ... 
clang -S bar.c -o bar.s 
as -o bar.o bar.s 
clang -S foo.c -o foo.s 
as -o foo.o foo.s 
clang -o say_hello bar.o foo.o 
scons: done building targets. 
+0

:foo.cのとbar.cには、出力を生成します。しかし、マニュアルページの余分な文書についての発言に感謝します。あなたは正しい、私はユーザーガイドを参照していた。私が成功すれば、さらに調査して報告します。 – Buzzy

+0

ご使用のsconsのバージョンは? –

+0

MacでHomebrewを使用してインストール:スクリプト:v2.1.0.r5357 エンジン:v2.1.0。r5357 – Buzzy

関連する問題