2011-08-16 14 views
24

संभव डुप्लिकेट:
GNU Makefile rule generating a few targets from a single source fileजीएनयू बनाने: अनेक लक्ष्य एक ही नियम में

अगर मैं इस तरह की एक Makefile नियम है:

a b c: 
    echo "Creating a b c" 
    touch a b c 

output: a b c 
    cat a b c > output 

और मैं चलाने मेक-जे 9 आउटपुट

3 निर्भरताओं (ए, बी, सी) को देखता है, उन्हें कैसे उत्पन्न किया जाता है: ("बी बी" नियम ऊपर), लेकिन आगे क्या होता है? क्या यह महसूस नहीं करना चाहिए कि "बी बी" नियम केवल 3 लक्ष्यों को बनाने के लिए एक बार चलाने की जरूरत है?

यह वही कर रहा है वास्तव में करता है:

[[email protected] test]$ make -j9 output -n 
echo "Creating a b c" 
touch a b c 
echo "Creating a b c" 
touch a b c 
echo "Creating a b c" 
touch a b c                                                                  
cat a b c > output                                                                
[[email protected] test]$ 

एक ही नुस्खा चलाया जाता है 3 बार, एक बार प्रत्येक निर्भरता के लिए "उत्पादन" शासन करने के लिए!

क्या किसी को पता है कि यह इस तरह से क्यों व्यवहार करता है?

+0

संबंधित: http: // stackoverflow।कॉम/प्रश्न/3016258/उत्पन्न-एकाधिक-लक्ष्य-उपयोग-एकल-क्रिया-नियम और http://stackoverflow.com/questions/2973445/gnu-makefile-rule-generating-a-few-targets-from-a- सिंगल-सोर्स-फाइल – krlmlr

उत्तर

27

आपका a b c: नियम बनाने कि इस किसी भी इन लक्ष्यों की, नहीं उन सभी को निर्माण करने के लिए कैसे निर्माण करने के लिए कैसे है बताता है। आदेशों का विश्लेषण करने के लिए पर्याप्त स्मार्ट नहीं है और नियमों को चलाने के लिए एक बार तीनों का निर्माण होगा। जानें (output नियम से) कि इसे a, b और c पुनर्निर्माण करना होगा, तो यही वह है। यह a के लिए एक बार पहला नियम चलाता है, एक बार b और c के लिए।

आप उन्हें व्यक्तिगत रूप के पुनर्निर्माण के लिए चाहते हैं, तो ऐसा करते हैं:

a b c: 
    echo "Creating [email protected]" 
    touch [email protected] 

आप उन सभी को एक ही बार में पुनर्निर्माण कुछ इस तरह करना चाहते हैं तो:

.PHONY: things 
things: 
    echo "Creating a b c" 
    touch a b c 

output: things 
    cat a b c > output 

या बेहतर अभी भी:

THINGS = a b c 
.PHONY: things 
things: 
    echo "Creating $(THINGS)" 
    touch $(THINGS) 

output: things 
    cat $(THINGS) > output 
+2

ग्रेट उत्तर! धन्यवाद। एक नकली लक्ष्य को एकमात्र रास्ता बना रहा है, या क्या इस नियम द्वारा "** और ** बी ** और ** सी व्यक्त करने के लिए एक क्लीनर तरीका है"? – Pavel

+0

@ पावेल, मुझे क्लीनर तरीके से नहीं पता (और मैं शायद किसी भी तरह का पहला विकल्प लेगा)। लेकिन फिर भी मैं अभी भी AUZKamath के जवाब को समझने की कोशिश कर रहा हूं। – Beta

+12

देखें http://www.cmcrossroads.com/ask-mr-make/12908-rules-with-multiple-outputs-in-gnu- इस परिदृश्य से निपटने के तरीकों के सर्वेक्षण के लिए तैयार करें, जिसमें केवल "सही" gmake (पैटर्न नियम, ज़ाहिर है!) में एकाधिक आउटपुट के साथ एक नियम निर्दिष्ट करने का तरीका। –

6

एबीसी तीन अलग-अलग लक्ष्य/लक्ष्य हैं जिनके साथ इसकी कोई आवश्यकता नहीं है। मैं, ई कहने के लिए जब भी यह पूछा जाता है तो यह लक्ष्य का निर्माण करेगा।

a b c: 
    echo "Creating a b c" 
    touch a b c 

आप पूछे जाने वाले लक्ष्य का निर्माण करने के लिए कह रहे हैं जिसमें पूर्व शर्त के रूप में बी सी है। तो एक बी सी लक्ष्य क्रमशः बनाया गया है और अंत में आउटपुट बनाया गया है।

अब आपके मामले में सभी लक्ष्यों को हमेशा के लिए बनाया जाता है जब किसी एक को बुलाया जाता है। इसलिए अनावश्यक निर्माण से बचने के लिए आपको ए, बी, सी को लक्षित करने के लिए पूर्वापेक्षाएँ जोड़नी होंगी। लक्ष्य 'ए' केवल तभी बनाएं जब 'ए' मौजूद न हो। इसी तरह 'बी' और 'सी'

a b c: [email protected] 
    echo "Creating a b c" 
    touch a b c 

हालांकि यह सलाह नहीं दी जाती है। आदर्श रूप से मेकफ़ाइल लक्ष्य बहुत विशिष्ट होना चाहिए।

+2

यह काम करता है, लेकिन मैं नहीं देख सकता कि कैसे। क्या जैक केली ने आपको भेजा था? – Beta

+1

हालांकि, इसे 'मेक-जे 3 ए बी सी' के साथ चलाने पर, तीन नौकरियां बनाई जाती हैं। – krlmlr

+2

क्या कोई यह समझा सकता है कि यह कैसे काम करता है? मैं इसे https://www.gnu.org/software/make/manual/make.html#index-_0024_0040 – Xiphias

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