2016-08-30 3 views
5

generate_testapi.py मेरे लिनक्स कर्नेल मॉड्यूल के स्रोत पेड़ में एक स्क्रिप्ट बनें, जो mymod_test.h में प्रवेश करता है और उपयोगकर्तालैंड (ioctl, debugfs, आप इसे नाम दें) की ओर एक इंटरफ़ेस स्रोत फ़ाइल उत्पन्न करता है, और यह $(obj)/mymod_test_interfaces.gen.c नाम देता है।Kbuild में जेनरेट की गई स्रोत फ़ाइल पर निर्भरता कैसे जोड़ें?

Kbuild makefile में mymod-y वस्तु फ़ाइलों कि मॉड्यूल फार्म की सूची को शामिल चर, यानी रहने दो

कैसे एक Kbuild-ish नियम देखो की तरह, उस वस्तु फ़ाइल कहते हैं संकलित रूप में स्रोत उत्पन्न करता है से करता है Mymod की निर्भरता और पीढ़ी की प्रक्रिया का वर्णन करता है।

निम्नलिखित, इस तरह के नियम सेट पर मेरा पहला निष्पक्ष प्रयास काम नहीं करता है।

obj-m := mymod.o 

mymod-y := \ 
    mymod_kmod.o \ 
    $(obj)/mymod_test_interfaces.gen.o 

$(obj)/mymod_test_interfaces.gen.o: $(src)/mymod_test.h $(src)/generate_testapi.py 
    $(src)/generate_testapi.py < $(src)/mymod_test.h > $< 

उस के साथ make की कोशिश कर रहा है, जिसके परिणामस्वरूप त्रुटि है, वहाँmymod_test_interfaces.gen.o बनाने के लिए नहीं नियम यह है कि।

अद्यतन (एलेक्जेंडर Belloni द्वारा टिप्पणी की वजह से)

हाँ, मैं भी रूप के एक जनरेटर नियम

$(obj)/mymod_test_interfaces.gen.c: $(src)/mymod_test.h $(src)/generate_testapi.py 
    $(src)/generate_testapi.py < $(src)/mymod_test.h > $< 
ही परिणाम है, जो है, कि यह काम नहीं करता साथ

की कोशिश की ।

+0

नहीं करना चाहिए ' t my myodod_test_interfaces.gen.o mymod_test_interfaces.gen.c हो? –

+0

@AlexandreBelloni: यही वह है जिसे मैं ढूंढने की कोशिश कर रहा हूं। अच्छी टिप्पणी, लेकिन निश्चित रूप से मैंने यह भी कोशिश की और नहीं, यह वांछित परिणाम नहीं दिया। – datenwolf

उत्तर

2

एक और मुद्दा है: आपके पास एक सी फ़ाइल नहीं हो सकती है जिसमें एकाधिक फ़ाइल मॉड्यूल बनाने का प्रयास करते समय मॉड्यूल के समान नाम होता है। नाम बदलना mymod.cmymod-core.c को

फिर, निम्नलिखित काम करना चाहिए:

obj-m := mymod.o 

mymod-objs := mymod-core.o mymod_test_interfaces.gen.o 

$(obj)/mymod_test_interfaces.gen.c: $(src)/mymod_test.h $(src)/generate_testapi.py 
    $(src)/generate_testapi.py < $(src)/mymod_test.h > [email protected] 

मैं वास्तव में परीक्षण किया है निम्नलिखित:

diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile 
index 4387ccb79e64..47fdc3a73c75 100644 
--- a/drivers/misc/Makefile 
+++ b/drivers/misc/Makefile 
@@ -71,3 +71,8 @@ OBJCOPYFLAGS_lkdtm_rodata_objcopy.o := \ 
         --rename-section .text=.rodata 
$(obj)/lkdtm_rodata_objcopy.o: $(obj)/lkdtm_rodata.o 
     $(call if_changed,objcopy) 
+ 
+obj-m := mymod.o 
+mymod-objs := mymod-core.o mymod_test_interfaces.gen.o 
+$(obj)/mymod_test_interfaces.gen.c: 
+  echo "int variable;" > [email protected] 
diff --git a/drivers/misc/mymod-core.c b/drivers/misc/mymod-core.c 
new file mode 100644 
index 000000000000..b39aa4b9ae8d 
--- /dev/null 
+++ b/drivers/misc/mymod-core.c 
@@ -0,0 +1,19 @@ 
+#include <linux/module.h> 
+#include <linux/platform_device.h> 
+ 
+extern int mymod_variable; 
+ 
+static int mymod_probe(struct platform_device *pdev) 
+{ 
+  mymod_variable = 2; 
+ 
+  return 0; 
+} 
+ 
+static struct platform_driver mymod_driver = { 
+  .driver = { 
+    .name = "mymod", 
+  }, 
+  .probe = mymod_probe, 
+}; 
+module_platform_driver(mymod_driver); 

यह ठीक से परिणाम:

$ make 
    CHK  include/config/kernel.release 
    CHK  include/generated/uapi/linux/version.h 
    CHK  include/generated/utsrelease.h 
    CHK  include/generated/bounds.h 
    CHK  include/generated/timeconst.h 
    CHK  include/generated/asm-offsets.h 
    CALL scripts/checksyscalls.sh 
    CHK  include/generated/compile.h 
    CC [M] drivers/misc/mymod-core.o 
echo "int variable;" > drivers/misc/mymod_test_interfaces.gen.c 
    CC [M] drivers/misc/mymod_test_interfaces.gen.o 
    LD [M] drivers/misc/mymod.o 
    LD  arch/x86/boot/compressed/vmlinux 
    ZOFFSET arch/x86/boot/zoffset.h 
    AS  arch/x86/boot/header.o 
    LD  arch/x86/boot/setup.elf 
    OBJCOPY arch/x86/boot/setup.bin 
    OBJCOPY arch/x86/boot/vmlinux.bin 
    BUILD arch/x86/boot/bzImage 
संबंधित मुद्दे