2011-11-24 13 views
5

मैं स्कैन का उपयोग करके एक बिल्ड सिस्टम तैयार करने की कोशिश कर रहा हूं। मैं कोड जनरेशन चरण के लिए clang और अन्य सभी चीज़ों के लिए एक कस्टम कंपाइलर टूलचेन का उपयोग करना चाहता हूं।कोड जनरेशन और असेंबली के लिए अलग-अलग टूल्स का उपयोग करने के लिए स्कैन कॉन्फ़िगर करना

डिफ़ॉल्ट रूप से, 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 गुजरती हैं।

for file in Glob('*.c'): 
    sources += env.CodeGenerator(file) 

env.Program('say_hello', sources) 

यह किसी भी चर को संशोधित नहीं करता है, यह अच्छी तरह से काम करता है। मुझे gcc का उपयोग करके निष्पादन योग्य मिलता है।

हालांकि, जब मैं उचित चर को प्रतिस्थापित करने का प्रयास करता हूं ताकि SCons कस्टम टूलचेन का उपयोग कर सकें (env.Replace(CC='clang')... का उपयोग करके), केवल एक असेंबली फ़ाइल उत्पन्न होती है। मेरे कस्टम Builder किसी अन्य फाइल पर नहीं बुलाया जाता है और SCons केवल एक ही वस्तु फ़ाइल के साथ

  1. लिंक करने के लिए (जो स्पष्ट रूप से विफल रहता है) मैं SCons सभी फाइलों पर बिल्डर चलाने के लिए और जोड़ने के लिए उन वस्तु फ़ाइलों को शामिल कर सकते हैं कैसे की कोशिश करता है ?
  2. क्या मैं क्या करने की कोशिश कर रहा हूं इसे पूरा करने का एक बेहतर तरीका है? मैं बस स्कैन के साथ काम करना शुरू कर रहा हूँ।

उत्तर

3

Builder वर्ग कि SCons man page पर लिखित हैं के लिए कीवर्ड तर्क, कि उपयोगकर्ता के मैनुअल में वर्णित नहीं हैं की एक बड़ी संख्या में हैं। यह स्कॉन्स के लिए प्रलेखन में कमजोर बिंदुओं में से एक है, और कुछ समय के लिए किया गया है।

इस मामले में, मुझे विश्वास है कि आप single_source कीवर्ड तर्क के लिए देख रहे हैं जो:

निर्दिष्ट करता है कि इस बिल्डर ठीक एक प्रति कॉल स्रोत फ़ाइल की उम्मीद है। लक्ष्य फ़ाइलों के बिना एक से अधिक स्रोत फ़ाइल देने के परिणामस्वरूप अंतर्निहित रूप से निर्माता को कई बार कॉल कर रहा है (एक बार प्रत्येक स्रोत दिए गए) के लिए।

Builder के लिए स्रोत को देखते हुए एकल_सोर्स को सही (या समकक्ष) का मूल्यांकन करने की आवश्यकता है। तो आपका कोड एक बहुत मामूली संशोधन के साथ फिर से लिखा जा सकता है।

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

आप किस स्कैन का उपयोग कर रहे हैं? –

+0

मैक पर होमब्रू का उपयोग करके स्थापित: स्क्रिप्ट: v2.1.0.r5357 इंजन: v2.1.0।r5357 – Buzzy