Makefile 编译 module fail

我拿出kernel里的r8169 driver,借鉴了一些makefile,可以成功make以及insmod,但是最近在另一台电脑上却失败了,记录一下这个问题。

PS:我个人暂时没有很系统的学习makefile,仅仅是需要用到的时候百度一下。

这次make之后,遇到了如下的问题:

make -C /lib/modules/5.13.0-44-generic/build SUBDIRS=/home/tover/drivers/test/r8169/realtek clean
make[1]: Entering directory '/usr/src/linux-headers-5.13.0-44-generic'
fs/aufs/Makefile:3: fs/aufs/magic.mk: No such file or directory
make[3]: *** No rule to make target 'fs/aufs/magic.mk'.  Stop.
make[2]: *** [scripts/Makefile.clean:68: fs/aufs] Error 2
make[1]: *** [Makefile:1886: _clean_fs] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-5.13.0-44-generic'
make: *** [Makefile:57: clean] Error 2

我研究了一会fs/aufs/magic.mk,并没有什么特别的发现。

因为我之前在Ubuntu 18.04 kernel version 4.15.0上是可以成功make的,此次在Ubuntu 20.04 kernel version 5.13.0上就失败了。这时我想到了是内核版本的问题,所以我就去查找不同版本的r8168的makefile文件,通过比对,我找到了如下的不同。

旧的版本:

.PHONY:modules
modules:
	$(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules
.PHONY:clean
clean:
	$(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) clean
.PHONY:install
install:
	$(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) INSTALL_MOD_DIR=$(RTKDIR) modules_install

新的版本:

modules:
#ifeq ($(call kver_ge,5,0,0),1)
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
#else
#	$(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules
#endif
.PHONY:clean
clean:
#ifeq ($(call kver_ge,5,0,0),1)
	$(MAKE) -C $(KERNELDIR) M=$(PWD) clean
#else
#	$(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) clean
#endif
.PHONY:install
install:
#ifeq ($(call kver_ge,5,0,0),1)
	$(MAKE) -C $(KERNELDIR) M=$(PWD) INSTALL_MOD_DIR=$(RTKDIR) modules_install
#else
#	$(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) INSTALL_MOD_DIR=$(RTKDIR) modules_install
#endif

我增加了相应的内容,发现可以成功make了。Google之后发现了原因,较新版本的内核已经不支持利用 SUBDIRS 来编译,转而支持用 编译,且对 M 的支持从v2.6就开始了。

Google上的解释如下:

In newer versions, the SUBDIRS argument is totally ignored, so it's trying to compile the whole kernel (or a lot of it, anyway). But no configuration has been done so it fails right away.

并且他给出了Makefile的warning:

make[1]: Entering directory '/usr/src/linux-headers-5.3.0-40-generic'
Makefile:227: ================= WARNING ================
Makefile:228: 'SUBDIRS' will be removed after Linux 5.3
Makefile:229:
Makefile:230: If you are building an individual subdirectory
Makefile:231: in the kernel tree, you can do like this:
Makefile:232: $ make path/to/dir/you/want/to/build/
Makefile:233: (Do not forget the trailing slash)
Makefile:234:
Makefile:235: If you are building an external module,
Makefile:236: Please use 'M=' or 'KBUILD_EXTMOD' instead
Makefile:237: ==========================================

最后贴一下Google的链接

如果觉得这篇文章有用的话,可以点赞、评论或者收藏,万分感谢,goodbye~

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Makefile是一种用于管理和自动化项目编译的文件。在实际使用过程中,一般是通过编写Makefile文件来定义整个项目的编译规则,然后使用make命令来解析该Makefile文件,实现项目的编译和管理。Makefile文件可以使用默认的文件名"Makefile",也可以使用其他的文件名如xxx.mk。默认情况下,make命令会在当前目录下按照一定的顺序查找Makefile文件。一旦找到Makefile文件,就会开始读取该文件并执行其中定义的编译规则。大多数的make工具都支持"makefile"和"Makefile"这两种默认文件名,同时也支持使用-f和--file参数来指定其他的文件名进行编译。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [编译Makefile基础知识](https://blog.csdn.net/Rsirlvx/article/details/119417571)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Makefile编译——基础](https://blog.csdn.net/qq_50597556/article/details/128503426)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值