লিনাক্স কার্নেল মেকফিলগুলি কেবিল্ড ফ্রেমওয়ার্ক ব্যবহার করে। যদিও এগুলি জিএনইউ মেক দ্বারা ব্যাখ্যা করা হয়, কেবিল্ডে বিচিত্র ব্যবহারের কনভেনশন সহ ম্যাক্রোগুলির একটি বিশাল সেট থাকে, তাই সাধারণ মেকফাইল নির্দেশিকা প্রয়োগ হয় না। কেবিল্ড সম্পর্কে দুর্দান্ত জিনিসটি আপনার কাজের জটিলতার কথা বিবেচনা করে খুব কম বয়লারপ্লেট প্রয়োজন।
কেবিল্ড কার্নেল উত্সে নথিভুক্ত করা হয়েছে, ইন Documentation/kbuild
। মডিউল লেখক হিসাবে আপনার বিশেষত পড়া উচিত modules.txt
(এবং কমপক্ষে অন্যদের দ্বারা স্কিম)।
আপনি এখন যা করছেন তা কাজ করছে না কারণ ভেরিয়েবলটি ব্যবহার $(shell pwd)
করার সময় প্রসারিত EXTRA_CFLAGS
হয়। যেহেতু মেকফাইলটি আপনার মডিউলটির ডিরেক্টরি থেকে কর্নেল উত্স ট্রি থেকে চালিত হয়েছে (এটি কুবিল্ডের অনেকগুলি অজ্ঞাতাত্মক দিকগুলির মধ্যে একটি) তাই এটি ভুল ডিরেক্টরিটি তুলেছে।
নির্দিষ্ট করার জন্য অফিশিয়াল আইডিয়োম-এ গাছের বাইরে থাকা মডিউলটিতে ডিরেক্টরি অন্তর্ভুক্ত থাকে of5.3 এর modules.txt
। src
পরিবর্তনশীল আপনার মডিউল এর toplevel ডিরেক্টরি সেট করা হয়। অতএব:
EXTRA_CFLAGS := -I$(src)/src/inc
নোট করুন যে এই ঘোষণাটি Kbuild
আপনার মডিউল গাছের গোড়ায় ডাকা একটি ফাইলের মধ্যে থাকা উচিত । (আপনি src
ডিরেক্টরিটিকে আপনার মডিউল গাছের মূল হিসাবে বিবেচনা করতে চাইতে পারেন ; যদি তা হয় তবে Kbuild
সেখানে রাখুন এবং উপরের মানটি প্রতিস্থাপন করুন -I$(src)/inc
)। এগুলি এগুলিতে স্থাপন করাও সম্ভব Makefile
, তবে মনে রাখবেন যে এই সংজ্ঞাটি (কেবল কোনও কার্নেল মডিউল তৈরি করার সময় প্রযোজ্য অন্য কোনও কিছু হিসাবে) শর্তসাপেক্ষ নির্দেশের মধ্যে থাকা উচিত ifeq ($(KERNELRELEASE),)
। এর §4.1 দেখুন modules.txt
।
আপনার যদি Kbuild
ইতিমধ্যে কোনও ফাইল না থাকে এবং একটি থাকার স্যুইচ করতে চান তবে এর §4.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