Makefile 如何";制造;修改驱动程序源代码后的现有Linux内核模块驱动程序

Makefile 如何";制造;修改驱动程序源代码后的现有Linux内核模块驱动程序,makefile,kernel,Makefile,Kernel,我对Linux USB Wi-Fi卡驱动程序做了一些小修改,以插入一些日志(printk语句)。我大致遵循这一点,即我需要执行make,以构建.ko文件。工作目录(/usr/src/linux/drivers/net/wireless/rtl818x/rtl8187/)中存在一个现有的Makefile,其内容如下: rtl8187-objs := dev.o rtl8225.o leds.o rfkill.o obj-$(CONFIG_RTL8187) += rtl8187.

我对Linux USB Wi-Fi卡驱动程序做了一些小修改,以插入一些日志(
printk
语句)。我大致遵循这一点,即我需要执行
make
,以构建
.ko
文件。工作目录(
/usr/src/linux/drivers/net/wireless/rtl818x/rtl8187/
)中存在一个现有的
Makefile
,其内容如下:

rtl8187-objs        := dev.o rtl8225.o leds.o rfkill.o

obj-$(CONFIG_RTL8187)   += rtl8187.o

ccflags-y += -Idrivers/net/wireless/rtl818x
当我在这个目录中执行
make
时,我得到:

make: *** No targets.  Stop.
根据,这意味着“找到了一些makefile,但它不包含任何默认目标,并且在命令行中没有给出任何目标。在这些情况下,GNU make与此无关。”

所以我的问题是,在我尝试做的上下文中,这意味着什么?我如何生成下一步所需的
.ko
文件?

您必须从Linux源代码的顶部目录(/usr/src/Linux/)运行make。确保驱动程序包含在/usr/src/linux/.config文件中。因此,使用驱动程序构建内核。 如果您不想重建整个内核,请阅读更多:)

如果要重新构建目录中的所有模块:

make M=drivers/net/wireless/rtl818x/rtl8187/
make M=drivers/net/wireless/rtl818x/ CONFIG_RTL8187=m
如果要在目录中重新构建单个模块:

make M=drivers/net/wireless/rtl818x/rtl8187/
make M=drivers/net/wireless/rtl818x/ CONFIG_RTL8187=m
*CONFIG\u RTL8187*名称可在drivers/net/wireless/rtl818x/Kconfig(CONFIG\u+RTL8187)中找到

它还应该在以下方面起作用:

make drivers/net/wireless/rtl818x/rtl8187/rtl8187.ko

您的
make
ing目录不正确。转到一个目录,然后再次尝试
make
。继续运行并
make
ing,直到编译完成。因此,我在
/usr/src/linux
目录中做了一次一次性
make
,没有任何驱动程序修改。然后,我对驱动程序进行了修改(添加了一个
printk
语句),并从
/usr/src/linux/drivers/net/wireless//rtl818x/rtl8187/
目录中进行了
make./rtl8187.ko
。第一次工作正常,但随后我对
dev.c
进行了另一次修改,并再次尝试
make./rtl8187.ko
,我得到了“make:Nothing to do to do for`/usr/src/linux/drivers/net/wireless/rtl818x/rtl8187/rtl8187.ko.”。有什么想法吗?始终从/usr/src/linux运行
make
。如果您构建了整个内核,那么在下一个版本中,make只编译修改过的文件。无论如何,使用此
make M=drivers/net/wireless/rtl818x/CONFIG\u RTL8187=M
编译单个模块。我刚刚测试了它,我发现了一些类似这样的错误:警告:“usb_unachor_urb”[drivers/net/wireless/rtl818x//rtl8187/rtl8187.ko]未定义!这是因为我没有编译所需的所有其他模块。所以,若您将遇到类似这样的错误,请确保编译所有请求的模块。