2012-02-12 21 views
11

मेकफ़ाइल में make कमांड को सभी उपनिर्देशिका make आदेशों (उपनिर्देशिका में मेकफ़ाइल में परिभाषित) में पुनरावर्ती रूप से निष्पादित करने के लिए कैसे आदेश दे सकता हूं?उपनिर्देशिका में रिकर्सिव मेक

उत्तर

19
  1. पढ़ें Recursive Use of Make जीएनयू के अध्याय मैनुअल करें।
  2. पीटर मिलर के Recursive Make Considered Harmful आलेख जानें।
  3. ...
  4. लाभ !!!

पी.एस. my answer से एक अलग स्नैपेट को एक अलग अभी तक संबंधित प्रश्न में एक मोटा अनुमान के रूप में उपयोग किया जा सकता है।

+2

भी पुन: रिकर्सिव मेक माना जाता है कि हानिकारक: http://evbergen.home.xs4all.nl/nonrecursive-make.html –

+1

@ माली जो पढ़ने योग्य है, निश्चित रूप से! मैंने इस विषय पर बहुत समय पहले भी प्रयोग किया है, एफवाईआई: http://abusalimov.blogspot.ru/2009/12/yet-another-implementation-of-non.html –

+0

@ wil93 प्रस्तावित संपादन के लिए धन्यवाद! मैंने एक और उत्तर के लिए एक लिंक जोड़ा जो आपके जैसा समाधान सुझाता है। –

6

@ eldar-abusalimov, आपके द्वारा पोस्ट किया गया पहला लिंक मेकफ़ाइल मानता है उपफोल्डर क्या हैं। यह हमेशा सत्य नहीं होता है, और मुझे लगता है कि @tyranitar क्या जानना चाहता है। उस मामले में, इस तरह के एक समाधान काम कर सकते हैं: (मुझे कुछ समय लगा, लेकिन मैं इसे बहुत जरूरत)

SHELL=/bin/bash 

all: 
    @for a in $$(ls); do \ 
     if [ -d $$a ]; then \ 
      echo "processing folder $$a"; \ 
      $(MAKE) -C $$a; \ 
     fi; \ 
    done; 
    @echo "Done!" 
+2

इसे शुद्ध मेक में हासिल किया जा सकता है: 'सबडिर्स: = $ (वाइल्डकार्ड * /।)'। और फिर 'सबडिर्स' पर फिर से शुरू होकर उप-मेक का आह्वान किया। –

+1

@Eldar Abusalimov: अच्छा लगता है। मुझे दिलचस्पी है, क्या आप थोड़ी अधिक जानकारी दे सकते हैं और नमूना पोस्ट स्निपेट कर सकते हैं? ('Iterating' से आपका क्या मतलब है?) – kebs

+2

मेरा मतलब है कि एक समाधान का उपयोग करना, जिसे मैंने अपने दूसरे उत्तर में प्रस्तावित किया है: http://stackoverflow.com/a/11206700/545027 –

1

मैं यहां अपने विशेष समाधान प्रस्तुत करेगा। तो

root-dir\ 
    +----subdir1 
    +----subdir2 
    ... 
    +----subdirn 

, बस इस Makefile जड़-निर्देशिका में कॉपी: मान लीजिए हम अपने स्वयं के makefile के साथ कई उप-निर्देशिका के साथ एक निर्देशिका, उन सभी को है

SUBDIRS = $(shell ls -d */) 
all: 
    for dir in $(SUBDIRS) ; do \ 
     make -C $$dir ; \ 
    done 
संबंधित मुद्दे