2016-08-30 10 views
5

Pozwól, aby generate_testapi.py był skryptem w drzewie źródłowym mojego modułu jądra Linux, które pobiera mymod_test.h i generuje plik źródłowy interfejsu w kierunku przestrzeni użytkownika (ioctl, debugfs, możesz to nazwać) i pozwala nazwać to $(obj)/mymod_test_interfaces.gen.c.Jak dodać zależność od wygenerowanego pliku źródłowego w Kbuild?

W makefile kbuild niech mymod-y być zmienna zawierająca listę plików obiektowych, które tworzą moduł, tj

W jaki sposób kbuild-owski reguła wyglądać, że dodaje plik obiektowy kompiluje od generuje jako źródło zależność mymod i opisuje proces generowania.

Następująca moja pierwsza naiwna próba takiego zestawu reguł nie działa.

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 > $< 

Próbując make z tym, powstały błąd to, że nie ma zasada abymymod_test_interfaces.gen.o.

Update (ze względu na komentarz Alexandre Belloni)

Tak, próbowałem też regułę generator postaci

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

z tego samego rezultatu, co znaczy, że to nie działa .

+0

powinnaś t drugi mymod_test_interfaces.gen.o be mymod_test_interfaces.gen.c? –

+0

@AlexandreBelloni: Właśnie tego próbuję się dowiedzieć. Dobry komentarz, ale oczywiście też tego próbowałem i nie, nie dało to pożądanego rezultatu. – datenwolf

Odpowiedz

2

Jest inny problem: nie można mieć pliku C, który ma taką samą nazwę jak moduł podczas próby zbudowania modułu wielu plików. Zmień nazwę mymod.c do mymod-core.c

Następnie dodaje powinno działać:

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] 

ja faktycznie przetestowane następujące:

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); 

To właściwie skutkuje:

$ 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 
Powiązane problemy