对于内核模块生成文件:对生成文件使用另一个名称并使用命令行参数



我有内核模块源代码(用于 arm(,我想从同一源代码编译两个不同的驱动程序。

内核编译有 2 个源文件和交叉编译。

MODULE_MAME = modulename
SRCS = drv/source.c lib/libsrc.c
OBJS =  $(SRCS:.c=.o)
obj-m += $(MODULE_MAME).o
$(MODULE_MAME)-y = $(OBJS)
KDIR  := /mykermelsources/
PWD   := $(shell pwd)
all:
$(MAKE) -C $(KDIR)  ARCH=arm M=$(PWD) modules
clean:
$(MAKE) -C $(KDIR)  ARCH=arm M=$(PWD) clean

在一个命令中,我想编译 2 个模块。

两种选择:

  • 保留 3 个不同的生成文件,一个主文件将调用其他两个生成文件。一个问题,我无法让它工作。make -f makefilediffmake --makefile=makefilediff给我一个错误。

日志:

make -C /mykermelsources/  ARCH=arm M=/home/mychardriver/ modules
make[1]: Entering directory '/mykermelsources'
scripts/Makefile.build:44: /home/mychardriver/Makefile: No such file or directory
make[2]: *** No rule to make target '/home/mychardriver//Makefile'.  Stop.
make[1]: *** [_module_/home/mychardriver/] Error 2
make[1]: Leaving directory '/mykermelsources'
make: *** [all] Error 2
  • 传输命令行参数,但它不起作用。make SIDE=1

似乎SIDE参数/变量从未传输过。

ifeq ($(SIDE),1)
MODULE_MAME = modulename_11
else
MODULE_MAME = modulename_22
endif
SRCS = drv/source.c lib/libsrc.c
OBJS =  $(SRCS:.c=.o)a
obj-m += $(MODULE_MAME).o
$(MODULE_MAME)-y = $(OBJS)
KDIR  := /mykermelsources/
PWD   := $(shell pwd)
all:
$(MAKE) -C $(KDIR)  ARCH=arm M=$(PWD) SIDE=$(SIDE) modules
clean:
$(MAKE) -C $(KDIR)  ARCH=arm M=$(PWD) clean

如何从相同的多个源文件构建 2 个内核模块?

刚刚遇到这个问题,这就是我所做的:

对于要构建的每个moduleX,编写一个包含目标的Kbuild_moduleX。例:

obj-$(MODULE) += MODULE.o
MODULE-y := source.o

然后,在你的Makefile_moduleX,做:

all:
cp Kbuild_moduleX Kbuild
make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
rm Kbuild

这是有效的,因为内核脚本会让 Kbuild 优先于读取 Makefile。

要编译,请执行make -f Makefile_moduleX

漂亮吗?不。行得通吗?是的。

最新更新