2013-03-15 6 views
9

मैं स्रोत कोड है:कैसे लिनक्स कर्नेल मॉड्यूल स्रोत कोड के लिए makefile से पैरामीटर पास करने के

#include <linux/module.h> 
#include <linux/kernel.h> 

int init_module(void) 
{ 
    printk(KERN_INFO "Hello world %i\n", BUILD_NUMBER); 
    return 0; 
} 

void cleanup_module(void) 
{ 
    printk(KERN_INFO "Goodbye world 1.\n"); 
} 

और एक makefile:

obj-m += hello-1.o 

BUILD_NUMBER := 42 

# How to pass BUILD_NUMBER to hello-1.c ??? 

all: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 

clean: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 

अब मैं कैसे makefile से BUILD_NUMBER पैरामीटर पारित करते स्रोत कोड के लिए?

+0

क्या यह आपका पूरा मेकफ़ाइल है? – piokuc

+0

मेकफ़ाइल जिसे मैं इसका उपयोग करना चाहता हूं वह बड़ा है, लेकिन उपरोक्त स्पष्टता के लिए छोटा हो गया है। –

उत्तर

10

चूंकि लिनक्स बिल्ड सिस्टम कर्नेल का उपयोग करता है, मेकफ़ाइल प्रदान करता है जो उचित रूप से बदला नहीं जा सकता है। मैं आपके संस्करण संख्या को सीधे मेकफ़ाइल के बजाय स्रोत कोड में रखने का सुझाव दूंगा।

एक संभावना विचार है। आप CPPFLAGS पर्यावरण परिवर्तक को परिभाषित कर सकते हैं। इसे कर्नेल मेकफ़ाइल द्वारा सी कंपाइलर कमांड लाइन में पारित किया जाना चाहिए। यदि आप इस CPPFLAGS चर को -DVERSION=42 के रूप में परिभाषित करते हैं, तो हो सकता है कि आप अपनी स्रोत फ़ाइल के अंदर इस VERSION मैक्रो का उपयोग कर सकें।

all: 
    CPPFLAGS="-DVERSION=42" make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 

ध्यान दें कि CPPFLAGS "सी Preprocessor झंडे" के लिए खड़ा है। यह सी ++ से असंबंधित है।

इसका परीक्षण करने के बाद। यह काम नहीं करता। हालांकि एक समाधान है। कर्नेल मेकफ़ाइल KCPPFLAGS पर्यावरण परिवर्तक की परिभाषा को अनुमति देता है (और उपयोग करता है) जिसे कर्नेल मेकफ़ाइल में जोड़ा जाएगा स्वयं को CPPFLAGS परिभाषित किया जाएगा।

all: 
    KCPPFLAGS="-DVERSION=42" make -C /lib/modules/$(shell uname -r)/build M=$(PWD) 
+0

BUILD_NUMBER के अतिरिक्त मैं एक बिल्ड तिथि और समय भी शामिल करना चाहूंगा, जो स्रोत कोड में मैन्युअल रूप से सीधे परिवर्तित करना इतना सुविधाजनक नहीं है। –

+1

'केसीपीपीएफएलजीएस' कार्यों के साथ बहुत समाधान। 'KCPPFLAGS = "के साथ अपने दो मैक्रोज़ को परिभाषित करने के लिए इसका उपयोग करें - DVERSION = $ (BUILD_NUMBER) -DDATE = $ (खोल दिनांक)" '। –

+1

बहुत बहुत धन्यवाद!आपके उत्तर का उपयोग करके, मैंने यह भी पाया कि निम्न कार्य: मेक-सी/lib/मॉड्यूल/$ (खोल uname -r)/निर्माण एम = $ (पीडब्ल्यूडी) EXTRA_CFLAGS = "- DBUILD_NUMBER = $ (BUILD_NUMBER)" मॉड्यूल –

0

जोड़ने का प्रयास करें:

-DBUILD_NUMBER=$(BUILD_NUMBER) 
अपने संकलक मानकों करने के लिए

BUILD_NUMBER को आपके कोड में #define के साथ परिभाषित करने के समान प्रभाव होना चाहिए।

+0

नहीं '-D' कुछ' gcc' कमांड लाइन तर्क है, जिसे 'मेक' द्वारा अज्ञात किया गया है। –

+0

हाँ - उस बारे में सोचा - पहले से ही इसे बदल दिया है;) मुझे भी सेंकने के लिए उपयोग किया गया है ... – sonicwave

+0

इस मेकफ़ाइल में कंपाइलर पैरामीटर यहां दिए गए नहीं हैं। यह इतना आसान नहीं है! –

0

कमांड लाइन पर, गुजर तर्कों की सही तरीके से कर्नेल के Documentation/kbuild/makefiles.txtCFLAGS_MODULE स्थापित करने के लिए है के अनुसार जीसीसी के लिए:

आप उपयोग करना होगा।

उदाहरण के लिए, BUILD_NUMBER=42 साथ मौजूदा निर्देशिका में मॉड्यूल का निर्माण करने की:

make CFLAGS_MODULE='-DBUILD_NUMBER=42 -DSOME_OTHER_MACRO' M="$PWD" modules 

नोट::

make CFLAGS_MODULE=-DBUILD_NUMBER=42 M="$PWD" modules 

आप कई -D प्रदान करने के लिए चाहते हैं, एकल उद्धरण का उपयोग करें कि स्थापित करने के लिए ही सीमित नहीं है मैक्रोज़, उदाहरण के लिए आप CFLAGS_MODULE=-O0 का उपयोग कर सकते हैं।

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