make disclean V=1 分析

news2024/9/20 0:28:02

文章目录

  • make distclean
    • 步骤1:2090-2114行,执行依赖 clean
    • 步骤2:2120-2124行,执行依赖 $(mrproper-dirs)
    • 步骤3:2118-2129行,执行依赖 mrproper
    • 步骤4:2135-2142行,实现 distclean

请添加图片描述

编译后执行 make distclean V=1

001	make -f ./scripts/Makefile.clean obj=api
002	make -f ./scripts/Makefile.clean obj=cmd
003	make -f ./scripts/Makefile.clean obj=cmd/arm
004	make -f ./scripts/Makefile.clean obj=cmd/broadcom
005	make -f ./scripts/Makefile.clean obj=cmd/mvebu
006	make -f ./scripts/Makefile.clean obj=cmd/riscv
007	make -f ./scripts/Makefile.clean obj=cmd/sandbox
008	make -f ./scripts/Makefile.clean obj=cmd/ti
009	make -f ./scripts/Makefile.clean obj=cmd/x86
010	make -f ./scripts/Makefile.clean obj=common
011	make -f ./scripts/Makefile.clean obj=common/init
012	make -f ./scripts/Makefile.clean obj=disk
013	make -f ./scripts/Makefile.clean obj=drivers
014	make -f ./scripts/Makefile.clean obj=drivers/adc
015	make -f ./scripts/Makefile.clean obj=drivers/ata
016	make -f ./scripts/Makefile.clean obj=drivers/axi
017	make -f ./scripts/Makefile.clean obj=drivers/bios_emulator
018	make -f ./scripts/Makefile.clean obj=drivers/block
019	make -f ./scripts/Makefile.clean obj=drivers/bootcount
020	make -f ./scripts/Makefile.clean obj=drivers/bus
021	make -f ./scripts/Makefile.clean obj=drivers/button
022	make -f ./scripts/Makefile.clean obj=drivers/cache
023	make -f ./scripts/Makefile.clean obj=drivers/clk
024	make -f ./scripts/Makefile.clean obj=drivers/clk/altera
025	make -f ./scripts/Makefile.clean obj=drivers/clk/analogbits
026	make -f ./scripts/Makefile.clean obj=drivers/clk/aspeed
027	make -f ./scripts/Makefile.clean obj=drivers/clk/at91
028	make -f ./scripts/Makefile.clean obj=drivers/clk/exynos
029	make -f ./scripts/Makefile.clean obj=drivers/clk/imx
030	make -f ./scripts/Makefile.clean obj=drivers/clk/intel
031	make -f ./scripts/Makefile.clean obj=drivers/clk/kendryte
032	make -f ./scripts/Makefile.clean obj=drivers/clk/mediatek
033	make -f ./scripts/Makefile.clean obj=drivers/clk/meson
034	make -f ./scripts/Makefile.clean obj=drivers/clk/microchip
035	make -f ./scripts/Makefile.clean obj=drivers/clk/mtmips
036	make -f ./scripts/Makefile.clean obj=drivers/clk/mvebu
037	make -f ./scripts/Makefile.clean obj=drivers/clk/owl
038	make -f ./scripts/Makefile.clean obj=drivers/clk/renesas
039	make -f ./scripts/Makefile.clean obj=drivers/clk/rockchip
040	make -f ./scripts/Makefile.clean obj=drivers/clk/sifive
041	make -f ./scripts/Makefile.clean obj=drivers/clk/sunxi
042	make -f ./scripts/Makefile.clean obj=drivers/clk/tegra
043	make -f ./scripts/Makefile.clean obj=drivers/clk/ti
044	make -f ./scripts/Makefile.clean obj=drivers/clk/uniphier
045	make -f ./scripts/Makefile.clean obj=drivers/core
046	make -f ./scripts/Makefile.clean obj=drivers/cpu
047	make -f ./scripts/Makefile.clean obj=drivers/crypto
048	make -f ./scripts/Makefile.clean obj=drivers/crypto/fsl
049	make -f ./scripts/Makefile.clean obj=drivers/crypto/rsa_mod_exp
050	make -f ./scripts/Makefile.clean obj=drivers/ddr/microchip
051	make -f ./scripts/Makefile.clean obj=drivers/demo
052	make -f ./scripts/Makefile.clean obj=drivers/dfu
053	make -f ./scripts/Makefile.clean obj=drivers/fastboot
054	make -f ./scripts/Makefile.clean obj=drivers/firmware
055	make -f ./scripts/Makefile.clean obj=drivers/firmware/scmi
056	make -f ./scripts/Makefile.clean obj=drivers/fpga
057	make -f ./scripts/Makefile.clean obj=drivers/gpio
058	make -f ./scripts/Makefile.clean obj=drivers/hwspinlock
059	make -f ./scripts/Makefile.clean obj=drivers/i2c
060	make -f ./scripts/Makefile.clean obj=drivers/i2c/muxes
061	make -f ./scripts/Makefile.clean obj=drivers/input
062	make -f ./scripts/Makefile.clean obj=drivers/led
063	make -f ./scripts/Makefile.clean obj=drivers/mailbox
064	make -f ./scripts/Makefile.clean obj=drivers/memory
065	make -f ./scripts/Makefile.clean obj=drivers/misc
066	make -f ./scripts/Makefile.clean obj=drivers/misc/imx8
067	make -f ./scripts/Makefile.clean obj=drivers/mmc
068	make -f ./scripts/Makefile.clean obj=drivers/mtd
069	make -f ./scripts/Makefile.clean obj=drivers/mtd/nand
070	make -f ./scripts/Makefile.clean obj=drivers/mtd/nand/raw
071	make -f ./scripts/Makefile.clean obj=drivers/mtd/nand/raw/brcmnand
072	make -f ./scripts/Makefile.clean obj=drivers/mtd/nand/spi
073	make -f ./scripts/Makefile.clean obj=drivers/mtd/onenand
074	make -f ./scripts/Makefile.clean obj=drivers/mtd/spi
075	make -f ./scripts/Makefile.clean obj=drivers/mtd/ubi
076	make -f ./scripts/Makefile.clean obj=drivers/mux
077	make -f ./scripts/Makefile.clean obj=drivers/nvme
078	make -f ./scripts/Makefile.clean obj=drivers/pch
079	make -f ./scripts/Makefile.clean obj=drivers/pci
080	make -f ./scripts/Makefile.clean obj=drivers/pci_endpoint
081	make -f ./scripts/Makefile.clean obj=drivers/phy
082	make -f ./scripts/Makefile.clean obj=drivers/phy/allwinner
083	make -f ./scripts/Makefile.clean obj=drivers/phy/marvell
084	make -f ./scripts/Makefile.clean obj=drivers/phy/rockchip
085	make -f ./scripts/Makefile.clean obj=drivers/pinctrl
086	make -f ./scripts/Makefile.clean obj=drivers/pinctrl/aspeed
087	make -f ./scripts/Makefile.clean obj=drivers/pinctrl/ath79
088	make -f ./scripts/Makefile.clean obj=drivers/pinctrl/broadcom
089	make -f ./scripts/Makefile.clean obj=drivers/pinctrl/exynos
090	make -f ./scripts/Makefile.clean obj=drivers/pinctrl/intel
091	make -f ./scripts/Makefile.clean obj=drivers/pinctrl/mediatek
092	make -f ./scripts/Makefile.clean obj=drivers/pinctrl/meson
093	make -f ./scripts/Makefile.clean obj=drivers/pinctrl/mscc
094	make -f ./scripts/Makefile.clean obj=drivers/pinctrl/mtmips
095	make -f ./scripts/Makefile.clean obj=drivers/pinctrl/mvebu
096	make -f ./scripts/Makefile.clean obj=drivers/pinctrl/nexell
097	make -f ./scripts/Makefile.clean obj=drivers/pinctrl/nxp
098	make -f ./scripts/Makefile.clean obj=drivers/pinctrl/renesas
099	make -f ./scripts/Makefile.clean obj=drivers/pinctrl/rockchip
100	make -f ./scripts/Makefile.clean obj=drivers/pinctrl/uniphier
101	make -f ./scripts/Makefile.clean obj=drivers/power/acpi_pmc
102	make -f ./scripts/Makefile.clean obj=drivers/pwm
103	make -f ./scripts/Makefile.clean obj=drivers/qe
104	make -f ./scripts/Makefile.clean obj=drivers/ram
105	make -f ./scripts/Makefile.clean obj=drivers/ram/aspeed
106	make -f ./scripts/Makefile.clean obj=drivers/ram/k3-ddrss
107	make -f ./scripts/Makefile.clean obj=drivers/ram/mediatek
108	make -f ./scripts/Makefile.clean obj=drivers/ram/octeon
109	make -f ./scripts/Makefile.clean obj=drivers/ram/rockchip
110	make -f ./scripts/Makefile.clean obj=drivers/ram/sifive
111	make -f ./scripts/Makefile.clean obj=drivers/ram/stm32mp1
112	make -f ./scripts/Makefile.clean obj=drivers/remoteproc
113	make -f ./scripts/Makefile.clean obj=drivers/reset
114	make -f ./scripts/Makefile.clean obj=drivers/rng
115	make -f ./scripts/Makefile.clean obj=drivers/rtc
116	make -f ./scripts/Makefile.clean obj=drivers/scsi
117	make -f ./scripts/Makefile.clean obj=drivers/serial
118	make -f ./scripts/Makefile.clean obj=drivers/smem
119	make -f ./scripts/Makefile.clean obj=drivers/soc
120	make -f ./scripts/Makefile.clean obj=drivers/soc/ti
121	make -f ./scripts/Makefile.clean obj=drivers/sound
122	make -f ./scripts/Makefile.clean obj=drivers/spi
123	make -f ./scripts/Makefile.clean obj=drivers/spmi
124	make -f ./scripts/Makefile.clean obj=drivers/sysinfo
125	make -f ./scripts/Makefile.clean obj=drivers/sysreset
126	make -f ./scripts/Makefile.clean obj=drivers/tee
127	make -f ./scripts/Makefile.clean obj=drivers/tee/broadcom
128	make -f ./scripts/Makefile.clean obj=drivers/tee/optee
129	make -f ./scripts/Makefile.clean obj=drivers/thermal
130	make -f ./scripts/Makefile.clean obj=drivers/timer
131	make -f ./scripts/Makefile.clean obj=drivers/tpm
132	make -f ./scripts/Makefile.clean obj=drivers/ufs
133	make -f ./scripts/Makefile.clean obj=drivers/video
134	make -f ./scripts/Makefile.clean obj=drivers/video/bridge
135	make -f ./scripts/Makefile.clean obj=drivers/video/exynos
136	make -f ./scripts/Makefile.clean obj=drivers/video/imx
137	make -f ./scripts/Makefile.clean obj=drivers/video/meson
138	make -f ./scripts/Makefile.clean obj=drivers/video/nexell
139	make -f ./scripts/Makefile.clean obj=drivers/video/nexell/soc
140	make -f ./scripts/Makefile.clean obj=drivers/video/rockchip
141	make -f ./scripts/Makefile.clean obj=drivers/video/stm32
142	make -f ./scripts/Makefile.clean obj=drivers/video/sunxi
143	make -f ./scripts/Makefile.clean obj=drivers/video/tegra124
144	make -f ./scripts/Makefile.clean obj=drivers/video/ti
145	make -f ./scripts/Makefile.clean obj=drivers/virtio
146	make -f ./scripts/Makefile.clean obj=drivers/w1
147	make -f ./scripts/Makefile.clean obj=drivers/w1-eeprom
148	make -f ./scripts/Makefile.clean obj=drivers/watchdog
149	make -f ./scripts/Makefile.clean obj=drivers/xen
150	make -f ./scripts/Makefile.clean obj=drivers/ddr/altera
151	make -f ./scripts/Makefile.clean obj=drivers/ddr/fsl
152	make -f ./scripts/Makefile.clean obj=drivers/dma
153	make -f ./scripts/Makefile.clean obj=drivers/dma/ti
154	make -f ./scripts/Makefile.clean obj=drivers/gpio
155	make -f ./scripts/Makefile.clean obj=drivers/i2c
156	make -f ./scripts/Makefile.clean obj=drivers/i2c/muxes
157	make -f ./scripts/Makefile.clean obj=drivers/net
158	make -f ./scripts/Makefile.clean obj=drivers/net/fsl-mc
159	make -f ./scripts/Makefile.clean obj=drivers/net/fsl-mc/dpio
160	make -f ./scripts/Makefile.clean obj=drivers/net/ldpaa_eth
161	make -f ./scripts/Makefile.clean obj=drivers/net/mscc_eswitch
162	make -f ./scripts/Makefile.clean obj=drivers/net/octeontx
163	make -f ./scripts/Makefile.clean obj=drivers/net/octeontx2
164	make -f ./scripts/Makefile.clean obj=drivers/net/pfe_eth
165	make -f ./scripts/Makefile.clean obj=drivers/net/qe
166	make -f ./scripts/Makefile.clean obj=drivers/net/ti
167	make -f ./scripts/Makefile.clean obj=drivers/net/fm
168	make -f ./scripts/Makefile.clean obj=drivers/net/phy
169	make -f ./scripts/Makefile.clean obj=drivers/power
170	make -f ./scripts/Makefile.clean obj=drivers/power/battery
171	make -f ./scripts/Makefile.clean obj=drivers/power/domain
172	make -f ./scripts/Makefile.clean obj=drivers/power/fuel_gauge
173	make -f ./scripts/Makefile.clean obj=drivers/power/mfd
174	make -f ./scripts/Makefile.clean obj=drivers/power/pmic
175	make -f ./scripts/Makefile.clean obj=drivers/power/regulator
176	make -f ./scripts/Makefile.clean obj=drivers/serial
177	make -f ./scripts/Makefile.clean obj=drivers/spi
178	make -f ./scripts/Makefile.clean obj=drivers/usb/cdns3
179	make -f ./scripts/Makefile.clean obj=drivers/usb/common
180	make -f ./scripts/Makefile.clean obj=drivers/usb/dwc3
181	make -f ./scripts/Makefile.clean obj=drivers/usb/emul
182	make -f ./scripts/Makefile.clean obj=drivers/usb/eth
183	make -f ./scripts/Makefile.clean obj=drivers/usb/gadget
184	make -f ./scripts/Makefile.clean obj=drivers/usb/gadget/udc
185	make -f ./scripts/Makefile.clean obj=drivers/usb/host
186	make -f ./scripts/Makefile.clean obj=drivers/usb/mtu3
187	make -f ./scripts/Makefile.clean obj=drivers/usb/musb
188	make -f ./scripts/Makefile.clean obj=drivers/usb/musb-new
189	make -f ./scripts/Makefile.clean obj=drivers/usb/phy
190	make -f ./scripts/Makefile.clean obj=drivers/usb/ulpi
191	make -f ./scripts/Makefile.clean obj=dts
192	make -f ./scripts/Makefile.clean obj=dts/../arch/arm/dts
193	  rm -f dts/../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
194	make -f ./scripts/Makefile.clean obj=dts/../arch/microblaze/dts
195	make -f ./scripts/Makefile.clean obj=dts/../arch/mips/dts
196	make -f ./scripts/Makefile.clean obj=dts/../arch/powerpc/dts
197	make -f ./scripts/Makefile.clean obj=dts/../arch/riscv/dts
198	make -f ./scripts/Makefile.clean obj=dts/../arch/sandbox/dts
199	make -f ./scripts/Makefile.clean obj=dts/../arch/x86/dts
200	  rm -f dts/dt.dtb dts/dt.dtb.S
201	make -f ./scripts/Makefile.clean obj=env
202	make -f ./scripts/Makefile.clean obj=examples
203	make -f ./scripts/Makefile.clean obj=fs
204	make -f ./scripts/Makefile.clean obj=fs/btrfs
205	make -f ./scripts/Makefile.clean obj=fs/cbfs
206	make -f ./scripts/Makefile.clean obj=fs/cramfs
207	make -f ./scripts/Makefile.clean obj=fs/ext4
208	make -f ./scripts/Makefile.clean obj=fs/fat
209	make -f ./scripts/Makefile.clean obj=fs/jffs2
210	make -f ./scripts/Makefile.clean obj=fs/reiserfs
211	make -f ./scripts/Makefile.clean obj=fs/sandbox
212	make -f ./scripts/Makefile.clean obj=fs/squashfs
213	make -f ./scripts/Makefile.clean obj=fs/ubifs
214	make -f ./scripts/Makefile.clean obj=fs/yaffs2
215	make -f ./scripts/Makefile.clean obj=fs/zfs
216	make -f ./scripts/Makefile.clean obj=lib
217	make -f ./scripts/Makefile.clean obj=lib/acpi
218	make -f ./scripts/Makefile.clean obj=lib/aes
219	make -f ./scripts/Makefile.clean obj=lib/at91
220	make -f ./scripts/Makefile.clean obj=lib/bzip2
221	make -f ./scripts/Makefile.clean obj=lib/crypto
222	make -f ./scripts/Makefile.clean obj=lib/dhry
223	make -f ./scripts/Makefile.clean obj=lib/efi
224	make -f ./scripts/Makefile.clean obj=lib/efi_driver
225	make -f ./scripts/Makefile.clean obj=lib/efi_loader
226	make -f ./scripts/Makefile.clean obj=lib/efi_selftest
227	make -f ./scripts/Makefile.clean obj=lib/libavb
228	make -f ./scripts/Makefile.clean obj=lib/libfdt
229	make -f ./scripts/Makefile.clean obj=lib/lzma
230	make -f ./scripts/Makefile.clean obj=lib/lzo
231	make -f ./scripts/Makefile.clean obj=lib/optee
232	make -f ./scripts/Makefile.clean obj=lib/rsa
233	make -f ./scripts/Makefile.clean obj=lib/tizen
234	make -f ./scripts/Makefile.clean obj=lib/zlib
235	make -f ./scripts/Makefile.clean obj=lib/zstd
236	make -f ./scripts/Makefile.clean obj=net
237	make -f ./scripts/Makefile.clean obj=test
238	make -f ./scripts/Makefile.clean obj=test/cmd
239	make -f ./scripts/Makefile.clean obj=test/dm
240	make -f ./scripts/Makefile.clean obj=test/image
241	make -f ./scripts/Makefile.clean obj=test/lib
242	make -f ./scripts/Makefile.clean obj=test/log
243	make -f ./scripts/Makefile.clean obj=test/env
244	make -f ./scripts/Makefile.clean obj=test/optee
245	make -f ./scripts/Makefile.clean obj=test/overlay
246	make -f ./scripts/Makefile.clean obj=tools
247	make -f ./scripts/Makefile.clean obj=tools/env
248	make -f ./scripts/Makefile.clean obj=tools/gdb
249	  rm -f tools/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
250	  rm -rf tools/lib tools/common
251	  rm -rf .tmp_versions    
252	  rm -f include/bmp_logo.h include/bmp_logo_data.h tools/version.h boot* u-boot* MLO* SPL System.map fit-dtb.blob* u-boot-ivt.img.log u-boot-dtb.imx.log SPL.log u-boot.imx.log lpc32xx-* bl31.c bl31.elf bl31_*.bin image.map tispl.bin* idbloader.img flash.bin flash.log defconfig keep-syms-lto.c
253	make -f ./scripts/Makefile.clean obj=scripts
254	make -f ./scripts/Makefile.clean obj=scripts/basic
255	  rm -f scripts/basic/fixdep scripts/basic/fixdep
256	make -f ./scripts/Makefile.clean obj=scripts/dtc
257	make -f ./scripts/Makefile.clean obj=scripts/dtc/pylibfdt
258	  rm -f scripts/dtc/dtc scripts/dtc/dtc
259	make -f ./scripts/Makefile.clean obj=scripts/kconfig
260	  rm -f scripts/kconfig/conf
261	  rm -rf include/config include/generated
262	  rm -f .config .config.old include/autoconf.mk include/autoconf.mk.dep include/config.h

在这里插入图片描述
在这里插入图片描述

make distclean

94 	ifeq ("$(origin V)", "command line")
95 	  KBUILD_VERBOSE = $(V)
96 	endif
97 	ifndef KBUILD_VERBOSE
98 	  KBUILD_VERBOSE = 0
99 	endif
100
101	ifeq ($(KBUILD_VERBOSE),1)
102	  quiet =
103	  Q =
104	else
105	  quiet=quiet_
106	  Q = @
107	endif
......
224	ifeq ($(KBUILD_SRC),)
225			# building in the source tree
226			srctree := .
227	else
228			ifeq ($(KBUILD_SRC)/,$(dir $(CURDIR)))
229					# building in a subdirectory of the source tree
230					srctree := ..
231			else
232					srctree := $(KBUILD_SRC)
233			endif
234	endif
......
470 export RCS_FIND_IGNORE := \( -name SCCS -o -name BitKeeper -o -name .svn -o    \
471			  -name CVS -o -name .pc -o -name .hg -o -name .git \) \
472			  -prune -o
......
2090 clean: rm-dirs  := $(CLEAN_DIRS)
2091 clean: rm-files := $(CLEAN_FILES)
2101 clean: $(clean-dirs)
2102 	$(call cmd,rmdirs)
2103 	$(call cmd,rmfiles)
2104	@find $(if $(KBUILD_EXTMOD), $(KBUILD_EXTMOD), .) $(RCS_FIND_IGNORE) \
2105		\( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \
2106		-o -name '*.ko.*' -o -name '*.su' -o -name '*.pyc' \
2107		-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
2108		-o -name '*.lex.c' -o -name '*.tab.[ch]' \
2109		-o -name '*.asn1.[ch]' \
2110		-o -name '*.symtypes' -o -name 'modules.order' \
2111		-o -name modules.builtin -o -name '.tmp_*.o.*' \
2112		-o -name 'dsdt.aml' -o -name 'dsdt.asl.tmp' -o -name 'dsdt.c' \
2113		-o -name '*.efi' -o -name '*.gcno' -o -name '*.so' \) \
2114		-type f -print | xargs rm -f
......
2120 mrproper-dirs    := $(addprefix _mrproper_,scripts)
2123 $(mrproper-dirs) :
2124 	$(Q)$(MAKE) $(clean)=$(patsubst _mrproper_%,%,$@)
......
2118 mrproper: rm-dirs  := $(wildcard $(MRPROPER_DIRS))
2119 mrproper: rm-files := $(wildcard $(MRPROPER_FILES))
2126 mrproper: clean $(mrproper-dirs)
2127 	$(call cmd,rmdirs)
2128 	$(call cmd,rmfiles)
2129 	@rm -f arch/*/include/asm/arch
......
2135 distclean: mrproper
2136	@find $(srctree) $(RCS_FIND_IGNORE) \
2137		\( -name '*.orig' -o -name '*.rej' -o -name '*~' \
2138		-o -name '*.bak' -o -name '#*#' -o -name '.*.orig' \
2139		-o -name '.*.rej' -o -name '*%' -o -name 'core' \
2140		-o -name '*.pyc' \) \
2141		-type f -print | xargs rm -f
2142	@rm -f boards.cfg CHANGELOG

当在命令行中输入: make distclean V=1 时,94行条件成立,KBUILD_VERBOSE = 1,101行条件成立,quiet 和 Q 为空,则输出整个命令。
输入命令自动匹配顶层 Makefile 的第2135 行并执行,由于目标 distclean 依赖 mrproper, mrproper 依赖 clean 和 $(mrproper-dirs)执行顺序如下:

1. 优先执行依赖 clean,即 2090-2114行
2. 再执行依赖$(mrproper-dirs),即 2120-2124行
3. 上面两步完成 mrproper 依赖的实现,然后完成 mrproper 最后的实现语句,即2127-2129行
4. 经过上面三步完成 distclean 依赖的实现,最后完成 distclean 的实现语句,即2136-2142行

步骤1:2090-2114行,执行依赖 clean

2090	clean: rm-dirs  := $(CLEAN_DIRS)
2091	clean: rm-files := $(CLEAN_FILES)
2092
2093	clean-dirs	:= $(foreach f,$(u-boot-alldirs),$(if $(wildcard $(srctree)/$f/Makefile),$f))
2094
2095	clean-dirs      := $(addprefix _clean_, $(clean-dirs))
2096
2097
2098	$(clean-dirs):
2099		$(Q)$(MAKE) $(clean)=$(patsubst _clean_%,%,$@)
2100
2101	clean: $(clean-dirs)
2102		$(call cmd,rmdirs)
2103		$(call cmd,rmfiles)
2104		@find $(if $(KBUILD_EXTMOD), $(KBUILD_EXTMOD), .) $(RCS_FIND_IGNORE) \
2105			\( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \
2106			-o -name '*.ko.*' -o -name '*.su' -o -name '*.pyc' \
2107			-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
2108			-o -name '*.lex.c' -o -name '*.tab.[ch]' \
2109			-o -name '*.asn1.[ch]' \
2110			-o -name '*.symtypes' -o -name 'modules.order' \
2111			-o -name modules.builtin -o -name '.tmp_*.o.*' \
2112			-o -name 'dsdt.aml' -o -name 'dsdt.asl.tmp' -o -name 'dsdt.c' \
2113			-o -name '*.efi' -o -name '*.gcno' -o -name '*.so' \) \
2114			-type f -print | xargs rm -f

从上面可以看出,clean 依赖 rm-dirs := $(CLEAN_DIRS)rm-files := $(CLEAN_FILES)$(clean-dirs)

2090行:clean 依赖 rm-dirs := $(CLEAN_DIRS),没有实现语句,所以这里只需要将依赖展开即可。
$(CLEAN_DIRS) 在顶层 Makefile 的第2069-2071行中定义,其中的 $(MODVERDIR) 在第466行中定义, foreach 函数、filter-out函数、patsubst函数、firstword函数

466   export MODVERDIR := $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/).tmp_versions
......
2069  CLEAN_DIRS  += $(MODVERDIR) \
2070			   $(foreach d, spl tpl, $(patsubst %,$d/%, \
2071				$(filter-out include, $(shell ls -1 $d 2>/dev/null))))

当命令行输入make M=dir,则 KBUILD_EXTMOD=dir,否则 KBUILD_EXTMOD 为空。由于命令行没有M=,所以MODVERDIR = .tmp_versions
2070行中的spl、tpl不存在,所以2070-2071行为空,最终展开为:

2090 clean:   rm-dirs := .tmp_versions

2091行:clean 依赖 rm-files := $(CLEAN_FILES),没有实现语句,所以这里只需要将依赖展开即可。
$(CLEAN_FILES) 在顶层 Makefile 的第2073-2077行中定义,

2073	CLEAN_FILES += include/bmp_logo.h include/bmp_logo_data.h tools/version.h \
2074			   boot* u-boot* MLO* SPL System.map fit-dtb.blob* \
2075			   u-boot-ivt.img.log u-boot-dtb.imx.log SPL.log u-boot.imx.log \
2076			   lpc32xx-* bl31.c bl31.elf bl31_*.bin image.map tispl.bin* \
2077			   idbloader.img flash.bin flash.log defconfig keep-syms-lto.c

最终展开为:

2091 clean: rm-files := include/bmp_logo.h include/bmp_logo_data.h tools/version.h boot* u-boot* MLO* SPL System.map fit-dtb.blob* u-boot-ivt.img.log u-boot-dtb.imx.log SPL.log u-boot.imx.log lpc32xx-* bl31.c bl31.elf bl31_*.bin image.map tispl.bin* idbloader.img flash.bin flash.log defconfig keep-syms-lto.c 

2101行:clean 依赖 $(clean-disrs),在第2093-2099行定义:

2093	clean-dirs	 := $(foreach f,$(u-boot-alldirs),$(if $(wildcard $(srctree)/$f/Makefile),$f))
2095	clean-dirs   := $(addprefix _clean_, $(clean-dirs))
2098	$(clean-dirs):
2099		$(Q)$(MAKE) $(clean)=$(patsubst _clean_%,%,$@)

2093行:中的$(u-boot-alldirs)在顶层 Makefile 的第792-853行定义:其实就 从变量 $(u-boot-alldirs) 中轮询查找相应目录下是否存在 Makefile 文件,将有 Makefile 文件的目录名依次赋值给变量 clean-dirs。最终: $(clean-dirs) = $(u-boot-alldirs) [即:重新排序去重并且去除目录名最后的/后的 $(libs-) $(libs-y)]

2095行:将变量 $(clean-dirs) 中的所有内容前缀加上 _clean_
2099行:$(clean)在 scripts/Kbuild.include [顶层Makefile第386行中引用]文件的第202行定义: clean := -f $(srctree)/scripts/Makefile.clean obj
在顶层Makefile中,srctree = . 所以: clean := -f ./scripts/Makefile.clean obj
结果:/scripts/Makefile.clean分析,会将2098行目标中所有包含Makefile的目录及其子目录全部回显出来,执行并回显001-250行

001 make -f ./scripts/Makefile.clean obj=api
002 make -f ./scripts/Makefile.clean obj=cmd
......
250 rm -rf tools/lib tools/common

foreach函数、wildcard函数、sort函数、patsubst函数、filter函数、addprefix函数

792  HAVE_VENDOR_COMMON_LIB = $(if $(wildcard $(srctree)/board/$(VENDOR)/common/Makefile),y,n)
793
794  libs-y += lib/
795  libs-$(HAVE_VENDOR_COMMON_LIB) += board/$(VENDOR)/common/
796  libs-$(CONFIG_OF_EMBED) += dts/
797  libs-y += fs/
798  libs-y += net/
799  libs-y += disk/
800  libs-y += drivers/
801  libs-y += drivers/dma/
802  libs-y += drivers/gpio/
803  libs-y += drivers/i2c/
804  libs-y += drivers/net/
805  libs-y += drivers/net/phy/
806  libs-y += drivers/power/ \
807    drivers/power/domain/ \
808    drivers/power/fuel_gauge/ \
809    drivers/power/mfd/ \
810    drivers/power/pmic/ \
811    drivers/power/battery/ \
812    drivers/power/regulator/
813  libs-y += drivers/spi/
814  libs-$(CONFIG_FMAN_ENET) += drivers/net/fm/
815  libs-$(CONFIG_SYS_FSL_DDR) += drivers/ddr/fsl/
816  libs-$(CONFIG_SYS_FSL_MMDC) += drivers/ddr/fsl/
817  libs-$(CONFIG_$(SPL_)ALTERA_SDRAM) += drivers/ddr/altera/
818  libs-y += drivers/serial/
819  libs-y += drivers/usb/cdns3/
820  libs-y += drivers/usb/dwc3/
821  libs-y += drivers/usb/common/
822  libs-y += drivers/usb/emul/
823  libs-y += drivers/usb/eth/
824  libs-$(CONFIG_USB_DEVICE) += drivers/usb/gadget/
825  libs-$(CONFIG_USB_GADGET) += drivers/usb/gadget/
826  libs-$(CONFIG_USB_GADGET) += drivers/usb/gadget/udc/
827  libs-y += drivers/usb/host/
828  libs-y += drivers/usb/mtu3/
829  libs-y += drivers/usb/musb/
830  libs-y += drivers/usb/musb-new/
831  libs-y += drivers/usb/phy/
832  libs-y += drivers/usb/ulpi/
833  libs-y += cmd/
834  libs-y += common/
835  libs-y += env/
836  libs-$(CONFIG_API) += api/
837  ifdef CONFIG_POST
838  libs-y += post/
839  endif
840  libs-$(CONFIG_UNIT_TEST) += test/
841  libs-$(CONFIG_UT_ENV) += test/env/
842  libs-$(CONFIG_UT_OPTEE) += test/optee/
843  libs-$(CONFIG_UT_OVERLAY) += test/overlay/
844
845  libs-y += $(if $(BOARDDIR),board/$(BOARDDIR)/)
846
847  libs-y := $(sort $(libs-y))
848
849  u-boot-dirs  := $(patsubst %/,%,$(filter %/, $(libs-y))) tools examples
850
851  u-boot-alldirs  := $(sort $(u-boot-dirs) $(patsubst %/,%,$(filter %/, $(libs-))))
852

其中所有的变量都未定义,所以 lib- libs-y 变量定义如下:

libs-libs-y
dts/ ;drivers/net/fm/;
drivers/ddr/fsl/
drivers/ddr/fsl/
drivers/ddr/altera/;
drivers/usb/gadget/
drivers/usb/gadget/
drivers/usb/gadget/udc/;
api/;test/ ;test/env/ ;test/optee/ ;test/overlay/;
lib/ ; fs/Cnet/ ; disk/ ; drivers/ ; drivers/dma/ ;drivers/gpio/ ; drivers/i2c/ ; drivers/net/ ; drivers/net/phy/ ; drivers/power/ ; drivers/power/domain/ ; drivers/power/fuel_gauge/ ; drivers/power/mfd/ ; drivers/power/pmic/ ; drivers/power/battery/drivers/power/regulator/ ; drivers/spi/ ; drivers/serial/ ; drivers/usb/cdns3/ ; drivers/usb/dwc3/ ; drivers/usb/common/ ; drivers/usb/emul/ ; drivers/usb/eth/ ; drivers/usb/host/ ; drivers/usb/mtu3/ ; drivers/usb/musb/ ; drivers/usb/musb-new/ ; drivers/usb/phy/ ; drivers/usb/ulpi/ ; cmd/ ; common/ ; env/ ;

第849行,将 $(libs-y) 变量最后一个/去除后的变量,并且追加 tools examples到变量 $(u-boot-dirs)
第851行,将 $(libs-) 变量最后一个/去除后的变量 和 变量 $(u-boot-dirs) 一起重新排序去重后赋值给变量 $(u-boot-alldirs)

2102行:call函数、cmd函数分析,cmd_rmdir 函数:rm -rf $(rm-dirs)
结果:依据上面2090行分析,执行并回显251行命令。

251 rm -rf .tmp_versions 

2103行:call函数、cmd函数分析,cmd_rmfiles 函数:rm -f $(rm-files)
结果:依据上面2091行分析,执行并回显252行命令。

252  rm -f include/bmp_logo.h include/bmp_logo_data.h tools/version.h boot* u-boot* MLO* SPL System.map fit-dtb.blob* u-boot-ivt.img.log u-boot-dtb.imx.log SPL.log u-boot.imx.log lpc32xx-* bl31.c bl31.elf bl31_*.bin image.map tispl.bin* idbloader.img flash.bin flash.log defconfig keep-syms-lto.c

2104行:在顶层Makefile中显示只有当命令行上中输入make M=dir时,KBUILD_EXTMOD=dir,否则KBUILD_EXTMOD为空,由于命令行上没有输入M,所以KBUILD_EXTMOD为空。顶层Makefile中第470行定义RCS_FIND_IGNORE为:

470 export RCS_FIND_IGNORE := \( -name SCCS -o -name BitKeeper -o -name .svn -o -name CVS -o -name .pc -o -name .hg -o -name .git \) -prune -o
find命令参数
@:表示不回显
find:用于查找特定文件或目录的命令(在当前目录下能查找SCCS等 则执行-prune, 否则,就print出来)
-name:查找的名称
-o:或者
-prune:忽略一个目录及其之下的文件
-type:类型【f 表示文件,d 表示目录】
-print:显示文件名
xargs:把 find 找出的文件一个一个处理

结果:查找并删除编译后产生的中间文件或目标文件,不回显。

步骤2:2120-2124行,执行依赖 $(mrproper-dirs)

2120 mrproper-dirs   := $(addprefix _mrproper_,scripts)
2123 $(mrproper-dirs):
2124     $(Q)$(MAKE) $(clean)=$(patsubst _mrproper_%,%,$@)

由于addprefix函数、patsubst函数和上面 2099行分析可知,最终展开为:

_mrproper_scripts:
    make -f ./scripts/Makefile.clean obj=scripts

2124行: /scripts/Makefile.clean分析,
结果:执行并回显253-260行

253 make -f ./scripts/Makefile.clean obj=scripts
254 make -f ./scripts/Makefile.clean obj=scripts/basic
255   rm -f scripts/basic/fixdep scripts/basic/fixdep
256 make -f ./scripts/Makefile.clean obj=scripts/dtc
257 make -f ./scripts/Makefile.clean obj=scripts/dtc/pylibfdt
258   rm -f scripts/dtc/dtc scripts/dtc/dtc
259 make -f ./scripts/Makefile.clean obj=scripts/kconfig
260   rm -f scripts/kconfig/conf

步骤3:2118-2129行,执行依赖 mrproper

2118 mrproper: rm-dirs  := $(wildcard $(MRPROPER_DIRS)) 
2119 mrproper: rm-files := $(wildcard $(MRPROPER_FILES))
2126 mrproper: clean $(mrproper-dirs)
2127 	  $(call cmd,rmdirs)
2128      $(call cmd,rmfiles)
2129	  @rm -f arch/*/include/asm/arch

从上面可以看出,mrproper 依赖 rm-dirs := $(wildcard $(MRPROPER_DIRS))rm-files := $(wildcard $(MRPROPER_FILES))clean$(mrproper-dirs)

2118行:mrproper 依赖 rm-dirs := $(wildcard $(MRPROPER_DIRS)),没有实现语句,所以这里只需要将依赖展开即可。
$(MRPROPER_DIRS) 在顶层 Makefile 的第2080-2081行中定义,

2080	MRPROPER_DIRS  += include/config include/generated spl tpl \
2081		  .tmp_objdiff doc/output

wildcard 函数分析,最终展开为:

2091 mrproper : rm-dirs :=include/config include/generated	#编译后会产生这两个文件夹2091 mrproper : rm-dirs :=	#未编译定义的文件夹都不存在

结果:执行并回显261行

261  rm -rf include/config include/generated	#编译后261  rm -f 	#未编译

2119行:mrproper 依赖 rm-files := $(wildcard $(MRPROPER_FILES)),没有实现语句,所以这里只需要将依赖展开即可。
$(MRPROPER_FILES) 在顶层 Makefile 的第2084-2086行中定义,

2084 MRPROPER_FILES += .config .config.old include/autoconf.mk* include/config.h \
2085		  ctags etags tags TAGS cscope* GPATH GTAGS GRTAGS GSYMS \
2086		  drivers/video/fonts/*.S include/asm

wildcard 函数分析,最终展开为:

2091 mrproper : rm-files :=.config .config.old include/autoconf.mk include/autoconf.mk.dep include/config.h	#编译后会产生这些文件2091 mrproper : rm-files :=	#未编译定义的文件都不存在

结果:执行并回显262行

262  rm -f .config .config.old include/autoconf.mk include/autoconf.mk.dep include/config.h	 #编译后262  rm -f 	#未编译

2126行:依赖 clean$(mrproper-dirs) 分别在步骤1和步骤2中实现。

2127行:同2102行分析一样,由于第2102行已经删去了相应文件夹(不回显),所以这里实际执行的是rm -rf

2128行:同2103行分析一样,由于第2103行已经删去了相应文件(不回显),所以这里实际执行的是rm -f

2129行:删除arch/*/include/asm/arch(不回显)

步骤4:2135-2142行,实现 distclean

2135 distclean: mrproper
2136 	@find $(srctree) $(RCS_FIND_IGNORE) \
2137 		\( -name '*.orig' -o -name '*.rej' -o -name '*~' \
2138 		-o -name '*.bak' -o -name '#*#' -o -name '.*.orig' \
2139 		-o -name '.*.rej' -o -name '*%' -o -name 'core' \
2140 		-o -name '*.pyc' \) \
2141 		-type f -print | xargs rm -f
2142 	@rm -f boards.cfg CHANGELOG

2135行:依赖 mrproper 在步骤3中实现。
2136行:在顶层Makefile中显示只有当命令行上中输入make M=dir时,KBUILD_EXTMOD=dir,否则KBUILD_EXTMOD为空,由于命令行上没有输入M,所以KBUILD_EXTMOD为空。顶层Makefile中第470行定义RCS_FIND_IGNORE为:

470 export RCS_FIND_IGNORE := \( -name SCCS -o -name BitKeeper -o -name .svn -o -name CVS -o -name .pc -o -name .hg -o -name .git \) -prune -o
find命令参数
@:表示不回显
find:用于查找特定文件或目录的命令(在当前目录下能查找SCCS等 则执行-prune, 否则,就print出来)
-name:查找的名称
-o:或者
-prune:忽略一个目录及其之下的文件
-type:类型【f 表示文件,d 表示目录】
-print:显示文件名
xargs:把 find 找出的文件一个一个处理

结果:查找并删除编译后产生的中间文件或目标文件,不回显。
2142行:删除boards.cfg CHANGELOG,不回显。

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

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

相关文章

恶意退市潮?

一张A4纸,炸出一池鱼。史上(最)严新规,这一拳打到了(违规减持)上。 新规算是对新国九条的补充,更是给大股东们上紧箍咒。那市场买账吗?昨晚爆出19家董监高亲属(违规&…

post请求

文章目录 一、get请求和post请求区别二、get请求和post请求的用法对比1.get请求2.post请求 三、如何知道是get请求还是post请求 一、get请求和post请求区别 二者区别就是一句话:post请求更安全 二、get请求和post请求的用法对比 1.get请求 get请求: 请求参数&am…

RK3568笔记二十七:LPRNet车牌识别

若该文为原创文章,转载请注明原文出处。 记录自训练并在RK3568上部署。 一、介绍 LPRNet的Pytorch实现,一种高性能和轻量级的车牌识别框架。完全适用于中国车牌识别(Chinese License Plate Recognition)及国外车牌识别&#xf…

Vue2和Vue3生命周期的对比

Vue2和Vue3生命周期的对比 Vue2 和 Vue3 生命周期对照表Vue2 和 Vue3 生命周期图示 Vue2 和 Vue3 生命周期对照表 触发时机Vue2.xVue3.x组件创建时运行beforeCreate setup createdsetup 挂载在DOM时运行beforeMountonBeforeMountmountedonMounted响应数据修改时运行beforeUpdat…

张大哥笔记:赚钱高手养成计划---如何将一份时间产生N份收入?

我们常说的赚钱的四种境界有哪些? 1.靠体力挣钱 2.靠技能挣钱 3.靠知识挣钱 4.靠平台钱生钱 所以对应的收入的模式就会是下面4种模式: 1.一份时间卖1次 2.一份时间卖N次 3.一份时间溢价卖N次 4.购买他人时间为自己所用 时间对于每个人都是相同的…

如何被谷歌收录?

最简单的方法就是提交网站给谷歌,但这种方法可操作空间不大,一天一般也就只有十条左右的链接可以提交,对于一些大网站来说,这种方法显然不适用,这时候GPC爬虫池的好处就体现了,GPC爬虫池对希望提升Google搜…

小而美的前端库推荐

小而美,指的是“小即是美”的事物,这是马云在 2009年 APEC 中小企业峰会上首次提出的观点 👍 前端有很多小而美的库,接入成本很低又能满足日常开发需求 🎉

D - New Friends(AtCoder Beginner Contest 350)

题目链接: D - New Friends (atcoder.jp) 题目大意: 题目解析: 题目的大致意思: 假如A和B是朋友 B和C也是朋友 那么当A和C不是朋友的时候 可以通过B让A和C也成为朋友 问你增加了多少对的朋友关系 题目分析: 咱们可以从图论去考虑 当这一群是一个连通块 那么这一群点(人) 都…

SQL 语言:完整性约束

文章目录 概述主键 ( Primary Key ) 约束外键(Foreign Key)约束属性值上的约束全局约束总结 概述 数据库的完整性是指数据库正确性和相容性,是防止合法用户使用数据库时向数据库加入不符合语义的数据。保证数据库中数据是正确的,…

多线程JUC 第2季 BlockingQueue 阻塞队列

一 阻塞队列 1.1 阻塞队列介绍 阻塞队列(BlockingQueue)是一个在队列基础上又支持了两个附加操作的队列: put方法:当队列装满时,添加的线程则被阻塞,直到队列不满,则可用。 take方法&#x…

【vue与iframe通讯】

vue 与 iframe 通讯 发送数据vue 向 iframe 发送数据iframe 向 vue 发送数据接收信息( vue & iframe 通用) 实现相互通讯通讯流程图实现代码vue 页面iframe页面iframe 内部重定向访问地址,更新 vue 路由 访问跨域代码下载 前言:vue嵌套iframe实现步骤 发送数据…

HTML+CSS+JavaScript网页制作案例教程第2版-黑马程序员-第9章动手实践

文章目录 效果代码网盘 效果 代码 index.html <!doctype html> <html> <head> <meta charset"utf-8"> <title>通栏效果</title> <link rel"stylesheet" type"text/css" href"index.css"> …

【STM32踩坑】HAL固件库版本过高导致烧录后无法运行问题

问题引入 目前STM32CUBEMX已经更新到了6.11版本&#xff0c;对应的固件库也一直在更新&#xff1b; 以STM32F1库为例&#xff0c;目前最新的库对应版本为1.8.5 但是我们会发现&#xff0c;如果直接使用1.8.5版本的固件库生成HAL源码后&#xff0c;烧录是可以烧录&#xff0c;但…

程序无法监听端口,但netstat -aon | findstr却显示该端口未被占用

程序无法监听端口&#xff0c;但netstat -aon | findstr却显示该端口未被占用 ⚙️1.软件环境⚙️&#x1f50d;2.问题描述&#x1f50d;&#x1f421;3.解决方法&#x1f421;&#x1f914;4.结果预览&#x1f914; ⚙️1.软件环境⚙️ Windows10 教育版64位 &#x1f50d;2.问…

P1115 最长子段和

题目描述 给出一个长度为 &#x1d45b;n 的序列 &#x1d44e;a&#xff0c;选出其中连续且非空的一段使得这段和最大。 输入格式 第一行是一个整数&#xff0c;表示序列的长度 &#x1d45b;。 第二行有 &#x1d45b;n 个整数&#xff0c;第 &#x1d456; 个整数表示序列的…

知识存储概述

文章目录 知识存储概述知识存储方式知识存储基础工具技术发展趋势 知识存储是针对知识图谱的知识表示形式设计底层存储方式&#xff0c;完成各类知识的存储&#xff0c;以支持对大规模图数据的有效管理和计算。知识存储的对象包括基本属性知识、关联知识、事件知识、时序知识和…

Overall Accuracy(OA)、Average Accuracy(AAcc)计算公式

四个重要的指标&#xff1a; True Positive&#xff08;TP&#xff09;、False Positive&#xff08;FP&#xff09;、True Negative&#xff08;TN&#xff09;和False Negative&#xff08;FN&#xff09;。 TP表示分类器预测结果为正样本&#xff0c;实际也为正样本&#xf…

以一道简单的例题计算灵敏性分析

在例1.1中&#xff0c;全部的变量包括&#xff1a;猪的重量w(磅),从现在到出售猪期间经历的时间t(天),t天内饲养猪的花费C(美元),猪的市场价格p(美元/磅),售出生猪所获得的收益R(美元),我们最终获得的净收益P(美元).这里还有一些其他的有关量&#xff0c;如猪的初始重量(200磅)…

看看我一天鼠标点击多少次,键盘点击多少次

1、说明 前一段时间看到新闻,公司监控员工的一天中使用键盘数据次数,员工键盘和鼠标点击次数太少而被辞退。真是让人气愤,真是万恶的资本家呀。 我赶紧看看我一天工作下来我点击了多少次键盘和鼠标,可是我怎么知道呢,咱是干啥的呀,干脆写个小软件统计一下我一天点了多少…

3d火灾救援模拟仿真培训软件复用性强

消防VR安全逃生体验系统是深圳VR公司华锐视点引入了前沿的VR虚拟现实、web3d开发和多媒体交互技术&#xff0c;为用户打造了一个逼真的火灾现场应急逃生模拟演练环境。 相比传统的消防逃生模拟演练&#xff0c;消防VR安全逃生体验系统包含知识讲解和模拟实训演练&#xff0c;体…