2009-02-16 7 views
7

क्या प्रत्येक उपयोग पर एक चर की परिभाषा का पुनर्मूल्यांकन करने का कोई तरीका है? उदाहरण के लिए:मेकफ़ाइल चर का पुनर्मूल्यांकन

MAP_FILES = $(shell find $(TMP) -name "*.map") 

all: generate_map_files work_with_map_files 

generate_map_files: 
    ./map-builder 

work\_with\_map_files: $(MAP_FILES) 
    ./map-user 

%.map: 
    ./map-edit [email protected] 

तो, MAP_FILES जब makefile पढ़ा जाता है, और अगर वहाँ निर्देशिका $ TMP में कोई .map फ़ाइलें हैं चर खाली हो जाएगा मूल्यांकन किया जाएगा। हालांकि gener_map_files नियम पूरा होने के बाद निर्देशिका में .map फ़ाइलें होंगी और मैं उन .map फ़ाइलों की सूची को work_with_map_files नियम के लिए पूर्वापेक्षाएँ करना चाहूंगा।

मुझे उत्पन्न होने से पहले .map फ़ाइलों के फ़ाइल नामों को नहीं पता है, इसलिए मैं स्पष्ट रूप से फ़ाइल नामों के साथ एक चर घोषित नहीं कर सकता। एक बार वे उत्पन्न होने के बाद मैप फ़ाइलों की सूची के साथ सेट करने के लिए चर की आवश्यकता है। कोई सुझाव बहुत उपयोगी होगा। धन्यवाद।

उत्तर

4

आप एक पुनरावर्ती मेकअप कर रही कोशिश कर सकते हैं, जैसे

MAP_FILES = $(shell find $(TMP) -name "*.map") 

all: generate_map_files 

generate_map_files: 
    ./map-builder; $(MAKE) work_with_map_files 

work\_with\_map_files: $(MAP_FILES) 
    ./map-user 

%.map: 
    ./map-edit [email protected] 
0

सामान्य रूप से मेकफ़ाइल में यह संभव नहीं है, क्योंकि यह निर्धारित करने के लिए कि कौन से लक्ष्य बनाना है और किस क्रम में make नियमों को निष्पादित करने से पहले अग्रिम में अपनी निर्भरताओं को जानना आवश्यक है।

आपके उदाहरण में, makework_with_map_files नियम में $(MAP_FILES) का मूल्यांकन करने के लिए कैसे पता चलेगा? आदेश स्पष्ट रूप से परिभाषित नहीं किया गया है, लेकिन निर्भरताओं से लिया गया है। आपके उदाहरण में आप generate_map_files नियम निष्पादित किए जाने के बाद मूल्यांकन करना चाहते हैं, लेकिन make के लिए यह जानने के लिए कोई रास्ता नहीं है कि इसे इस चर के मान को जानने की आवश्यकता है, जिस पर यह निर्धारित करने के लिए आवश्यक है मूल्य का मूल्यांकन किया जाएगा - यह एक आत्म-संदर्भित पाश है।

एक साधारण चाल निश्चित रूप से दो बार बनाने के चलाने के लिए हो सकता है - आपको लगता है कि generate_map_files टेम्पलेट में ./mapbuilder आदेश के बाद एक make work_with_map_files आदेश जोड़कर स्वचालित रूप से किया हो सकता है, लेकिन सामान्य रूप में इस के साथ सावधान रहना है क्योंकि अगर work_with_map_files वास्तव में घोषित किया जाएगा generate_map_files (जो इसे करना चाहिए) पर निर्भर रहने के लिए यह एक अनंत रिकर्सिव make पाश का कारण बन जाएगा। और निश्चित रूप से यह आदेश को निर्धारित करने के make के विचार को हरा देता है। अन्यथा आपको make प्रतिस्थापन की आवश्यकता होगी जिसे इस तरह के आदेशों पर संकेत दिया जा सकता है और एकाधिक पास कर सकते हैं।

यही कारण है कि बड़ी कोड ठिकानों में एक से अधिक के साथ फ़ाइलें, जहां एक दोहराने के लिए Makefile में निर्भरता शामिल नहीं चाहता है, शामिल हैं makedepend अक्सर उन निर्भरता के साथ एक अलग Makefile, जो में शामिल है उत्पन्न करने के लिए प्रयोग किया जाता है मुख्य Makefile। एक बनाने के लिए पहले make depend चलाता है जो फ़ाइल निर्भरताओं को उत्पन्न करने के लिए makedepend पर कॉल करता है, और फिर make

3
जीएनयू साथ

कुछ करते हैं तो आप makefile रीमेकिंग सुविधा है, जिसकी वजह जीएनयू आप पुन: प्रारंभ करने के लिए कर का लाभ ले सकते है, तो शामिल makefiles के किसी भी बदल रहे हैं प्रारंभिक पास के दौरान। उदाहरण के लिए:

.PHONY: map_files.d 
-include map_files.d 
map_files.d: 
     ./map_builder 
     echo "work_with_map_files: `ls *.map`" > map_files.d 

work_with_map_files: 
     ./map_user 

makefile रीमेकिंग सुविधा के अलावा, इस समाधान तथ्य यह है कि जीएनयू मेकअप आप एक लक्ष्य के लिए आवश्यक शर्तें के कई पंक्तियों निर्दिष्ट कर सकते हैं का उपयोग करता है। इस मामले में, मानचित्र फ़ाइल prereqs गतिशील रूप से जेनरेट की गई map_files.d फ़ाइल में घोषित की जाती है। PHONY लक्ष्य के रूप में map_files.d को घोषित करना सुनिश्चित करता है कि जब आप बिल्ड चलाते हैं तो यह हमेशा पुन: उत्पन्न होता है; जो आपकी आवश्यकताओं के आधार पर उचित हो सकता है या नहीं भी हो सकता है।