लिनक्स कर्नेल मेकफाइल्स Kbuild फ्रेमवर्क का उपयोग करते हैं। यद्यपि इनकी व्याख्या GNU मेक द्वारा की गई है, क्रिप्ट में अजीबोगरीब उपयोग सम्मेलनों के साथ मैक्रोज़ का एक बड़ा सेट है, इसलिए विशिष्ट मेकफाइल दिशानिर्देश लागू नहीं होते हैं। Kbuild के बारे में अच्छी बात यह है कि आपको कार्य की जटिलता को देखते हुए बहुत कम बॉयलरप्लेट की आवश्यकता होती है।
क्रिप्ट को कर्नेल स्रोत में दर्ज़ किया गया है Documentation/kbuild। मॉड्यूल लेखक के रूप में, आपको विशेष रूप से modules.txt(और दूसरों के माध्यम से कम से कम स्किम) पढ़ना चाहिए ।
अब आप जो कर रहे हैं वह काम नहीं कर रहा है क्योंकि $(shell pwd)जब EXTRA_CFLAGSचर का उपयोग किया जाता है तो उसका विस्तार किया जाता है। चूंकि मेकफाइल आपके मॉड्यूल की डायरेक्टरी से बजाय कर्नेल सोर्स ट्री से चलता है (यह Kbuild के कई गैर-स्पष्ट पहलुओं में से एक है), यह गलत डायरेक्टरी उठा रहा है।
निर्दिष्ट करने के लिए आधिकारिक मुहावरा एक आउट-ऑफ-ट्री मॉड्यूल में निर्देशिकाओं को शामिल करने के लिए of5.3 में है modules.txt। srcचर अपने मॉड्यूल के उच्चस्तरीय निर्देशिका को तैयार है। इसलिए:
EXTRA_CFLAGS := -I$(src)/src/inc
ध्यान दें कि यह घोषणा Kbuildआपके मॉड्यूल ट्री की जड़ नामक एक फ़ाइल में होनी चाहिए । (आप srcनिर्देशिका को अपने मॉड्यूल ट्री की जड़ मान सकते हैं ; यदि हां, तो Kbuildवहां रखें और ऊपर दिए गए मान को बदलें -I$(src)/inc)। उन्हें अंदर रखना भी संभव है Makefile, लेकिन ध्यान रखें कि यह परिभाषा (जब तक कि कुछ और जो केवल कर्नेल मॉड्यूल का निर्माण करते समय लागू होता है) एक सशर्त निर्देश के भीतर होनी चाहिए ifeq ($(KERNELRELEASE),)। 4.1 को देखें modules.txt।
यदि आपके पास Kbuildपहले से कोई फ़ाइल नहीं है और आप एक के पास जाना चाहते हैं, तो .14.1 पढ़ें modules.txt। एक अलग Kbuildफ़ाइल होने से थोड़ा स्पष्ट है। कॉल करने के लिए एक नियम के अलावा, अपने मुख्य मेकफाइल में कर्नेल पर लागू होने वाली किसी भी चीज़ को न डालें make -C $(KERNELDIR) M=$(pwd)। Kbuildन्यूनतम में , आपको आवश्यक मॉड्यूल की सूची है जो आप बना रहे हैं (अक्सर सिर्फ एक) और आपके मॉड्यूल में शामिल करने के लिए फ़ाइलों की एक सूची, साथ ही एक निर्भरता घोषणा:
EXTRA_CFLAGS := -I$(src)/inc
obj-m := mymod.o
mymod-y := $(src)/mod/mymod.o
$(src)/mod/mymod.o: $(src)/inc/mymod.h