./scripts/Makefile.clean 文件分析

文章目录

  • 目标 $(subdir-ymn)
  • 目标__clean

$(clean-dirs):
    make -f ./scripts/Makefile.clean obj=$(patsubst _clean_%,%,$@)

$(clean-dirs)$(patsubst _clean_%,%,$@)
_clean_api
_clean_cmd
_clean_common
_clean_disk
_clean_drivers
_clean_drivers/ddr/altera
_clean_drivers/ddr/fsl
_clean_drivers/dma
_clean_drivers/gpio
_clean_drivers/i2c
_clean_drivers/net
_clean_drivers/net/fm
_clean_drivers/net/phy
_clean_drivers/power
_clean_drivers/power/battery
_clean_drivers/power/domain
_clean_drivers/power/fuel_gauge
_clean_drivers/power/mfd
_clean_drivers/power/pmic
_clean_drivers/power/regulator
_clean_drivers/serial
_clean_drivers/spi
_clean_drivers/usb/cdns3
_clean_drivers/usb/common
_clean_drivers/usb/dwc3
_clean_drivers/usb/emul
_clean_drivers/usb/eth
_clean_drivers/usb/gadget
_clean_drivers/usb/gadget/udc
_clean_drivers/usb/host
_clean_drivers/usb/mtu3
_clean_drivers/usb/musb
_clean_drivers/usb/musb-new
_clean_drivers/usb/phy
_clean_drivers/usb/ulpi
_clean_dts
_clean_env
_clean_examples
_clean_fs
_clean_lib
_clean_net
_clean_test
_clean_test/env
_clean_test/optee
_clean_test/overlay
_clean_tools
api
cmd
common
disk
drivers
drivers/ddr/altera
drivers/ddr/fsl
drivers/dma
drivers/gpio
drivers/i2c
drivers/net
drivers/net/fm
drivers/net/phy
drivers/power
drivers/power/battery
drivers/power/domain
drivers/power/fuel_gauge
drivers/power/mfd
drivers/power/pmic
drivers/power/regulator
drivers/serial
drivers/spi
drivers/usb/cdns3
drivers/usb/common
drivers/usb/dwc3
drivers/usb/emul
drivers/usb/eth
drivers/usb/gadget
drivers/usb/gadget/udc
drivers/usb/host
drivers/usb/mtu3
drivers/usb/musb
drivers/usb/musb-new
drivers/usb/phy
drivers/usb/ulpi
dts
env
examples
fs
lib
net
test
test/env
test/optee
test/overlay
tools

请添加图片描述

01	# SPDX-License-Identifier: GPL-2.0
02	# ==========================================================================
03	# Cleaning up
04	# ==========================================================================
05
06	src := $(obj)
07
08	PHONY := __clean
09	__clean:
10
11	include scripts/Kbuild.include
12
13	# The filename Kbuild has precedence over Makefile
14	kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
15	include $(if $(wildcard $(kbuild-dir)/Kbuild), $(kbuild-dir)/Kbuild, $(kbuild-dir)/Makefile)
16
17	# Figure out what we need to build from the various variables
18	# ==========================================================================
19
20	__subdir-y	:= $(patsubst %/,%,$(filter %/, $(obj-y)))
21	subdir-y	+= $(__subdir-y)
22	__subdir-m	:= $(patsubst %/,%,$(filter %/, $(obj-m)))
23	subdir-m	+= $(__subdir-m)
24	__subdir-	:= $(patsubst %/,%,$(filter %/, $(obj-)))
25	subdir-		+= $(__subdir-)
26
27	# Subdirectories we need to descend into
28
29	subdir-ym	:= $(sort $(subdir-y) $(subdir-m))
30	subdir-ymn      := $(sort $(subdir-ym) $(subdir-))
31
32	# Add subdir path
33
34	subdir-ymn	:= $(addprefix $(obj)/,$(subdir-ymn))
35
36	# Temporal work-around for U-Boot
37
38	subdir-ymn	:= $(foreach f, $(subdir-ymn), \
39					$(if $(wildcard $(srctree)/$f/Makefile),$f))
40
41	# build a list of files to remove, usually relative to the current
42	# directory
43
44	__clean-files	:= $(extra-y) $(extra-m) $(extra-)       \
45			   $(always) $(targets) $(clean-files)   \
46			   $(hostprogs-y) $(hostprogs-m) $(hostprogs-) \
47			   $(hostlibs-y) $(hostlibs-m) $(hostlibs-) \
48			   $(hostcxxlibs-y) $(hostcxxlibs-m)
49
50	__clean-files   := $(filter-out $(no-clean-files), $(__clean-files))
51
52	# clean-files is given relative to the current directory, unless it
53	# starts with $(objtree)/ (which means "./", so do not add "./" unless
54	# you want to delete a file from the toplevel object directory).
55
56	__clean-files   := $(wildcard                                               \
57			   $(addprefix $(obj)/, $(filter-out $(objtree)/%, $(__clean-files))) \
58			   $(filter $(objtree)/%, $(__clean-files)))
59
60	# same as clean-files
61
62	__clean-dirs    := $(wildcard                                               \
63			   $(addprefix $(obj)/, $(filter-out $(objtree)/%, $(clean-dirs)))    \
64			   $(filter $(objtree)/%, $(clean-dirs)))
65
66	# ==========================================================================
67
68	quiet_cmd_clean    = CLEAN   $(obj)
69		  cmd_clean    = rm -f $(__clean-files)
70	quiet_cmd_cleandir = CLEAN   $(__clean-dirs)
71		  cmd_cleandir = rm -rf $(__clean-dirs)
72
73
74	__clean: $(subdir-ymn)
75	ifneq ($(strip $(__clean-files)),)
76		+$(call cmd,clean)
77	endif
78	ifneq ($(strip $(__clean-dirs)),)
79		+$(call cmd,cleandir)
80	endif
81		@:
82
83
84	# ===========================================================================
85	# Generic stuff
86	# ===========================================================================
87
88	# Descending
89	# ---------------------------------------------------------------------------
90
91	PHONY += $(subdir-ymn)
92	$(subdir-ymn):
93		$(Q)$(MAKE) $(clean)=$@
94
95	.PHONY: $(PHONY)
96

从上到下依次执行,伪目标PHONY在第8行和第91行可知,PHONY = __clean $(subdir-ymn),目标__clean在74行定义了依赖和语句,$(subdir-ymn)在92行定义了依赖和语句,所以从这两个目标的依赖和语句可知,优先执行目标$(subdir-ymn) 再执行目标__clean

目标 $(subdir-ymn)

30	subdir-ymn  := $(sort $(subdir-ym) $(subdir-))
34	subdir-ymn	:= $(addprefix $(obj)/,$(subdir-ymn))
38	subdir-ymn	:= $(foreach f, $(subdir-ymn), $(if $(wildcard $(srctree)/$f/Makefile),$f))
92	$(subdir-ymn):
93		$(Q)$(MAKE) $(clean)=$@

30行:$(subdir-ym) 和 $(subdir-) 分析,在第20-29行定义:sort函数、patsubst函数、filter函数

20	__subdir-y	:= $(patsubst %/,%,$(filter %/, $(obj-y)))
21	subdir-y	+= $(__subdir-y)
22	__subdir-m	:= $(patsubst %/,%,$(filter %/, $(obj-m)))
23	subdir-m	+= $(__subdir-m)
24	__subdir-	:= $(patsubst %/,%,$(filter %/, $(obj-)))
25	subdir-		+= $(__subdir-)
26
27	# Subdirectories we need to descend into
28
29	subdir-ym	:= $(sort $(subdir-y) $(subdir-m))

$(obj-y)、$(obj-m)、$(obj-)从何而来?

06	src := $(obj)
14	kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
15	include $(if $(wildcard $(kbuild-dir)/Kbuild), $(kbuild-dir)/Kbuild, $(kbuild-dir)/Makefile)

$(obj)具体的内容在最上面的表格中已经列举出来了,其中包含的单词既有符合/%模式的也有不符合的,第14行用来进行相应判断后赋值 kbuild-dir。例如:obj=api,kbuild-dir=./api ;obj=drivers/dma,kbuild-dir=drivers/dma
第15行,其实就是判断最上面表格列出的目录中是否存在Kbuild文件,存在则引用此文件,不存在则引用目录中的Makefile文件。

$(obj-y)、$(obj-m)、$(obj-)三个变量定义在这相应目标的Kbuild文件或Makefile文件中,例如cmd目录下的Makefile:

200 obj-$(CONFIG_CMD_SCP03) += scp03.o
202 obj-$(CONFIG_ARM) += arm/
203 obj-$(CONFIG_RISCV) += riscv/
204 obj-$(CONFIG_SANDBOX) += sandbox/
205 obj-$(CONFIG_X86) += x86/

$(obj-y)、$(obj-m)、$(obj-)中过滤掉所有不符合%/模式的单词,保留所有符合此模式的单词,然后从所有符合%/模式的单词中匹配到符合%/的单词后,用%进行替换 [也就是将最后的/去除]。也就是从$(obj-y)、$(obj-m)、$(obj-)中找到文件夹名。
结论:此行的 subdir-ymn 其实就是Kbuild文件或Makefile文件中变量$(obj-y)、$(obj-m)、$(obj-)所包含的文件夹名。

34行:给第30行$(subdir-ymn)添加$(obj)/前缀,$(obj)内容在最上面表格中已经列出,addprefix函数
38行:判断 $(obj)/$(subdir-ymn) 目录下是否存在 Makefile 文件,存在返回$(obj)/$(subdir-ymn) ,否则返回空。foreach函数、wildcard函数
92-93行:从引用的文件中过滤匹配$(obj-y)、$(obj-m)、$(obj-)三个变量中的文件夹名,只保留文件夹名下有Makefile文件的文件名,也就是层层查询所有的Makefile文件所在的目录名。
最终回显:make -f ./scripts/Makefile.clean obj=所有存在Makefile文件的目录名

目标__clean

74	__clean: $(subdir-ymn)
75	ifneq ($(strip $(__clean-files)),)
76		+$(call cmd,clean)
77	endif
78	ifneq ($(strip $(__clean-dirs)),)
79		+$(call cmd,cleandir)
80	endif
81		@:

75行:__clean-files 定义如下,strip函数

44	__clean-files	:= $(extra-y) $(extra-m) $(extra-) $(always) $(targets) $(clean-files) $(hostprogs-y) $(hostprogs-m) $(hostprogs-) $(hostlibs-y) $(hostlibs-m) $(hostlibs-) $(hostcxxlibs-y) $(hostcxxlibs-m)
50	__clean-files   := $(filter-out $(no-clean-files), $(__clean-files))
56	__clean-files   := $(wildcard  $(addprefix $(obj)/, $(filter-out $(objtree)/%, $(__clean-files))) $(filter $(objtree)/%, $(__clean-files)))

第44行,根据第15行引用,这些变量都定义相应目录下的KbuildMakefile文件中。
第50行,$(no-clean-files)为空,所有这里是将第44行中变量为空的部分过滤掉。
第56行,查找$(__clean-files) 中不符合./%模式的单词,并将其添加$(obj)/前缀,和查找$(__clean-files) 中符合./%模式的单词,最后通过wildcard函数去相应目录下匹配指定模式的所有文件名列表,如果相应目录下没有指定文件名则匹配失败返回空字符串。编译前后相应目录下文件对比如下:wildcard函数、addprefix函数、filter-out函数、filter函数

目录编译后编译前
dtsdts/dt.dtb
dts/dt.dtb.S
不存在
dts/…/arch/arm/dtsdts/…/arch/arm/dts/bcm2837-rpi-3-b.dtb
dts/…/arch/arm/dts/bcm2835-rpi-b-plus.dtb
dts/…/arch/arm/dts/bcm2835-rpi-a-plus.dtb
dts/…/arch/arm/dts/bcm2835-rpi-b.dtb
dts/…/arch/arm/dts/bcm2835-rpi-a.dtb
dts/…/arch/arm/dts/bcm2835-rpi-cm1-io1.dtb
dts/…/arch/arm/dts/bcm2837-rpi-3-b-plus.dtb
dts/…/arch/arm/dts/bcm2835-rpi-zero-w.dtb
dts/…/arch/arm/dts/bcm2835-rpi-b-rev2.dtb
dts/…/arch/arm/dts/bcm2836-rpi-2-b.dtb
dts/…/arch/arm/dts/bcm2837-rpi-3-a-plus.dtb
dts/…/arch/arm/dts/bcm2837-rpi-cm3-io3.dtb
dts/…/arch/arm/dts/bcm2835-rpi-zero.dtb
不存在
toolstools/mkenvimage
tools/dumpimage
tools/mkimage
tools/proftool
tools/fdtgrep
tools/spl_size_limit
tools/mkenvimage
tools/dumpimage
tools/mkimage
tools/proftool
tools/fdtgrep
tools/spl_size_limit
tools/gen_eth_addr
tools/gen_ethaddr_crc
tools/img2srec
不存在
scripts/basicscripts/basic/fixdep
scripts/basic/fixdep
不存在
scripts/dtcscripts/dtc/dtc
scripts/dtc/dtc
不存在
scripts/kconfigscripts/kconfig/conf不存在
其他不存在不存在

所以此行中$(__clean-files)一般为空,只有编译后的情况下(如上表中所示),部分不为空。不为空时,执行cmd_clean函数:

69 cmd_clean = rm -f $(__clean-files)

78行:$(__clean-dirs) 定义如下:

62	__clean-dirs := $(wildcard  $(addprefix $(obj)/, $(filter-out $(objtree)/%, $(clean-dirs)))  $(filter $(objtree)/%, $(clean-dirs)))

其中$(clean-dirs)定义在第15行引用的Kbuild或者Makefile文件中,通过打印测试发现,只有tools/Makefilescripts/kconfig/Makefile文件中有定义clean-dirs,分别为: clean-dirs += lib common clean-dirs += tests/.cache,其他的都未定义,$(clean-dirs)为空。
所以此行中$(__clean-dirs)一般为空,只有tools 和 scripts/kconfig 不为空。不为空时,执行cmd_cleandir函数:

71 cmd_cleandir = rm -rf $(__clean-dirs)

81行:命令前加@表示不显示源命令,:是bash的内建命令,效果就是就是什么都不做, 并且总是返回状态0,所以总体来说 @: 就是什么都不做,如果后面有参数,等同于注释掉。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/13737.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react中的useEffect()的使用

useEffect()是react中的hook函数,作用是用于创建由渲染本身引起的操作,而不是事件的触发,比如Ajax请求,DOM的更改 首先useEffect()是个函数,接受两个参数,第一个参数是一个方法,第二个参数是数…

vue3 路由跳转 携带参数

实现功能:页面A 跳转到 页面B,携带参数 路由router.ts import { createRouter, createWebHistory } from "vue-router";const routes: RouteRecordRaw[] [{path: "/demo/a",name: "aa",component: () > import(&quo…

x264 码率控制原理:x264_ratecontrol_start 函数

x264_ratecontrol_start 函数 函数原理 函数功能:编码一帧之前,为当前帧选择一个量化 QP,属于帧级别码率控制;这对于控制视频质量和文件大小至关重要。通过调整QP,编码器可以在保持视频质量的同时,尽可能减小输出文件的大小。函数参数:x264_t *h: 编码器上下文结构体指…

地信遥感测绘电子书

《地理信息系统概论》,黄杏元,马劲松编著,第三版,高等教育出版社,2008年 《地理信息系统》(第二版)汤国安,赵牡丹,杨昕等编,高等教育出版社,2010…

【stm32/CubeMX、HAL库】嵌入式实验五:定时器(2)|PWM输出

参考: 【【正点原子】手把手教你学STM32CubeIDE开发】 https://www.bilibili.com/video/BV1Wp42127Cx/?p13&share_sourcecopy_web&vd_source9332b8fc5ea8d349a54c3989f6189fd3 《嵌入式系统基础与实践》刘黎明等编著,第九章定时器&#xff0c…

8操作系统定义、分类及功能+设备管理+作业管理 软设刷题 软考+

操作系统定义、分类及功能设备管理作业管理 知识点1-55-1010-1515-2020-2525-3030-35 刷题操作系统定义、分类及功能1-55-1010-15作业管理1-5设备管理1-55-10 知识点 1-5 1 嵌入式操作系统的特点: 1.微型化,从性能和成本角度考虑,希望占用的…

145.栈和队列:删除字符串中的所有相邻重复项(力扣)

题目描述 代码解决 class Solution { public:string removeDuplicates(string s) {// 定义一个栈来存储字符stack<char> st;// 遍历字符串中的每一个字符for(int i 0; i < s.size(); i){// 如果栈为空或栈顶字符与当前字符不相同&#xff0c;则将当前字符入栈if(st.e…

Jenkins的Pipeline流水线

目录 前言 流水线概念 什么是流水线 Jenkins流水线 pipeline node stage step 创建一个简单的流水线 创建Pipeline项目 选择模板 测试 前言 提到 CI 工具&#xff0c;首先想到的就是“CI 界”的大佬——Jenkjns,虽然在云原生爆发的年代,蹦出来了很多云原生的 CI 工具…

Hive的窗口函数

定义&#xff1a; 聚合函数是针对定义的行集(组)执行聚集,每组只返回一个值.如sum()、avg()、max() 窗口函数也是针对定义的行集(组)执行聚集,可为每组返回多个值.如既要显示聚集前的数据,又要显示聚集后的数据.步骤&#xff1a; 1.将记录分割成多个分区. 2.在各个分区上调用窗…

word-表格疑难杂症诊治

一、用表格进行排版图片、制作公文头 可以在插入图片时固定列宽 二、表格中的疑难杂症 问题一&#xff1a;表格超过页面&#xff0c;右侧文字看不见 解决&#xff1a;表格窗口-布局-自动调整-根据窗口自动调整表格 问题二&#xff1a;表格底部文字被遮挡 解决&#xff1a;布…

【linux】yumvim工具理解使用

目录 Linux 软件包管理器 yum 关于 rzsz 注意事项 查看软件包 Linux开发工具 Linux编辑器-vim使用 vim的基本概念 vim的基本操作 vim正常模式命令集 vim末行模式命令集 简单vim配置 配置文件的位置 sudo提权 Linux 软件包管理器 yum 1.yum是什么&#xff1…

攻防世界---web---warmup

1、题目描述 2、查看源码&#xff0c;发现有个source.php 3、访问该文件&#xff0c;得到这一串代码 4、分析代码 5、访问hint.php&#xff0c;提示flag在ffffllllaaaagggg这个文件下 6、构造payload ?filesource.php?/../../../../../../ffffllllaaaagggg

Fitting Parameterized Three-Dimensional Models to Images

摘要 基于模型的识别和运动跟踪依赖于解决投影和模型参数&#xff0c;使其最佳适应匹配的2D图像特征的3D模型的能力。本文将当前的参数求解方法扩展到处理具有任意曲面和任意数量的内部参数&#xff08;表示关节、可变尺寸或表面变形&#xff09;的对象。开发了数值稳定化方法…

懒人网址导航页 search.html SQL注入漏洞复现

0x01 产品简介 懒人网址导航系统是一种智能化的网址导航平台,旨在帮助用户快速找到所需的网址和资源。该系统提供了智能化的网址搜索和推荐功能,能够根据用户的搜索习惯和偏好推荐相关的网址和资源。同时,系统还提供了网址分类、网址收藏和网址分享等功能,方便用户管理和共…

简易Docker磁盘使用面板Doku

这个项目似乎有 1 年多没更新了&#xff0c;最后发布版本的问题也没人修复&#xff0c;所以看看就行&#xff0c;不建议安装 什么是 Doku &#xff1f; Doku 是一个简单、轻量级的基于 Web 的应用程序&#xff0c;允许您以用户友好的方式监控 Docker 磁盘使用情况。Doku 显示 D…

南京沁恒微USB HUB CH334/CH335多种封装规格选择,外围简单,价格还美丽

概述&#xff1a; CH334 和 CH335 是符合 USB2.0 协议规范的 全速&#xff0c;下行端口支持 USB2.0 高速 480Mbps 个 TT 分时调度 4 个下行端口&#xff09;&#xff0c;还支持高性能的 工业级设计&#xff0c;外围精简&#xff0c;可应用于计算机和工控机主板 特点&#xff1…

精品UI响应式视频教程知识付费系统源码在线教育网络课程在线点播可二开分销分站功能

这是一款知识付费平台模板&#xff0c;后台可上传本地视频&#xff0c;批量上传视频连接&#xff0c; 视频后台可设计权限观看&#xff0c;免费试看时间时长&#xff0c;会员等级观看&#xff0c;付费观看等功能&#xff0c; 也带软件app权限下载&#xff0c;帮助知识教育和软件…

域名邮箱是什么?怎么注册公司的域名邮箱?

拥有一个专业、独特的邮箱地址不仅能提升企业形象&#xff0c;还能增强客户信任感。域名邮箱是什么&#xff1f;域名邮箱也称为企业邮箱或定制邮箱&#xff0c;是一种基于企业自主域名设置的电子邮件服务。本文将详细介绍域名邮箱的概念、优势以及如何注册公司的域名邮箱 一、…

事务的ACID是什么及扁平化事务、链式事务

一、什么是事务 1.事务&#xff08;Transaction)是区别于数据库文件系统的重要特性之一。事务会把数据库从一种一致状态转换为另一种一致状态。在数据库提交工作时&#xff0c;可以确保要么所有修改都已经保存&#xff0c;要么所有修改都不保存。 2.InnoDB存储引擎中的事物完…

详解HTML

目录 1.HTML 结构 1.1认识HTML标签 1.2标签层次结构 1.3快速生成代码框架 2.HTML常见标签 2.1注释标签 2.2标题标签&#xff1a;h1-h6 2.3段落标签&#xff1a;p 2.4换行标签&#xff1a;br 2.5格式化标签 2.6图片标签&#xff1a;img 2.7超链接标签 2.8表格标签…