2016-08-30 80 views
5

假設generate_testapi.py是我的Linux內核模塊的源代碼樹中的一個腳本,它接收mymod_test.h並生成一個面向userland的接口源文件(ioctl,debugfs,您將其命名),並命名爲$(obj)/mymod_test_interfaces.gen.c如何在Kbuild中添加對生成的源文件的依賴關係?

在kbuild的makefile文件讓mymod-y是包含構成該模塊的目標文件列表中的變量,即

如何做一個kbuild的十歲上下的規則的樣子,那將對象文件編譯從產生源作爲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

更新(由於由亞歷山大·貝羅尼評論)

是的,我也試過形式的生成規則

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

具有相同的結果,這是,這是行不通的。

+0

不該」第二個mymod_test_interfaces.gen.o是mymod_test_interfaces.gen.c? –

+0

@AlexandreBelloni:這就是我想要發現的。好的評論,但我當然也試過了,沒有,它沒有給出預期的結果。 – datenwolf

回答

2

還有一個問題:當您嘗試構建多個文件模塊時,您不能擁有與模塊名稱相同的C文件。重命名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 
相關問題