Linux kernel 如何在Kbuild中添加对生成的源文件的依赖关系?
让Linux kernel 如何在Kbuild中添加对生成的源文件的依赖关系?,linux-kernel,kbuild,Linux Kernel,Kbuild,让generate_testapi.py成为我的Linux内核模块的源代码树中的一个脚本,它接收mymod_test.h并生成一个指向userland的接口源文件(ioctl,debugfs,你可以命名),并将其命名为$(obj)/mymod_test_interfaces.gen.c 在Kbuild makefile中,让mymod-y成为包含构成模块的对象文件列表的变量,即 Kbuild ish规则是什么样子的,它将从生成源编译的对象文件添加为mymod的依赖项,并描述生成过程 下面,我第一
generate_testapi.py
成为我的Linux内核模块的源代码树中的一个脚本,它接收mymod_test.h
并生成一个指向userland的接口源文件(ioctl,debugfs,你可以命名),并将其命名为$(obj)/mymod_test_interfaces.gen.c
在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 > $<
同样的结果是,它不起作用。还有另一个问题:在尝试构建多文件模块时,不能使用与模块同名的C文件。将
mymod.c
重命名为mymod core.c
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 > $<
然后,以下各项应起作用:
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 > $@
第二个mymod_test_interfaces.gen.o不应该是mymod_test_interfaces.gen.c吗?@AlexandreBelloni:这就是我想弄清楚的。评论不错,但我当然也试过了,没有,没有达到预期的效果。
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);
$ 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