适当的外部内核模块的makefile设置

时间:2015-05-08 19:45:17

标签: linux-kernel kernel-module kbuild

我正在编写一个字符驱动程序,位于源代码树中修改后的ahci版本之上。我基本上有这样的东西:

topdir
   |
   |- Makfile
   |
   |- mod_ahci
   |     | - Makefile, codefiles
   |
   |- char_interface
   |     | - Makefile, codefiles

现在,char_interface需要来自mod_ahci的符号。我有适当的EXPORT_SYMBOL()宏用于我需要导出的符号。但是,我很难让makefile正确地从char_interface中获取mod_ahci中的头文件。我的顶级Makefile

ifneq ($(KERNELRELEASE),)
    obj-y := mod_ahci/ char_interface/

else
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build
    PWD := $(shell pwd)

default:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

modules_install:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

endif

char_interface的makefile(因为另一个构建得很好)

ifneq ($(KERNELRELEASE),)
    ccflags-y += -I../mod_ahci
    obj-m := char_interface.o

else
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build

default:
    $(MAKE) -C $(KERNELDIR) M=$(shell pwd) modules

modules_install:
    $(MAKE) -C $(KERNELDIR) M=$(shell pwd) modules_install

endif

clean:
    -sudo rmmod ahcip
    -rm -f *.ko* *.mod.* *.o modules.order Modules.symvers

我在内核文档中引用了各种文本文件。例如,我现在指的是... / Documentation / kbuild / makefiles.txt以及... / Documentation / kbuild / modules.txt。每当我建立时,我都会得到/home/captaink/devel/kmodtests/char_interface/char_interface.c:2:22: error: mod_ahci.h: No such file or directory。目录../mod_ahci中有一个名为 mod_ahci.h 的文件。我在char驱动程序的makefile中使用ccflags-y出了什么问题?

由于

1 个答案:

答案 0 :(得分:0)

经过一番挖掘后,我找到了问题的答案。我误解了我从LDD3和内核文档中看到的makefile所发生的事情(显然,这正是O'Reilly在他们的例子中所做的)。构建系统实际上将目录更改为/usr/src/kernels/$(uname -r)/build(或类似),因为这就是编译器找不到我的头文件的原因。

我不是说这是一种优雅的方式,但这就是我修复它的方法。顶部目录中的makefile现在看起来像:

ifneq ($(KERNELRELEASE),)
    obj-y := mod_ahci/ char_interface/

else
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build
    PWD := $(shell pwd)

default:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) TOP_DIR=$(PWD) modules

modules_install:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

endif

包含char驱动程序接口的子目录中的makefile如下所示:

ifneq ($(KERNELRELEASE),)
    ccflags-y += -I$(TOP_DIR)/mod_ahci
    obj-m := char_interface.o

else
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build

default:
    $(MAKE) -C $(KERNELDIR) M=$(shell pwd) modules

modules_install:
    $(MAKE) -C $(KERNELDIR) M=$(shell pwd) modules_install

endif

clean:
    -sudo rmmod ahcip
    -rm -f *.ko* *.mod.* *.o modules.order Modules.symvers

正如您所知,makefile已被广泛复制。子目录可能不需要其中的“共享”makefile内容,因为它由更高级别的makefile处理。尽管如此,模块现在已经构建,我知道的字符驱动程序是我在修改过的ahci驱动程序中创建的导出符号。

我希望这可以帮助像我这样的初学者,Linux内核构建世界和Linux内核驱动程序。