2016-08-30 2 views
5

Позвольте generate_testapi.py быть сценарием в исходном дереве модуля ядра Linux, который глотает mymod_test.h и генерирует исходный файл интерфейса для пользователя (ioctl, debugfs, вы его называете) и позволяет назвать это $(obj)/mymod_test_interfaces.gen.c.Как добавить зависимость от сгенерированного исходного файла в Kbuild?

В Makefile Kbuild пусть 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.

Update (из-за комментарий от Александра 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 второй mymod_test_interfaces.gen.o - mymod_test_interfaces.gen.c? –

+0

@AlexandreBelloni: Это то, что я пытаюсь выяснить. Хороший комментарий, но, конечно, я тоже пробовал это и нет, это не дало желаемого результата. – datenwolf

ответ

2

Существует еще одна проблема: у вас не может быть файла C с тем же именем, что и модуль при попытке создать несколько файловых модулей. Переименовывать mymod.c в mymod-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 
Смежные вопросы