2011-09-12 7 views
5

SConsにソースディレクトリからビルドディレクトリにMakefileプロジェクトをコピーさせ、libmoo.aを生成するコマンドを実行しようとしていますが、依存サイクルエラーが発生しています。詳細は以下のとおりです。SCons:依存関係のサイクル?

./SConstruct:

env = Environment() 
Export('env') 

dirs = ['.'] 

variant_dir = 'build' 

for dir in dirs: 
     SConscript(dir + '/' + 'SConscript', variant_dir=variant_dir + '/' + dir, duplicate=0) 

./SConscript:sconsのを実行している

import os 
Import('env') 

env.Command(env.Dir('moo2').abspath, env.Dir('#moo').abspath, ["echo copying moo to the build dir", Copy("$TARGET", "$SOURCE")]) 

env.Command(env.Dir('moo2/Makefile').abspath, env.Dir('moo2').abspath, 'echo would run moo2.configure') 

moolib = env.Command(env.Dir('moo2/libmoo.a').abspath, env.Dir('moo2/Makefile').abspath, 'echo would run make') 

Default(moolib) 

をエラー:

scons: *** Found dependency cycle(s): 
    build/moo2/Makefile -> build/moo2 -> build/moo2/Makefile 
    build/moo2/libmoo.a -> build/moo2 -> build/moo2/Makefile -> build/moo2/libmoo.a 

はまた.abspathを使用せずに試してみましたが、それshouldnそれは問題なのでしょうか?

私は、任意のサイクルが表示されない:

  • ビルド/ MoO2が/ libmoo.a
  • ビルド/ MoO2が/ Makefileを必要とし、ビルド/ MoO2が/ Makefileは、ビルドが必要です/ MoO2が
  • ビルド/ MoO2がが必要です(ソース/)ムー

どのようにサイクルが見られますか? build/moo2/Makefileはbuild/moo2/libmoo.aに依存していると思います。これは私が指定しようとしていないものです。

どれ関連の提案もenv.Dir( 'MOO')の必要はありません:-)

答えて

5

歓迎されている。あなたのSConscriptの任意の場所にABSPATH。だから、それを変更します

Import('env') 
env.Command('moo2', '#moo', ["echo copying moo to the build dir", Copy("$TARGET", "$SOURCE")]) 
env.Command('moo2/Makefile', 'moo2', 'echo would run moo2.configure') # Look Here 
moolib = env.Command('moo2/libmoo.a', 'moo2/Makefile', 'echo would run make') 
Default(moolib) 

しかし、それはまだ同じエラーが得られます。

scons: *** Found dependency cycle(s): 
build/moo2/Makefile -> build/moo2 -> build/moo2/Makefile 
build/moo2/libmoo.a -> build/moo2/Makefile -> build/moo2/libmoo.a 

、なぜそれがありますか? SConsは自動的に、ディレクトリ内のすべてのファイルに依存します。 「#ここを見てください」というコメントがある行を参照してください。依存関係を追加しました。moo2/Makefileはmoo2に依存しています。 moo2はデフォルトですべてのコンテンツに依存し、したがってあなたのサイクルに依存します。

どうすれば修正できますか?

Import('env') 
env.Install('moo2',Glob('#moo/*')) 
env.Command('moo2/Makefile', env.Glob('moo2/*'), 'echo would run moo2.configure') 
moolib = env.Command('moo2/libmoo.a', 'moo2/Makefile', 'echo would run make') 
Default(moolib) 

私はCopy()をenv.Install()に変更しました。 CopyはBuild Environment()オブジェクトには付属していないので、バリアントdirについては認識しません。 Install()とCopy()は機能的に同等であり、env.Install()はenvを認識しています。 また、ディレクトリ自体ではなく、ディレクトリ内のすべてのファイルに応じてコピーしています。

/opt/local/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python /Users/bdbaddog/devel/scons/trunk/bootstrap/src/script/scons.py --tree=prune 
scons: Reading SConscript files ... 
scons: done reading SConscript files. 
scons: Building targets ... 
Install file: "moo/abc.c" as "build/moo2/abc.c" 
Install file: "moo/configure" as "build/moo2/configure" 
Install file: "moo/def.c" as "build/moo2/def.c" 
echo would run moo2.configure 
would run moo2.configure 
echo would run make 
would run make 
+-build/moo2/libmoo.a 
    +-build/moo2/Makefile 
    | +-build/moo2/abc.c 
    | | +-moo/abc.c 
    | +-build/moo2/configure 
    | | +-moo/configure 
    | +-build/moo2/def.c 
    | | +-moo/def.c 
    | +-/bin/echo 
    +-/bin/echo 
scons: done building targets. 

(注)このフラグはSConsは依存関係ツリーをプリントアウトしており、ツリー内の重複を剪定(その2つのファイルが依存している場合だろう「--tree =プルーン」:

今度は、試してみることを与えてみましょうファイルの同じツリー上では、一度しか表示されません)

+0

ポストに感謝します。いくつかのファイルを私のバリアントディレクトリにコピーするだけで、2つのコマンドを使ってSConscriptファイルを作成することができます: Import( 'env') env.Install( ''、Glob( '#kernels/*。cl')) – NoahR