DKMS安装Realtek r8125驱动报CLEAN目标缺失及make命令差异问题
DKMS安装r8125驱动报错问题解答
1. Makefile已定义clean目标,为何DKMS提示无CLEAN构建目标
报错核心原因是不同上下文下$@的含义完全不同,直接照搬其他场景的$@写法到dkms.conf中会导致解析逻辑错位:
- Makefile中定义的是小写
clean目标,只有当make接收到的目标参数为小写clean时才会匹配该规则。 - dkms.conf里的
$@不会传递给make作为Makefile自动变量解析,它是DKMS预留的内置占位符:DKMS执行构建、清理、安装等不同流程时,会自动将配置里的$@替换为对应流程的大写目标名,比如清理阶段替换为CLEAN,构建阶段替换为BUILD。 - 最初配置的
MAKE="'make' $@ all",在DKMS执行清理步骤时会被展开为make CLEAN all,make接收到的目标是大写CLEAN和all,但当前Makefile没有定义大写的CLEAN目标,自然会抛出No rule to make target 'CLEAN'的错误。 - 官方驱动autorun脚本里写
make $@ all能正常运行,是因为那行命令的执行上下文是Shell脚本,且脚本被调用时会传入对应目标作为位置参数,$@在那个场景下是Shell位置变量,可以拿到正确的小写目标名,和dkms.conf的解析逻辑完全不通用。
2. make all与make $@ all的具体差异
两者的差异完全由$@所处的执行上下文决定,不存在固定行为:
- 对于
make all:无论在什么外部场景调用,只要命令内容没有被调用方篡改,逻辑都是固定的——启动make工具,执行当前目录Makefile中定义的all目标,不会传入额外目标参数。 - 对于
make $@ all:$@会被当前执行环境优先解析替换,最终执行的命令取决于替换结果,常见场景下的行为如下:- 写在Makefile规则的命令段中时:
$@是make的内置自动变量,会被替换为当前规则的目标名。比如规则modules: ; make $@ all执行时,会被展开为make modules all,代表同时执行modules和all两个目标。 - 写在普通Shell命令行/Shell脚本中时:
$@是Shell的特殊位置变量,会被替换为当前脚本/函数接收到的所有传入参数。如果调用脚本时没有传参数,$@为空,命令等价于make all;如果传入了参数,参数会被作为make的目标放在all之前。 - 写在dkms.conf的配置项中时:
$@是DKMS的内置占位符,会被替换为DKMS当前流程对应的大写目标名(如CLEAN/BUILD/INSTALL),这也是之前报错的根源。
- 写在Makefile规则的命令段中时:
注:修改后的dkms.conf把MAKE项设为
'make' all完全适配当前驱动的Makefile结构——顶层Makefile的all目标已经依赖了clean、modules、install三个步骤,单条make all就能完成从清理、编译到安装的全流程,不需要额外传入其他目标参数。
内容的提问来源于stack exchange,提问作者SICHENG YU
相关产品推荐
相关产品推荐

