2011-05-18 20 views
7

मेरे पास द्वारा उनके root in a directory layout में कई विजेट हैं।मेकफ़ाइल निर्भरताओं को ढूंढना

जीएनयूमेकफाइल मैं यहां उन्हें बनाने में सक्षम हूं। हालांकि अगर मैं फ़ोल्डरों को अद्यतन करता हूं, तो निर्भरताओं को ट्रैक नहीं किया जाता है। मैं स्पष्ट रूप से एक स्वच्छ लक्ष्य पर निर्भर नहीं होना चाहता, तो मैं प्रत्येक फ़ोल्डर की सामग्री को कैसे ट्रैक करूं?

WGTS := $(shell find -name 'config.xml' | while read wgtdir; do echo `dirname $$wgtdir`.wgt; done) 
all: $(WGTS) 
%.wgt: 
    @cd $* && zip -q -r ../$(shell basename $*).wgt . 
    @echo Created [email protected] 
clean: 
    rm -f $(WGTS) 

मैं की तरह कुछ आशा व्यक्त की:

%.wgt: $(shell find $* -type f) 

काम करेंगे, लेकिन ऐसा नहीं है। Help

+0

तो ... आप 'foo.wgt'' foo /' में सबकुछ पर निर्भर रहने के लिए चाहते हैं? – Beta

+0

यह सही है ... – hendry

उत्तर

4

मेरा साथ Beta's idea का मेल:

 
WGTS := $(shell find -name config.xml) 
WGTS := $(WGTS:/config.xml=.wgt) 
WGTS_d := $(WGTS:.wgt=.wgt.d) 

all: $(WGTS) 
clean: 
    rm -f $(WGTS) $(WGTS_d) 

-include $(WGTS_d) 

define WGT_RULE 
$(1): $(shell find $(1:.wgt=)) 
$(1:.wgt=)/%: 
    @ 
endef 
$(foreach targ,$(WGTS),$(eval $(call WGT_RULE,$(targ)))) 
%.wgt: 
    @echo Creating [email protected] 
    @(echo -n "[email protected]: "; find $* -type f | tr '\n' ' ') > [email protected] 
    @cd $* && zip -q -r ../$(shell basename $*).wgt . 

उदाहरण:

 
$ mkdir -p foo bar/nested 
$ touch {foo,bar/nested}/config.xml 
$ make 
Creating bar/nested.wgt 
Creating foo.wgt 
$ make 
make: Nothing to be done for `all'. 
$ touch foo/a 
$ make 
Creating foo.wgt 
$ rm foo/a 
$ make 
Creating foo.wgt 
$ make 
make: Nothing to be done for `all'. 

केवल संभावित समस्या यहां डमी नियम देता है कि लक्ष्य पर ध्यान न दें बनाना यह कैसे निर्माण करने के लिए पता नहीं है जो निर्देशिकाओं के अंदर घोंसला हैं। (मेरे उदाहरण में foo/a।) यदि वे वास्तविक लक्ष्य हैं जो बनाने के लिए आवश्यक हैं, तो डुप्लिकेट रेसिपी परिभाषा एक समस्या हो सकती है।

+0

मुझे इसे नई फ़ाइलों को जोड़ने के लिए खाते की आवश्यकता है। उस .wgt.d चीज़ को लिखने की आवश्यकता को समझ में नहीं आता है, यह मुझे क्रूर लगता है। Config.xml के अंदर config.xml के साथ कोई मामला नहीं होगा। :) – hendry

+0

@ हेन्ड्री: निर्भरता फाइलों को लिखना, उन सभी जानकारी को पुन: उत्पन्न किए बिना उन्हें बाद के रनों पर शामिल करने देता है। यह ज्यादातर मामलों के लिए अच्छी तरह से काम करता है (और आमतौर पर हेडर पर सी-स्रोत निर्भरता उत्पन्न करने के लिए उपयोग किया जाता है); लेकिन यह उन फ़ाइलों को जोड़ने वाली फ़ाइलों को संभाल नहीं सकता है जो केवल फाइल सिस्टम स्थिति पर निर्भर करते हैं। –

+0

@ थॉमस यह मेकफ़ाइल फाइलों को हटाने के साथ-साथ फ़ाइलों को हटाने के लिए भी खाता कर सकता है, हालांकि मैं इसे अपने मनमाने ढंग से निर्देशिका संरचना के लिए अनुकूलित नहीं कर सकता, मेरे विगेट्स http://tests.wacapps.net/?p=wac2tests;a= में हैं ब्लॉब; च = नमूने/Makefile; मुझे लगता है कि अगर हम समझ गए हैं कि http://www.gnu.org/s/hello/manual/make/Secondary-Expansion.html हमें जवाब मिलेगा – hendry

1

शायद यह करने के लिए सबसे अच्छा तरीका है, स्पष्ट रूप से शर्त सूचियां बनाना है पहले से:

define WGT_RULE 
$(1).wgt: $(wildcard $(1)/*) 
endef 

$(foreach targ,$(WGTS),$(eval $(call WGT_RULE,$(targ)))) 

एक और तरीका है कि बहुत चालाक (एक मुहावरा है कि एक अच्छा प्रोग्रामर सावधान करता है) है नहीं है। सालों पहले मैं एक शर्त के रूप में एक निर्देशिका के इलाज के लिए एक बाएं हाथ के साथ आया था। अगर मैं उपरोक्त पर्याप्त नहीं है तो मैं देखूंगा कि क्या मैं अपनी पुरानी नोटबुक खोद सकता हूं।

संपादित करें:
क्षमा करें, मैं उपनिर्देशिका विचार नहीं किया। यहां एक पूर्ण मेकफ़ाइल है (मैंने clean नियम छोड़ा) जो चाल चलाना चाहिए।

WGTS := $(shell find -name 'config.xml' | while read wgtdir; do echo `dirname $\ 
$wgtdir`.wgt; done) 
all: $(WGTS) 

# This constructs a rule without commands ("foo.wgt: foo/bar.txt foo/baz.dat..."). 
define WGT_RULE 
$(1).wgt: $(shell find $(1)) 
endef 

# This invokes the above to create a rule for each widget. 
$(foreach targ,$(WGTS),$(eval $(call WGT_RULE,$(targ)))) 

%.wgt: 
    @cd $* && zip -q -r ../$(shell basename $*).wgt . 
    @echo Created [email protected] 
+0

मैंने बस उप-निर्देशिका में एक नई फ़ाइल बनाने की कोशिश की और मेकफ़ाइल इसे नहीं उठाया। :(क्या इस WGT_RUL से बचने का कोई तरीका है? यह मेरे लिए थोड़ा अनावश्यक लगता है। मैं इसे '% .wgt के अधिकार में पसंद करूंगा: 'मुश्किल होने के लिए खेद है ... – hendry

+0

यह काम नहीं करता है:' हेन्ड्री @ x201 foo $ mkdir बार Hendry @ X201 foo $ स्पर्श बार/config.xml Hendry @ X201 foo $ खोज करते हैं: './bar.wgt ': इस तरह के कोई फ़ाइल या निर्देशिका बनाया bar.wgt Hendry @ X201 foo $ बनाने मेकअप: कुछ नहीं के लिए 'सब किया जाना ' Hendry @ X201 foo $ vim Makefile Hendry @ X201 foo $ स्पर्श बार/foo Hendry @ X201 foo $ बनाने मेक:। कुछ भी नहीं है' सभी के लिए किया जा करने के लिए'। हेन्ड्री @ x201 foo $ ' – hendry