2011-09-12 30 views
5

Ben Scons inşa dir kaynak dir gelen bir Makefile proje kopyalayıp libmoo.a üretmek için bazı komutlar çalıştırmak için almaya çalışıyorum, ancak bir bağımlılık döngüsü hata içine çalıştırıyorum. Detaylar izleyin:SCons: Bağımlılık döngüleri?

./SConstruct:

env = Environment() 
Export('env') 

dirs = ['.'] 

variant_dir = 'build' 

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

./SConscript:

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) 

Hata çalışan scons:

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 
Ayrıca

.abspath kullanmadan çalıştı, ama bu olmamalı önemli değil mi?

herhangi döngüleri görmüyorum:

  • inşa/moo2/libmoo.a inşa gerektirir/moo2/Makefile
  • inşa/moo2/Makefile moo2
  • inşa/moo2 gerektirir inşa/gerektirir (kaynak /) moo

Nasıl scons bir döngü kabul ediyor? O yapı/moo2/Makefile Belirtmemeyi amaçlanan ne değildir inşa/moo2/libmoo.a bağlıdır düşünüyor.

İlgili tüm önerileri

abspath her yerde SConscript içinde. Ayrıca karşılama :-)

cevap

5

env.Dir ('Moo') gerek yoktur vardır. Yani bunu değiştirecek:

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) 

Ama bu hala aynı hata verir:

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

Öyleyse neden? Scons otomatik bir dizin içinde bulunan tüm dosyaları bağlıdır yapar. "# İşte bak" yorum ile satırda gösterir. Bir bağımlılık eklediniz moo2/Makefile şimdi moo2'ye bağlı. moo2, varsayılan olarak tüm içeriğini ve dolayısıyla döngüsüne bağlıdır.

yüzden bunu nasıl düzeltebilirim?

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) 

Env.Install() öğesinden Copy() yöntemini kullanarak değiştirdim. Copy, Environment() nesnesine eklenmediğinden, varyant dir hakkında bilgi sahibi olmaz. Install() ve Copy() işlevi, env.Install() öğesinin tanıma özelliğiyle işlevsel olarak eşdeğerdir. Ayrıca dizinin kendisinden ziyade dizindeki tüm dosyalara/kopyalamaya/kopyalamaya sahibim. Şimdi

en verelim denemek için bir:

/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. 

Not "--tree = budamak" Bu bayrak Scons ağacı (tekrarları bağımlılık ağacının çıktısını ve erik olacak böylece 2 dosya bağlıysa aynı dosya ağacında, sadece bir kez görürsünüz)

+0

Gönderi için teşekkürler. Çok basitçe bazı dosyaları benim varyant dizine kopyala, benim için iki komutla çalışan bir SConscript dosyası: İthalat ('env') env.Install ('', Glob ('# kernels/*. Cl')) – NoahR

İlgili konular