2010-06-23 12 views
19

मेरे पास एक निर्देशिका images/ है जो मैं मेकफ़ाइल के भीतर से build/images/ पर प्रतिलिपि बनाना चाहता हूं। निर्देशिका में उपनिर्देशिका के कई स्तर हो सकते हैं। ऐसा करने का सबसे शानदार तरीका क्या होगा? मैं चाहता हूँ:मेकफ़ाइल में निर्देशिका की प्रतिलिपि कैसे करें?

  • निर्दिष्ट करने के लिए प्रत्येक make रन पर एक पूर्ण निर्देशिका प्रतिलिपि (यानी कोई cp -r)
  • गारंटी स्थिरता (यानी अगर एक फ़ाइल images/ में बदल यह स्वचालित रूप से build/images/ में अद्यतन किया जाना चाहिए)
  • से बचने से बचने प्रत्येक छवि के लिए एक नियम और Makefile
  • में प्रत्येक उपनिर्देशिका, make भीतर इस मुद्दे को हल ताकि कोई rsync या cp -u यदि संभव हो तो

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

+1

इस पर एक नज़र डालें: http://stackoverflow.com/questions/2483182/recursive-wildcards-in-gnu-make/2483203#2483203 ('कन्वर्ट' के बजाय 'cp') लेकिन मैं व्यक्तिगत रूप से सोचता हूं कि 'rsync' का उपयोग क्लीनर और अधिक मजबूत है। –

उत्तर

27

ठीक है, मैं बस rsync का उपयोग करता हूं। कोई भी make स्क्रिप्ट जो आप इन बाधाओं के साथ बनाएंगे, केवल इसकी कार्यक्षमता को दोहराएगी, और शायद अधिक धीमी हो जाएगी और इसमें बग हो सकती है। एक उदाहरण नियम देख सकता है:

build/images: 
    rsync -rupE images build/ 

.PHONY: build/images 

(हर बार नियम को ट्रिगर करने के लिए।)।

शायद सिम्लिंक या हार्डलिंक का उपयोग किया जा सकता है?

build/images: 
    ln -s ../images build/images 

तुम सच में rsync और लिंक से बचने के लिए चाहते हैं, तो इस टुकड़े उन्हें किसी भी तरह reimplements (, परीक्षण नहीं की जरूरत है find, mkdir और सादे cp):

image_files:=$(shell find images -type f) 
build/images/%: images/% 
    mkdir -p $(@D) 
    cp $< [email protected] 

build: $(patsubst %,build/%,image_files) 
+2

जब आप स्रोत पेड़ से हटाए जाते हैं तो फ़ाइलों को निकालने के लिए आप 'rsync' कमांड में '--delete'' जोड़ना चाहेंगे। – bitmusher

+0

'-पी' का उपयोग होने पर rsync' -E' को अनदेखा करता है। –