2014-09-23 9 views
5

क्या लापता निर्भरताओं के परीक्षण के लिए कोई तरीका है जो कई नौकरियों के साथ एक परियोजना संकलित करते समय दिखाता है (-जेएन जहां एन> 1)?लापता निर्भरताओं के लिए मेकफ़ाइल का परीक्षण कैसे करें?

मुझे अक्सर पैकेज का सामना करना पड़ता है, ज्यादातर ओपन सोर्स, जहां बिल्ड प्रक्रिया तब तक ठीक काम करती है जब तक मैं -j1, या -jN का उपयोग करता हूं जहां एन अपेक्षाकृत कम मूल्य 4 या 8 है, लेकिन यदि मैंने उच्च मानों का उपयोग किया 48 , थोड़ा असामान्य, अनुपलब्ध निर्भरताओं के कारण यह विफल होना शुरू हो जाता है।

मैंने खुद को एक बैश स्क्रिप्ट बनाने का प्रयास किया जो लक्ष्य दिया गया था, सभी निर्भरताओं को समझता था और स्पष्ट रूप से उन निर्भरताओं में से प्रत्येक को स्पष्ट रूप से बनाने की कोशिश करता था ताकि यह सत्यापित किया जा सके कि कोई भी अपनी पर निर्भरता नहीं खो रहा है। ऐसा लगता है कि छोटे/मध्यम पैकेज के साथ काम करना प्रतीत होता है लेकिन उदाहरण के लिए uClibc की तरह अधिक महत्वपूर्ण में विफल रहता है।

मैं यहां अपनी स्क्रिप्ट साझा कर रहा हूं, क्योंकि कुछ लोग कोड को पढ़कर मेरा क्या मतलब समझ सकते हैं। मैं यह भी आशा करता हूं कि एक और मजबूत समाधान मौजूद है और इसे वापस साझा किया जा सकता है।

#!/bin/bash 
TARGETS=$* 
echo "TARGETS=$TARGETS" 

for target in $TARGETS 
do 
    MAKE="make" 
    RULE=`make -j1 -n -p | grep "^$target:"` 
    if [ -z "$RULE" ]; then 
     continue 
    fi 

    NEWTARGETS=${RULE#* } 
    if [ -z "$NEWTARGETS" ]; then 
     continue 
    fi 

    if [ "${NEWTARGETS}" = "${RULE}" ]; then 
     # leaf target, we do not want to test. 
     continue 
    fi 

    echo "RULE=$RULE" 
# echo "NEWTARGETS=$NEWTARGETS" 
    $0 $NEWTARGETS 
    if [ $? -ne 0 ]; then 
     exit 1 
    fi 

    echo "Testing target $target" 
    make clean && make -j1 $target 
    if [ $? -ne 0 ]; then 
     echo "Make parallel will fail with target $target" 
     exit 1 
    fi 
done 
+2

मुझे यकीन है कि वास्तव में क्या सवाल है ... मैं वहाँ विस्तृत रूप से एक से समानांतर शुद्धता की पुष्टि करने के लिए किसी भी बेहतर तरीका नहीं लगता कि नहीं कर रहा हूँ आपने वर्णन किया है: प्रत्येक लक्ष्य के लिए एक बिल्ड चला रहा है और यह सत्यापित करता है कि यह काम करता है। मुझे नहीं लगता कि, हालांकि, आपको बिल्ड को '-j1' तक सीमित करना है। यदि वे '-j1' पर असफल होने जा रहे हैं तो वे निश्चित रूप से उच्च '-j' पर असफल हो जाएंगे, ताकि आप अपने निर्माण को तेज कर सकें। – MadScientist

+0

यह बड़ी परियोजनाओं पर कैसे गिरता है? क्या यह व्यावहारिक तरीके से या मैन्युअल आमंत्रण परिप्रेक्ष्य की कठिनाई/कठिनाई में विफल रहता है? –

+0

मुझे लगता है कि '-j1' मुखौटा को कई प्रीरेक मुद्दों के रूप में मजबूर करना पड़ता है क्योंकि यह खुले में मजबूर होता है। मान लीजिए कि किसी भी 'लक्ष्य: prereqA prereqB' सूचीबद्ध क्रम में prereqs बनाए गए हैं, जहां' prereqA' 'prereqB' पर निर्भर करता है, यह घोषणा किए बिना कि '-j1' के साथ असफल हो जाएगा लेकिन' -jN' से गुजर सकता है। उन prereqs ('prereqB prereqA') के क्रम को घुमाएं और '-j1' कभी विफल नहीं होगा लेकिन' -jN' हो सकता है (लेकिन समान रूप से अच्छी तरह से नहीं हो सकता है, आपको सुनिश्चित करने के लिए prereq आदेश को फ़ज़ करना होगा)। –

उत्तर

1

मैं किसी भी खुला स्रोत समाधान के बारे में पता नहीं कर रहा हूँ, लेकिन यह वास्तव में ElectricAccelerator, जीएनयू की एक उच्च प्रदर्शन कार्यान्वयन बनाने के लिए, को हल करने के लिए बनाया गया था समस्या है। यह लापता निर्भरताओं के लिए समांतर और गतिशील रूप से पता लगाने और सही में निर्माण निष्पादित करेगा, ताकि निर्माण आउटपुट समान हो जैसे कि यह क्रमशः चलाया गया हो। यह एक एनोटेटेड बिल्ड लॉग उत्पन्न कर सकता है जिसमें लापता निर्भरताओं के बारे में विवरण शामिल है।

all: abc def 

abc: 
     echo PASS > abc 

def: 
     cat abc 

gmake के बजाय emake साथ भागो इस और --emake-annodetail=history सक्षम, और जिसके परिणामस्वरूप एनोटेशन फ़ाइल इसमें शामिल हैं::

<job id="Jf42015c0" thread="f4bfeb40" start="5" end="6" type="rule" name="def" file="Makefile" line="6" neededby="Jf42015f8"> 
<command line="7"> 
<argv>cat abc</argv> 
<output>cat abc 
</output> 
<output src="prog">PASS 
</output> 
</command> 
<depList> 
<dep writejob="Jf4201588" file="/tmp/foo/abc"/> 
</depList> 
<timing invoked="0.356803" completed="0.362634" node="chester-1"/> 
</job> 

विशेष रूप से उदाहरण के लिए, इस सरल makefile abc और def के बीच एक अघोषित निर्भरता है <depList> अनुभाग से पता चलता है कि यह काम, Jf42015c0 (दूसरे शब्दों में, def), Jf4201588 पर काम करता है, क्योंकि बाद में फ़ाइल /tmp/foo/abc फ़ाइल को संशोधित करता है।

आप इसे ElectricAccelerator Huddle के साथ मुफ्त में आज़मा सकते हैं।

(अस्वीकरण: मैं ElectricAccelerator के वास्तुकार हूँ)

+0

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

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