首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Kbuild中添加对生成源文件的依赖?

如何在Kbuild中添加对生成源文件的依赖?
EN

Stack Overflow用户
提问于 2016-08-30 23:21:38
回答 1查看 1.1K关注 0票数 5

generate_testapi.py成为我的Linux内核模块的源代码树中的一个脚本,它吸收mymod_test.h并生成一个面向userland的接口源文件(ioctl,调试器,您可以命名它),并命名这个$(obj)/mymod_test_interfaces.gen.c

在Kbuild中,让mymod-y成为包含构成模块的对象文件列表的变量,即

Kbuild规则是怎样的,它将对象文件从生成的源代码中编译为mymod的依赖项,并描述生成过程。

下面,我第一次天真地尝试这样一个规则集不起作用。

代码语言:javascript
复制
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的规则。

更新(由Alexandre发表评论)

是的,我还尝试了表单的生成器规则。

代码语言:javascript
复制
$(obj)/mymod_test_interfaces.gen.c: $(src)/mymod_test.h $(src)/generate_testapi.py
    $(src)/generate_testapi.py < $(src)/mymod_test.h > $<

同样的结果,也就是它不起作用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-01 09:54:03

还有一个问题:在试图构建多个文件模块时,不能有一个与模块同名的C文件。将mymod.c重命名为mymod-core.c

然后,以下内容应能发挥作用:

代码语言:javascript
复制
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 > $@

我实际上测试了以下内容:

代码语言:javascript
复制
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;" > $@
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);

适当的结果是:

代码语言:javascript
复制
$ 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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39238509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档