2009-04-01 7 views
5

मैं एक "क्लीनअप" लक्ष्य इंजेक्ट करना चाहता हूं जो कि बंद होने से पहले कई अन्य लक्ष्यों पर निर्भर करता है और कुछ लॉग फ़ाइलों को gzip पर निर्भर करता है। यह महत्वपूर्ण है कि मैं जल्दी से gzip नहीं है क्योंकि इससे कुछ टूल्स विफल हो सकते हैं।स्कैन में, मैं एक लक्ष्य को कैसे इंजेक्ट कर सकता हूं?

स्कैन के निष्पादन के लिए मैं क्लीनअप लक्ष्य कैसे इंजेक्ट कर सकता हूं?

उदा। मेरे पास फू और बार लक्ष्य है। मैं

% scons foo cleanup 

निर्दिष्ट करने के लिए, 'सफाई' है कि foo और बार पर निर्भर करता है और बाद में वे दोनों काम हो गया चलाता नामक एक नए कस्टम लक्ष्य इंजेक्षन करने के लिए उपयोगकर्ता बिना चाहते हैं मैं उन्हें टाइप करना चाहते हैं:

% scons foo 

लेकिन SCons पर अमल के रूप में यद्यपि उपयोगकर्ता लिखा हो

% scons foo cleanup 

मैं सफाई लक्ष्य बनाने और sys.argv को जोड़कर की कोशिश की है है, लेकिन ऐसा लगता है कि पहले से ही SCons द्वारा sys.argv संसाधित यह मेरे कोड पर आता है, इसलिए यह 'क्लीनअप' लक्ष्य को संसाधित नहीं करता है जिसे मैं मैन्युअल रूप से sys.argv में जोड़ता हूं।

उत्तर

1

SCons के संस्करण 1.1.0.d20081104 में, आप निजी आंतरिक SCons विधि का उपयोग कर सकते हैं यदि उपयोगकर्ता प्रकार:

% scons foo bar 

ऊपर कोड स्निपेट SCons व्यवहार करने के लिए कारण होगा जैसे कि उपयोगकर्ता द्वारा लिखा गया था:

% scons foo bar MY_INJECTED_TARGET 
+1

अनियंत्रित विशेषताएं एफटीडब्ल्यू! :-) मुझे लगता है कि जब मैं इन "असुविधाजनक" समस्याओं को दबाता हूं तो अक्सर मैं स्कैन के लिए स्रोत को अपनाने का अंत करता हूं ... – richq

+0

क्या यह ब्रेक होता है जब - यादृच्छिक ध्वज का उपयोग किया जाता है? जहां तक ​​उपयोगकर्ता द्वारा प्रदान किए गए लक्ष्य बनाए गए हैं, वह अपरिभाषित है, जहां तक ​​मुझे पता है। – BenG

+1

मैं लक्ष्य को इंजेक्ट करता हूं लेकिन अन्य लक्ष्यों पर निर्भरता रखता हूं, इसलिए यह ग्राफ में चुस्त रूप से फिट बैठता है। यहां तक ​​कि यदि आप '' यादृच्छिक 'करते हैं, तो यह केवल समवर्ती चरणों को यादृच्छिक करेगा - चरण नहीं जो एक-दूसरे पर निर्भरता रखते हैं। निर्भर लक्ष्य निर्माण कमांड निष्पादित होने से पहले निर्भरता हमेशा संतुष्ट होती है। –

2

एक तरीका यह है कि gzip उपकरण लॉग फ़ाइलों के आउटपुट पर निर्भर करता है। उदाहरण के लिए, हम इस सी फ़ाइल, 'hello.c' अगर:

#include <stdio.h> 
int main() 
{ 
    printf("hello world\n"); 
    return 0; 
} 

और यह SConstruct फ़ाइल:

#!/usr/bin/python 
env = Environment() 
hello = env.Program('hello', 'hello.c') 
env.Default(hello) 
env.Append(BUILDERS={'CreateLog': 
    Builder(action='$SOURCE.abspath > $TARGET', suffix='.log')}) 
log = env.CreateLog('hello', hello) 
zipped_log = env.Zip('logs.zip', log) 
env.Alias('cleanup', zipped_log) 

फिर चल "SCons सफाई" सही क्रम में आवश्यक चरणों चलेंगे :

gcc -o hello.o -c hello.c 
gcc -o hello hello.o 
./hello > hello.log 
zip(["logs.zip"], ["hello.log"]) 

यह आपको काफी क्या निर्दिष्ट नहीं किया है, लेकिन इस उदाहरण और आपकी आवश्यकता के बीच फर्क सिर्फ इतना है कि "सफाई" कदम है कि वास्तव में ज़िप फ़ाइल बनाता है, ताकि कदम है कि आप है चलाने के लिए। इसकी निर्भरता (उस प्रोग्राम को चलाने से जो प्रोग्राम उत्पन्न करता है, उस प्रोग्राम को बनाते हैं) स्वचालित रूप से गणना की जाती है। अब आप उर्फ ​​"foo" जोड़ सकते हैं के रूप में वांछित उत्पादन प्राप्त करने के लिए इस प्रकार है:

SCons.Script._Add_Targets([ 'MY_INJECTED_TARGET' ]) 

:

env.Alias('foo', zipped_log) 
+0

विचारों के लिए धन्यवाद के BUILD_TARGETS बदलने के लिए करना है लगता है। बात यह है कि, मैं एक निर्माण प्रवाह कर रहा हूं जिसमें टुकड़े हैं जिन्हें मैं पूरी तरह से नियंत्रित नहीं करता हूं, इसलिए मैं ज़िप फ़ाइलों को पूर्व-पंजीकृत नहीं कर सकता क्योंकि मुझे सभी लॉग फाइलें नहीं बनाई जा रही हैं। –

12

आप _Add_Targets या गैर-दस्तावेजी सुविधाओं का उपयोग नहीं करना चाहिए, तो आप सिर्फ BUILD_TARGETS करने के लिए अपने लक्ष्य सफाई जोड़ सकते हैं:

from SCons.Script import BUILD_TARGETS 
BUILD_TARGETS.append('cleanup') 

अगर आप गैर-दस्तावेजी कार्यों के बजाय लक्ष्य के इस दस्तावेज सूची का उपयोग, SCons भ्रमित नहीं होना होगा अपनी बहीखाता करते समय।इस टिप्पणी को ब्लॉक SCons/Script/__init__.py में पाया जा सकता:

# BUILD_TARGETS can be modified in the SConscript files. If so, we 
# want to treat the modified BUILD_TARGETS list as if they specified 
# targets on the command line. To do that, though, we need to know if 
# BUILD_TARGETS was modified through "official" APIs or by hand. We do 
# this by updating two lists in parallel, the documented BUILD_TARGETS 
# list, above, and this internal _build_plus_default targets list which 
# should only have "official" API changes. Then Script/Main.py can 
# compare these two afterwards to figure out if the user added their 
# own targets to BUILD_TARGETS. 

तो मैं यह तो इसके बजाय सहायक कार्यों बुला

+0

यह बहुत अच्छा काम करता है! लेकिन एक फॉलो-अप सवाल होगा - मैं यह कैसे कर सकता हूं, जब मैं जिस लक्ष्य को जोड़ना चाहता हूं वह स्कैनर से आता है? अर्थात। यह रनटाइम पर उत्पादित हो जाता है। मैंने BUILD_TARGETS में जोड़ने का प्रयास किया, लेकिन इसका कोई प्रभाव नहीं पड़ा। संभवतः स्कैन बिल्डिंग शुरू करने के बाद उस सूची की जांच नहीं करता है। –

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

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