./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.pswp.cn/web/13737.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/13737.shtml
英文地址,請注明出處:http://en.pswp.cn/web/13737.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

react中的useEffect()的使用

useEffect()是react中的hook函數,作用是用于創建由渲染本身引起的操作,而不是事件的觸發,比如Ajax請求,DOM的更改 首先useEffect()是個函數,接受兩個參數,第一個參數是一個方法,第二個參數是數…

數據結構--樹與二叉樹--編程求以孩子兄弟表示法存儲的森林的葉結點個數

數據結構–樹與二叉樹–編程求以孩子兄弟表示法存儲的森林的葉結點個數 題目 編程求以孩子兄弟表示法存儲的森林的葉結點個數 ps:題目來源2025王道數據結構 思路 樹上的操作大多數是通過遞歸進行的 我們可以從根節點開始遞歸 如果結點 N 沒有孩子指針&#xff…

【Entity Framework】如何理解EF中的級聯刪除

【Entity Framework】如何理解EF中的級聯刪除 文章目錄 【Entity Framework】如何理解EF中的級聯刪除一、概述二、發生級聯行為時2.1/刪除主體/父實體2.2/斷開關系 三、發生級聯行為的位置3.1/級聯刪除被跟蹤實體3.2/數據庫中的級聯刪除 四、級聯NULL 一、概述 Entity Framewo…

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: 編碼器上下文結構體指…

十七、個人信息出境標準合同的具體內容有哪些?

根據《標準合同辦法》第六條,標準合同應當嚴格按照網信辦制定版本訂立,個人信息處理者可以與境外接收方約定其他條款,但不得與標準合同相沖突。 根據《標準合同辦法》附件,目前版本的標準合同內容主要包括: 1. 個人信…

Flutter 中的 TextButton 小部件:全面指南

Flutter 中的 TextButton 小部件:全面指南 在Flutter的世界里,TextButton是一個基礎的小部件,用于創建只包含文本的按鈕。它通常用于對話框、表單以及需要強調主要操作的界面。本文將為您提供一個全面的指南,幫助您了解如何使用T…

地信遙感測繪電子書

《地理信息系統概論》,黃杏元,馬勁松編著,第三版,高等教育出版社,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;布…

ArcGIS Maps SDK for JS:使用queryFeatures方法查詢 FeatureLayer 中符合條件的要素

文章目錄 方式一&#xff1a;使用featureLayer.createQuery()方法方式二&#xff1a;使用 Query 構造函數方式三&#xff1a;簡化寫法 要想查詢FeatureLayer 圖層中滿足某些條件的要素&#xff0c;可以使用ArcGIS API for JavaScript 提供的queryFeatures() 方法和 Query 對象進…

【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 產品簡介 懶人網址導航系統是一種智能化的網址導航平臺,旨在幫助用戶快速找到所需的網址和資源。該系統提供了智能化的網址搜索和推薦功能,能夠根據用戶的搜索習慣和偏好推薦相關的網址和資源。同時,系統還提供了網址分類、網址收藏和網址分享等功能,方便用戶管理和共…

git常見的18條指令

使用git的時候有沒有遺忘指令的情況呢&#xff1f;小編替大家整理出來了18條常用的指令&#xff0c;大家趕緊收藏起來吧&#xff01; gti常見的18條指令 序號指令含義1git init初始化一個倉庫2git clone [url]克隆一個倉庫3git add [file]添加文件到暫存區4git commit -m "…