我有内核模块源代码(用于 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 makefilediff
或make --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
漂亮吗?不。行得通吗?是的。