向内核模块添加DKMS支持时出现问题

时间:2012-01-19 11:12:43

标签: dynamic module kernel

我正在尝试在我正在处理的内核模块中添加DKMS支持。

我已将内核模块源与要链接的静态lib放在以下目录中:

/usr/src/dpx/1.0

使用以下文件:

dkms.conf
Makefile
dpxmtt.c
lib.a

dkms.conf文件是这样的:

MAKE="make"
CLEAN="make clean"
BUILT_MODULE_NAME=dpx
BUILT_MODULE_LOCATION=src/
DEST_MODULE_LOCATION=/kernel/drivers/input/touchscreen
PACKAGE_NAME=dpxm
PACKAGE_VERSION=1.0
REMAKE_INITRD=yes

makefile是这样的:

EXTRA_CFLAGS+=-DLINUX_DRIVER -mhard-float

obj-m += dpx.o
dpx-objs:= dpxmtt.o ../source/lib.a

all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

../source/lib.a是一个hack,因为当dkms构建系统调用makefile时,它说它在目录(构建目录)中找不到,但是因为它被复制了到源目录,我相对地引用它。

当我打电话

sudo dkms build -m dpx -v 1.0

结果几近完美:

santos@NS-PC:~$ sudo dkms build -m dpx -v 1.0

Kernel preparation unnecessary for this kernel.  Skipping...

Building module:
cleaning build area....
make KERNELRELEASE=3.0.0-14-generic....
ERROR (dkms apport): binary package for dpx: 1.0 not found
Error!  Build of dpx.ko failed for: 3.0.0-14-generic (i686)
Consult the make.log in the build directory
/var/lib/dkms/dpx/1.0/build/ for more information.
nsantos@NS-PC:~$ 

日志文件的内容是:

DKMS make.log for dpx-1.0 for kernel 3.0.0-14-generic (i686)
Thu Jan 19 11:07:54 WET 2012
make -C /lib/modules/3.0.0-14-generic/build M=/var/lib/dkms/dpx/1.0/build modules
make[1]: Entering directory `/usr/src/linux-headers-3.0.0-14-generic'
  CC [M]  /var/lib/dkms/dpx/1.0/build/dpxmtt.o
  LD [M]  /var/lib/dkms/dpx/1.0/build/dpx.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /var/lib/dkms/dpx/1.0/build/dpx.mod.o
  LD [M]  /var/lib/dkms/dpx/1.0/build/dpx.ko

make[1]: Leaving directory `/usr/src/linux-headers-3.0.0-14-generic'

模块构建正确,但以错误结束:

ERROR (dkms apport): binary package for dpx: 1.0 not found
Error!  Build of dpx.ko failed for: 3.0.0-14-generic (i686)

我不知道这意味着什么。有人知道吗?

2 个答案:

答案 0 :(得分:1)

使用:

$(shell uname -r)

在Makefile中

它可能也是错误的! “shell uname -r”指的是当前运行的内核,但是使用dkms的主要原因是因为它提供了一种自动方法来重新编译位于内核树之外的内核模块,用于每个新安装的内核。我的意思是Makefile可能指的是dkms正在为其构建模块的不同内核。

使用:

${kernelver}代替。

答案 1 :(得分:0)

我有类似的问题。我认为BUILT_MODULE_LOCATION未正确设置到src目录。它应该在您的示例中设置为当前目录,或者您可以省略此变量,dkms将默认为当前目录。