2012-07-09 10 views
7

कुछ दिन पहले मैंने पदानुक्रमित बनाने (http://stackoverflow.com/questions/1498213/make-hierarchical-make-file) लिखने के बारे में स्टैक ओवरफ़्लो में एक उत्तर पोस्ट किया था। जवाब हटा दिया गया था, इसलिए मुझे लगता है कि यह पूरी तरह से गलत था या विषय (या दोनों) बंद था।एक सरल पदानुक्रमित मेकफ़ाइल कैसे लिखें?

मैं जानना चाहता हूं कि पदानुक्रमित मेकफ़ाइल कैसे लिखना है। यह एक मेकफ़ाइल है जो उप-निर्देशिकाओं में कई मेकफ़ाइल कॉल करता है। मैं की तरह एक निर्देशिका संरचना मान:

- project 
    |--module1 
     |--Makefile 
     |--... 
    |--module2 
    |--Makefile 
    |--module2.1 
    |--module2.2 
    |--... 
    |--module3 
    |--Makefile 
    |--... 
    |--etc 

मैं भी मान लेते हैं कि परियोजना के सदस्यों केवल केवल तरह makefile लक्ष्यों की एक न्यूनतम सेट पर सहमत हो गए हैं: सभी (डिफ़ॉल्ट), स्वच्छ स्थापित है, और इसलिए। तो, निम्न कमांड सहित बनाने के झंडे मॉड्यूल के लिए प्रचार किया जाएगा:

cd project 
make clean 
make -k 
make install 
#etc 

क्या निम्नलिखित परियोजना Makefile साथ कुछ गड़बड़ है:

PACKAGES = \ 
    module1 \ 
    module2 \ 
    emodule3 

VIRTUAL_PACKAGES = $(addsuffix /.virtual.Makefile,${PACKAGES}) 

TARGETS=clean install all 

.PHONY: $(TARGETS) 
default: all 

FLAGS = $(ifeq $(MAKEFLAGS) "","",-$(MAKEFLAGS)) 

$(TARGETS): $(VIRTUAL_PACKAGES) 

$(VIRTUAL_PACKAGES): 
    $(MAKE) $(FLAGS) -C $(@D) $(MAKECMDGOALS) 

हाँ, Makefile में $ VIRTUAL_PACKAGES अजीब लग रहा है। पाश के लिए एक मिश्रण के वैकल्पिक थोड़ा कम है लेकिन मुझे यकीन है कि अगर यह बेहतर है नहीं कर रहा हूँ (जैसा कि मैंने पार्टी पर भरोसा करने की जरूरत): = \ module1 \ module2 \ emodule3

TARGETS=clean install all 

.PHONY: $(TARGETS) 
default: all 

FLAGS = $(ifeq $(MAKEFLAGS) "","",-$(MAKEFLAGS)) 

$(TARGETS): 
    for p in $(PACKAGES) ; do $(MAKE) $(FLAGS) -C $$p [email protected] || break; done 

धन्यवाद संकुल !

+0

'FLAGS' काम करने के लिए है कि काम करता है? मेक का कौन सा संस्करण आप उपयोग कर रहे हैं? – Beta

+0

एक गैर-पुनरावर्ती समाधान: http://stackoverflow.com/a/7321954/412080 –

+0

मई या आपके लिए उपयोगी नहीं हो सकता है, लेकिन जटिल परियोजनाओं के प्रबंधन के लिए मुझे सेमेक रास्ता आसान लगता है। CMakeLists.txt का पदानुक्रम होना वास्तव में आसान है। मेकफ़ाइल स्वचालित रूप से जेनरेट हो जाएंगे। – Hindol

उत्तर

7

यहां "ड्रेगन" हैं। यह किया जा सकता है, लेकिन प्रभाव मुश्किल हो सकता है।

Google, "रिकर्सिव को हानिकारक माना जाता है"। आप जो भी चाहते हैं (उदाहरण के लिए, पदानुक्रमित-निर्माण) के साथ-साथ नुकसान/चिंताओं के अच्छे स्पष्टीकरण के बारे में आपको बहुत अच्छे (सरल) चित्र मिलेगा। कुछ "प्रतिक्रियाएं" संभावित "सर्वोत्तम प्रथाओं" और समस्याओं को कम करने के तरीकों पर चर्चा करेंगे। फिर, आप यह तय कर सकते हैं कि उठाए गए मुद्दे आपके आवेदन के लिए मजबूर हैं या नहीं।

मूल कागज:

http://miller.emu.id.au/pmiller/books/rmch/

कुछ अन्य लिंक:

http://c2.com/cgi/wiki?RecursiveMakeConsideredHarmful

http://dbaspot.com/configuration-management/194597-thoughts-recursive-make-considered-harmful.html