我正在编写一个字符驱动程序,位于源代码树中修改后的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
出了什么问题?
由于
答案 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内核驱动程序。