2011-09-12 11 views
5

मैं स्रोत डीआईआर से बिल्ड डीआईआर तक मेकफ़ाइल प्रोजेक्ट की प्रतिलिपि बनाने के लिए स्कैन प्राप्त करने की कोशिश कर रहा हूं और libmoo.a का उत्पादन करने के लिए कुछ आदेश चलाता हूं, लेकिन मैं एक निर्भरता चक्र त्रुटि में चल रहा हूं। विवरण का पालन करें:स्कॉन्स: निर्भरता चक्र?

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

त्रुटि चल 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 

इसके अलावा .abspath का उपयोग किए बिना की कोशिश की, लेकिन वह shouldn कोई फर्क नहीं पड़ता, है ना?

मैं किसी भी चक्र नहीं दिख रहा है:

  • निर्माण/moo2/libmoo.a निर्माण की आवश्यकता है/moo2/Makefile
  • निर्माण/moo2/Makefile की आवश्यकता है निर्माण/moo2
  • निर्माण/moo2 की आवश्यकता है (स्रोत /) moo

स्कॉन्स चक्र को कैसे देख रहा है? ऐसा लगता है कि बिल्ड/moo2/मेकफ़ाइल बिल्ड/moo2/libmoo.a पर निर्भर करता है, जो कि मैं निर्दिष्ट नहीं करना चाहता हूं।

उससे संबंधित सभी सुझावों का भी स्वागत :-)

उत्तर

5

env.Dir ('मू') के लिए कोई ज़रूरत नहीं है कर रहे हैं। Abspath अपने SConscript में कहीं भी। ताकि के लिए इसे बदल जाएगा:

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 

तो ऐसा क्यों है? स्कैन स्वचालित रूप से निर्देशिका को निहित सभी फ़ाइलों पर निर्भर करता है। "# यहां देखें" टिप्पणी के साथ लाइन देखें। आपने एक निर्भरता moo2/मेकफ़ाइल जोड़ा है अब 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) 

मैं कॉपी() से env.Install() का उपयोग करने से बदल गया हूं। चूंकि प्रतिलिपि पर्यावरण() ऑब्जेक्ट से कॉपी नहीं जुड़ा हुआ है, इसलिए यह संस्करण डीआईआर के बारे में नहीं पता होगा। इंस्टॉल() और कॉपी() कार्यात्मक रूप से समकक्ष हैं, 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. 

नोट "--tree = काटना" इस ध्वज SCons पेड़ (में बाहर निर्भरता पेड़ प्रिंट और दोहराव काटना होगा, इसलिए यदि एक 2 फ़ाइलें निर्भर फाइलों के उसी पेड़ पर, आप इसे केवल एक बार देखेंगे)

+0

पोस्ट के लिए धन्यवाद। बहुत कुछ फ़ाइलों को मेरी संस्करण निर्देशिका में कॉपी करें, दो आदेशों के साथ एक स्कॉन्स्क्रिप्ट फ़ाइल मेरे लिए काम करती है: आयात ('env') env.Install ('', ग्लोब ('# कर्नेल/*। Cl')) – NoahR

संबंधित मुद्दे