./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,所以总体来说 @: 就是什么都不做,如果后面有参数,等同于注释掉。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式12——外观模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。 外观模式(Facade&a…

神经网络模型结构和参数可视化

神经网络模型结构和参数可视化 一、前言二、Netron2.1Netron简介2.2TensorFlow、Keras、Caffe模型文件实测结果2.3PyTorch、scikit-learn模型文件实测结果 三、NN-SVG四、Netscope五、PlotNeuralNet六、Graphviz七、总结参考文档 一、前言 在神经网络的某些应用场景中&#xf…

【kubernetes】探索k8s集群中kubectl的陈述式资源管理

目录 一、k8s集群资源管理方式分类 1.1陈述式资源管理方式:增删查比较方便,但是改非常不方便 1.2声明式资源管理方式:yaml文件管理 二、陈述式资源管理方法 2.1查看版本信息 2.2查看资源对象简写 2.3配置kubectl自动补全 2.4node节点…

基于QEMU-aarch64学习UEFI(EDK2)-7Print打印函数

1 基于QEMU-aarch64学习UEFI(EDK2)-7Print打印函数 文章目录 1 基于QEMU-aarch64学习UEFI(EDK2)-7Print打印函数1.1 Print打印函数输出字符串1.2 Print打印函数其他用法程序开发我们以 edk2-stable202302版本为准。 1.1 Print打印函数输出字符串 我们把edk2/MdeModulePkg/App…

利用 MongoDB Atlas 进行大模型语义搜索和RAG

节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学. 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总合集&…

基于JAVA的Dubbo 实现的各种限流算法

在基于 Java 的 Dubbo 实现中,限流(Rate Limiting)同样是一个关键的需求。Dubbo 是阿里巴巴开源的一款高性能 Java RPC 框架,广泛应用于分布式服务架构中。实现限流可以帮助服务在高并发场景下保持稳定性和可靠性。以下是几种常见…

PostgresSQL开启归档模式

文章目录 一、查询数据库归档是否开启1、查看数据目录(找出conf文件位置)2、查看归档是否开启 二、开启归档模式(开启后有一定的性能损耗)1、创建归档目录2、修改postgresql.conf配置文件3、重启pg 三、验证归档情况1、查看归档是否开启2、检查点 , 刷新…

04-Json/Ajax/Vue的知识

1. Json结构 1.1 Json概述 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,实现数据前后端交互。 它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。 JSON采用完全独立于程序语言的文本格式。这些特性使JSON成为理想的数据交换…

前端 CSS 经典:好看的标题动画

前言&#xff1a;好看的标题动画实现。 效果&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><…

注意力机制篇 | MSFE:即插即用的多尺度滑窗注意力(附源码实现)

前言:Hello大家好,我是小哥谈。多尺度滑窗注意力(Multi-Scale Sliding Window Attention,MSFE)是一种用于处理图像的深度学习模型。它通过引入多尺度特征提取和滑窗注意力机制来提高图像识别的准确性。在MSFE中,模型采用多尺度卷积神经网络来提取图像的特征,然后使用滑窗…

3d数字化虚拟交互展厅让您紧跟时代的步伐

虚实融合打破边界&#xff0c;北京VR虚拟数字展厅搭建让体验者彷如置身于一部三维电影中&#xff0c;可以对场景中的物体、角色、模型进行自由参观和体验&#xff0c;并且系统支持随时更新&#xff0c;让您紧跟时代的步伐&#xff0c;领略更新的展览风采。 除了常见的科普培训&…

服务端Web资源缓存

1.前言 虽然客户端缓存效果很好&#xff0c;但它有一个核心问题&#xff1a;要在本地提供资源&#xff0c;必须先将其存储在缓存中。因此&#xff0c;每个客户端都需要其缓存的资源。如果请求的资源需要大量计算&#xff0c;则无法扩展。服务器端缓存背后的理念是计算一次资源…

Eclipse下载安装教程(包含JDK安装)【保姆级教学】【2024.4已更新】

目录 文章最后附下载链接 第一步&#xff1a;下载Eclipse&#xff0c;并安装 第二步&#xff1a;下载JDK&#xff0c;并安装 第三步&#xff1a;Java运行环境配置 安装Eclipse必须同时安装JDK &#xff01;&#xff01;&#xff01; 文章最后附下载链接 第一步&#xf…

高校多云资源统一管理和监控解决方案

项目背景与业务场景 随着云计算技术不断发展更新&#xff0c;高校科研用户对云服务需求不断提高&#xff0c;科研又是基础创新的来源&#xff0c;但算力少、共享难、不好用一直是科研的突出问题。小的科研团队经费少设备少&#xff0c;中型的科研团队设备有限&#xff0c;高峰…

【企业动态】东胜物联成为AWS硬件合作伙伴,助力实现边缘智能

近日&#xff0c;AIoT硬件设备供应商东胜物联与全球领先的云计算服务提供商亚马逊云&#xff08;AWS&#xff09;达成合作关系&#xff0c;共同致力于推动物联网技术的发展&#xff0c;为企业客户提供更智能、灵活的硬件解决方案&#xff0c;助力智能化升级和数字化转型。 作为…

Vue3刷新页面后404,需要配置IIS的URL重写

Vue3刷新页面后404&#xff0c;需要配置IIS的URL重写 1.下载IIS重写工具 https://download.csdn.net/download/cplvfx/89331452 2.IIS的Url配置 安装后IIS会显示《URL重写》 选中你的站点 点击重写 点击《增加规则》 点击-空白规则 2.1匹配URL 请求的URL&#xff1a; 选择…

ArcGIS批量更改所有符号的格式

这期谈一下&#xff0c;如何修改所有符号的样式。 比如&#xff0c;我们需要更改下图的面符号位无轮廓的 该如何批量修改的呢&#xff1f; 视频教学吧&#xff1a; ArcGIS批量更改所有符号的格式 ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放-CSDN博客文章浏览阅…

MavLinK协议

由于在公司需要使用这个&#xff0c;我就写一个文章用于入门级别 简单介绍 MAVSDK是PX4开源团队贡献的基于mavlink通信协议的用于无人机应用开发的SDK&#xff0c;其可以部署在Windows、Linux、Android等多种平台&#xff0c;并且支持多种语言如c/c、python、Java等。 在官网…

Docker-数据卷的挂载

文章目录 数据卷概念数据卷实现机制数据卷特性数据卷操作数据卷挂载通用命令匿名挂载具名挂载数据卷继承容器数据卷只读容器数据卷读写-默认 总结 数据卷概念 为了很好的实现数据保存和数据共享&#xff0c;Docker提出了Volume这个概念&#xff0c;简单的说就是绕过默认的联合文…

【手写大跟堆详解】

文章目录 大跟堆介绍大跟堆的结构大跟堆的应用场景大跟堆的代码实现 大跟堆介绍 大根堆&#xff08;Max Heap&#xff09;是一种特殊的二叉树结构&#xff0c;它满足以下两个条件&#xff1a; 1.完全二叉树&#xff1a;大根堆是一棵完全二叉树&#xff0c;即除了最后一层外&am…