2012-02-20 12 views
5

गिरी MakefileMakefile नियम त्रुटि: *** मिश्रित निहित और सामान्य नियमों

# Modules                                            
/%/: prepare scripts FORCE 
    $(cmd_crmodverdir) 
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \ 
    $(build)=$(build-dir) 
%.ko: prepare scripts FORCE 
    $(cmd_crmodverdir) 
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \ 
    $(build)=$(build-dir) $(@:.ko=.o) 
    $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost 

में त्रुटि Makefile मिश्रित निहित और सामान्य नियमों के कारण। (प्रदत्त कोड पर पहली स्ट्रिंग के लिए)

मुझे लगता है कि /%/ वाक्यविन्यास के साथ कुछ गलत है, मैं इसे कैसे सुधार सकता हूं?

अब तक मैं नियमों इस तरह से अलग करने के बारे में सोच रहा हूँ:

# Modules                                            
/: prepare scripts FORCE 
    $(cmd_crmodverdir) 
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \ 
    $(build)=$(build-dir) 
%/: prepare scripts FORCE 
    $(cmd_crmodverdir) 
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \ 
    $(build)=$(build-dir) 
%.ko: prepare scripts FORCE 
    $(cmd_crmodverdir) 
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \ 
    $(build)=$(build-dir) $(@:.ko=.o) 
    $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost 

लेकिन यह मेरे लिए भ्रामक है।

उत्तर

4

आपको क्या लगता है कि / %/ नियम कर रहा है (आपको और make - और मुझे भ्रमित करने के अलावा)? %/ बिट के साथ आप क्या हासिल करने की कोशिश कर रहे हैं?

आपके पास कोलन के बाईं ओर दो (या अधिक) लक्ष्य हो सकते हैं, लेकिन दोनों को प्रतिशत-कम होने की आवश्यकता है।

prog1 prog2: something 
    $(CC) -o [email protected] [email protected] ${LIBRARIES} 

% metacharacter यह किसी भी % बिना एक नियम के साथ नहीं किया जा सकता है, लेकिन make व्याख्या करने के तरीके:

/ %/: 
रूप prog1 prog2 उदाहरण की तरह

, लेकिन लक्ष्यों में से एक है एक % और दूसरा नहीं है, और आपको इन्हें मिश्रण करने की अनुमति नहीं है। / नियम स्पष्ट नियम है; यह आपके सिस्टम की मूल निर्देशिका को अद्यतन करने के निर्देशों पर प्रतीत होता है। %/ निहित नियम है; यह निर्देशिका को अद्यतित करने से संबंधित कुछ कर सकता है।


टिप्पणियों से कुछ सामग्री को कॉपी करना:

DIRECTORY_BUILD_RULES = \ 
    $(cmd_crmodverdir); \ 
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) $(build)=$(build-dir) 

/: prepare scripts FORCE; $(DIRECTORY_BUILD_RULES) 

%/: prepare scripts FORCE; $(DIRECTORY_BUILD_RULES) 

इस टिप्पणी से काम करना चाहिए (जो कारण है कि मैं यह टिप्पणी में प्रयोग किया जाता है), लेकिन क्या मैं एक makefile में लिखना होता है:

DIRECTORY_DEPENDENCIES = prepare scripts FORCE 
DIRECTORY_BUILD_RULES = \ 
    $(cmd_crmodverdir); \ 
    $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) $(build)=$(build-dir) 

/: $(DIRECTORY_DEPENDENCIES) 
    $(DIRECTORY_BUILD_RULES) 

%/: $(DIRECTORY_DEPENDENCIES) 
    $(DIRECTORY_BUILD_RULES) 

यदि यह अभी भी परेशानी का कारण बनता है, तो समीक्षा करें कि पहले (/:) नियम क्या करता है। क्या आपको यकीन है कि इसकी आवश्यकता है?

+0

अच्छा लेकिन क्या मेरा समाधान सही है? जहां तक ​​मैं समझता हूं कि मुझे इसे इस तरह से अलग करने की ज़रूरत है, लेकिन 2 बार समान चलना मेरे लिए अजीब लग रहा है। – Cynede

+2

हां; अलगाव आवश्यक होगा। हां, दो नियमों को दो बार लिखना बहुत अच्छा नहीं है। शायद कार्यों के लिए एक मैक्रो बनाएँ, और फिर नियमों में इसका उपयोग करें। 'DIRECTORY_BUILD_RULES = $ (cmd_crmodverdir); $ (क्यू) $ (बनाने) KBUILD_MODULES = $ (यदि $ (CONFIG_MODULES), 1) $ (बिल्ड) = $ (बिल्ड-डीआईआर) ', फिर:' /: स्क्रिप्ट्स फोर्स तैयार करें; $ (DIRECTORY_BUILD_RULES) 'और'% s: स्क्रिप्ट तैयार करें; $ (DIRECTORY_BUILD_RULES) '। आप निर्भरता सूची को अन्य मैक्रो में भी बना सकते हैं ... –

+0

अब यह बताता है: रिकर्सिव चर 'DIRECTORY_BUILD_RULES' संदर्भ स्वयं (अंततः)। रूक जा। – Cynede

संबंधित मुद्दे