লিনাক্স কার্নেল মডিউলে স্থানীয় শিরোনাম ফাইলগুলি কীভাবে অন্তর্ভুক্ত করা যায়


17

বলুন যে আমার কাছে mymodসোর্স ফাইল সহ একটি মডিউল রয়েছে:

src / mod / mymod.c
src / inc / mymod.h

আমি নিম্নলিখিত হিসাবে mymod.h অন্তর্ভুক্ত করার চেষ্টা করুন

#include <mymod.h>

আমার মেকফাইলে রয়েছে EXTRA_CFLAGS= -I$(shell pwd)/../inc/তবে যখন কার্নেলটি তৈরি করা হবে তখন আমি উল্লেখ করে একটি ত্রুটি পেয়েছি:

mymod.h পাওয়া যায় নি

কারণটি মনে হচ্ছে যে কার্নেল মডিউলগুলি তৈরি করা হলে এই কমান্ডটি মেকফিল থেকে চালানো হয়: ( makeভি 1 ব্যবহার করে ):

make -C <path/to/linux/src> M=<path/to/mymod> modules

অন্যান্য কাজগুলিতে আমার $(shell pwd)প্রসারিত হয়েছে <path/to/linux>। এটা আমি চাই না। কীভাবে আমি আমার উত্স গাছের -Iপ্রতি নির্দেশ করতে প্যারামিটারটি নির্দিষ্ট করতে পারি ?src/incmymod

উত্তর:


19

লিনাক্স কার্নেল মেকফিলগুলি কেবিল্ড ফ্রেমওয়ার্ক ব্যবহার করে। যদিও এগুলি জিএনইউ মেক দ্বারা ব্যাখ্যা করা হয়, কেবিল্ডে বিচিত্র ব্যবহারের কনভেনশন সহ ম্যাক্রোগুলির একটি বিশাল সেট থাকে, তাই সাধারণ মেকফাইল নির্দেশিকা প্রয়োগ হয় না। কেবিল্ড সম্পর্কে দুর্দান্ত জিনিসটি আপনার কাজের জটিলতার কথা বিবেচনা করে খুব কম বয়লারপ্লেট প্রয়োজন।

কেবিল্ড কার্নেল উত্সে নথিভুক্ত করা হয়েছে, ইন Documentation/kbuild। মডিউল লেখক হিসাবে আপনার বিশেষত পড়া উচিত modules.txt(এবং কমপক্ষে অন্যদের দ্বারা স্কিম)।

আপনি এখন যা করছেন তা কাজ করছে না কারণ ভেরিয়েবলটি ব্যবহার $(shell pwd)করার সময় প্রসারিত EXTRA_CFLAGSহয়। যেহেতু মেকফাইলটি আপনার মডিউলটির ডিরেক্টরি থেকে কর্নেল উত্স ট্রি থেকে চালিত হয়েছে (এটি কুবিল্ডের অনেকগুলি অজ্ঞাতাত্মক দিকগুলির মধ্যে একটি) তাই এটি ভুল ডিরেক্টরিটি তুলেছে।

নির্দিষ্ট করার জন্য অফিশিয়াল আইডিয়োম-এ গাছের বাইরে থাকা মডিউলটিতে ডিরেক্টরি অন্তর্ভুক্ত থাকে of5.3 এর modules.txtsrcপরিবর্তনশীল আপনার মডিউল এর 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

আমার যথেষ্ট খ্যাতি না থাকায় আমি পোস্টটি আপডেট করতে পারিনি।
ওম নরসিমহান

1
@ ওম নরসিমহান: যদি এটি আপনাকে সমাধানটি বের করতে সহায়তা করে তবে আপনার উত্তরটি স্বীকৃত হিসাবে চিহ্নিত করা উচিত।
একটি সিভিএন

1

#includeSourceতিহ্যগতভাবে বর্তমান উত্স কোডের ডিরেক্টরি অনুসারে পাথ সহ ফাইলগুলির উপায় হল কোণ বন্ধনীগুলির পরিবর্তে উদ্ধৃতি চিহ্ন ব্যবহার করা:

#include <stdio.h>
#include "mygreatfunctions.h"

এই ক্ষেত্রে, প্রথমটি #includeসংকলকটির সন্ধানের পথটি অন্তর্ভুক্ত করবে (যা জিসিসির ক্ষেত্রে, -Iকমান্ড লাইন সুইচ দ্বারা নিয়ন্ত্রিত হয় ), দ্বিতীয়টি ডিরেক্টরিতে সন্ধানকারী ফাইলটি সন্ধান করবে #include

এ জাতীয় পাথগুলিও আপেক্ষিক হতে পারে। সুতরাং src / mod / mymod.c এ, আপনি বলতে পারেন:

#include "../inc/mymod.h"

এবং এটি "শুধু কাজ" করা উচিত।

আমি জানি না লিনাক্স কার্নেল গাছের ক্ষেত্রে এটি সাধারণ অভ্যাস কিনা, তবে অবশ্যই অন্তর্ভুক্ত পথটি ঘিরে মিকিংয়ের চেয়ে আরও ভাল, যার ফলে অনেকগুলি অনিচ্ছাকৃত পার্শ্ব প্রতিক্রিয়া হতে পারে।


1
সাধারণভাবে ভাল পরামর্শ, তবে লিনাক্স কার্নেল মেকফিলগুলি খুব অদ্ভুত। তারা কুবিল্ড নামে ম্যাক্রোগুলির মোটামুটি জটিল সেটকে ডাকে; প্রায়শই কুবিল্ডকে এমন একটি ভাষা হিসাবে বিবেচনা করা ভাল যা সম্পূর্ণরূপে ভিন্ন, তবে বেশ নয়।
গিলস 'অশুভ হওয়া বন্ধ করুন'

1
নিশ্চিতভাবেই, তবে কয়েকটি কনফিগার করা ডিরেক্টরিতে <foo> সন্ধানের সি সংকলক আচরণ, এবং "বার" এর জন্য প্রথমে বর্তমান ডিরেক্টরিটি দেখে এবং তারপরে উল্লিখিত পথে ফিরে যাওয়া বিচিত্র মানে কী পরিবর্তিত হবে না প্রথম স্থানে সংকলক।
ভনব্র্যান্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.