Openwrt中的make clean和make dirclean

网上说的

度娘第一篇,openwrt下make clean、dirclean、distclean的区别,描述到:

  • make clean 清除了bin目录
  • make dirclean 是clean+清除交叉编译链工具以及工具链目录
  • make distclean 是清除所有相关的东西,包括下载的软件包、配置文件、feed内容等。

我的理解

最准确的解释就是直接找到Makefile中相关内容:

clean: FORCE
        rm -rf $(BUILD_DIR) $(BIN_DIR) $(BUILD_LOG_DIR)

dirclean: clean
        rm -rf $(STAGING_DIR) $(STAGING_DIR_HOST) $(STAGING_DIR_TOOLCHAIN) $(TOOLCHAIN_DIR) $(BUILD_DIR_HOST) $(BUILD_DIR_TOOLCHAIN)
        rm -rf $(TMP_DIR)

增加一点测试代码:

test:
        @echo "BUILD_DIR:" $(BUILD_DIR)
        @echo "BIN_DIR:" $(BIN_DIR)
        @echo "BUILD_LOG_DIR:" $(BUILD_LOG_DIR)

clean: FORCE
        rm -rf $(BUILD_DIR) $(BIN_DIR) $(BUILD_LOG_DIR)

dirclean: clean
        rm -rf $(STAGING_DIR) $(STAGING_DIR_HOST) $(STAGING_DIR_TOOLCHAIN) $(TOOLCHAIN_DIR) $(BUILD_DIR_HOST) $(BUILD_DIR_TOOLCHAIN)
        rm -rf $(TMP_DIR)

dirtest:
        @echo "STAGING_DIR:" $(STAGING_DIR)
        @echo "STAGING_DIR_HOST:" $(STAGING_DIR_HOST)
        @echo "STAGING_DIR_TOOLCHAIN:" $(STAGING_DIR_TOOLCHAIN)
        @echo "TOOLCHAIN_DIR:" $(TOOLCHAIN_DIR)
        @echo "BUILD_DIR_HOST:" $(BUILD_DIR_HOST)
        @echo "BUILD_DIR_TOOLCHAIN:" $(BUILD_DIR_TOOLCHAIN)
        @echo "TMP_DIR:" $(TMP_DIR)

测试情况如下:

root@APPUbuntu:openwrt-trunk# make V=s test
make[1]: Entering directory `/home/code/openwrt-trunk'
BUILD_DIR: /home/code/openwrt-trunk/build_dir/target-mips_34kc_uClibc-0.9.33.2
BIN_DIR: /home/code/openwrt-trunk/bin/ar71xx
BUILD_LOG_DIR: /home/code/openwrt-trunk/logs
make[1]: Leaving directory `/home/code/openwrt-trunk'
root@APPUbuntu:openwrt-trunk# 
root@APPUbuntu:openwrt-trunk# 
root@APPUbuntu:openwrt-trunk# make V=s dirtest
make[1]: Entering directory `/home/code/openwrt-trunk'
STAGING_DIR: /home/code/openwrt-trunk/staging_dir/target-mips_34kc_uClibc-0.9.33.2
STAGING_DIR_HOST: /home/code/openwrt-trunk/staging_dir/host
STAGING_DIR_TOOLCHAIN:
TOOLCHAIN_DIR: /home/code/openwrt-trunk/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2
BUILD_DIR_HOST: /home/code/openwrt-trunk/build_dir/host
BUILD_DIR_TOOLCHAIN: /home/code/openwrt-trunk/build_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2
TMP_DIR: /home/code/openwrt-trunk/tmp
make[1]: Leaving directory `/home/code/openwrt-trunk'
root@APPUbuntu:openwrt-trunk#

可以看到:

+make clean: 清除了如下几个目录:
- /home/code/openwrt-trunk/build_dir/target-mips_34kc_uClibc-0.9.33.2
- /home/code/openwrt-trunk/bin/ar71xx
- /home/code/openwrt-trunk/logs
+make dirclean:除了clean清除的内容外,还清除了如下几个目录:
- /home/code/openwrt-trunk/staging_dir/target-mips_34kc_uClibc-0.9.33.2
- /home/code/openwrt-trunk/staging_dir/host
- /home/code/openwrt-trunk/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2
- /home/code/openwrt-trunk/build_dir/host
- /home/code/openwrt-trunk/build_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2
- /home/code/openwrt-trunk/tmp

所以我理解:

  • make clean 清除了目标机器上可以运行的bin文件以及目录,还有中间的过程文件和编译日志,即make clean之后make,目标机上的内容会全部被重新编译,但是不会引起menuconfig的内容丢失。
  • make dirclean 在clean的基础上,清除了交叉编译工具链、menuconfig的内容。
  • make distclean 是清除所有相关的东西,包括编译的和下载的内容等,这个要慎之又慎。

从倒序的角度来看,也可以说明openwrt的编译过程:

  1. 下载
  2. 配置、交叉编译环境的搭建
  3. 编译