make clean, make mrproer 和 make distclean的區別
阿新 • • 發佈:2019-01-28
在編譯核心時,被make clean, make mrproer 和 make distclean搞的糾結, 稍微總結一下這三者之間的區別:
解壓核心原始碼包後, 到核心原始碼目錄樹的頂層目錄, 執行
# make help
Cleaning targets:
clean - Remove most generated files but keep the config and
enough build support to build external modules
mrproper - Remove all generated files + config + various backup files
distclean - mrproper + remove editor backup and patch files 看幫助可以發現刪除的檔案範圍從小到大依次為: make clean < make mrproper < make distclean , 檢視原始碼目錄樹的頂層目錄下的Makefile求證, 可以發現:
clean: archclean $(clean-dirs)
$(call cmd,rmdirs)
$(call cmd,rmfiles)
@find . $(RCS_FIND_IGNORE) \
\( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \
-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
-o -name '*.symtypes' -o -name 'modules.order' \
-o -name 'Module.markers' \) \
-type f -print | xargs rm -f mrproper: clean archmrproper $(mrproper-dirs)
$(call cmd,rmdirs)
$(call cmd,rmfiles) distclean: mrproper
@find $(srctree) $(RCS_FIND_IGNORE) \
\( -name '*.orig' -o -name '*.rej' -o -name '*~' \
-o -name '*.bak' -o -name '#*#' -o -name '.*.orig' \
-o -name '.*.rej' -o -size 0 \
-o -name '*%' -o -name '.*.cmd' -o -name 'core' \) \
-type f -print | xargs rm -f 也就是說, 執行make mrproper, 會先執行make clean, 執行make distclean之前, 會先執行make mrproper。
再回到make help的結果:
make clean 刪除大多數的編譯生成檔案, 但是會保留核心的配置檔案.config, 還有足夠的編譯支援來建立擴充套件模組
make mrproper 刪除所有的編譯生成檔案, 還有核心配置檔案, 再加上各種備份檔案
make distclean mrproper刪除的檔案, 加上編輯備份檔案和一些補丁檔案。 其實, 對於一個剛剛從kernel.org上下載的核心原始碼包, 可以不用執行make clean/make mrproper/make distclean, 因為原始碼包的狀態本身就是clean的。 另外, 就算編譯過核心之後, 需不需要clean一下, 個人覺得應該具體問題具體對待, 且看linuxsir上也有兄弟對這個問題有疑問: Q: 很多核心編譯的教程都說在make之前要先make mrproper,清除以前編譯的產物。但編譯器/連結器本身就會檢查檔案的日期,並確定是否需要重新編譯/連結。如果清除了,很多以前已經編譯過的程式碼又得重新編譯。如果說這樣能節省硬碟空間的話,那只有那些先前編譯過而現在不再需要的模組的空間被節省了,而代價則是編譯時間延長了。個人覺得得不償失,至少不需要每次編譯都來一次make mrproper。 A: 我沒有make mrproper,每次修改核心配置後很快就能編譯完成,很方便,也沒發現什麼問題
如果make不能確定那些檔案要重新編譯,那還要make做什麼
個人觀點,盡信書則不如無書,實踐出真知,呵呵 A: 不執行make mrproper是否出錯,取決於Makefile的智慧化程度。如果Makefile沒能完成你所要求的全部改動,很可能編譯出來的核心不如你所願,甚至可能導致panic。建議重新編譯的時候注意看看改動是否都落實了。
# make help
Cleaning targets:
clean - Remove most generated files but keep the config and
enough build support to build external modules
mrproper - Remove all generated files + config + various backup files
distclean - mrproper + remove editor backup and patch files 看幫助可以發現刪除的檔案範圍從小到大依次為: make clean < make mrproper < make distclean
clean: archclean $(clean-dirs)
$(call cmd,rmdirs)
$(call cmd,rmfiles)
@find . $(RCS_FIND_IGNORE) \
\( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \
-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
-o -name '*.symtypes' -o -name 'modules.order' \
-o -name 'Module.markers' \) \
-type f -print | xargs rm -f mrproper: clean
$(call cmd,rmdirs)
$(call cmd,rmfiles) distclean: mrproper
@find $(srctree) $(RCS_FIND_IGNORE) \
\( -name '*.orig' -o -name '*.rej' -o -name '*~' \
-o -name '*.bak' -o -name '#*#' -o -name '.*.orig' \
-o -name '.*.rej' -o -size 0 \
-o -name '*%' -o -name '.*.cmd' -o -name 'core' \) \
-type f -print | xargs rm -f 也就是說,
再回到make help的結果:
make clean 刪除大多數的編譯生成檔案, 但是會保留核心的配置檔案.config, 還有足夠的編譯支援來建立擴充套件模組
make mrproper 刪除所有的編譯生成檔案, 還有核心配置檔案, 再加上各種備份檔案
make distclean mrproper刪除的檔案, 加上編輯備份檔案和一些補丁檔案。 其實, 對於一個剛剛從kernel.org上下載的核心原始碼包, 可以不用執行make clean/make mrproper/make distclean, 因為原始碼包的狀態本身就是clean的。 另外, 就算編譯過核心之後, 需不需要clean一下, 個人覺得應該具體問題具體對待, 且看linuxsir上也有兄弟對這個問題有疑問: Q: 很多核心編譯的教程都說在make之前要先make mrproper,清除以前編譯的產物。但編譯器/連結器本身就會檢查檔案的日期,並確定是否需要重新編譯/連結。如果清除了,很多以前已經編譯過的程式碼又得重新編譯。如果說這樣能節省硬碟空間的話,那只有那些先前編譯過而現在不再需要的模組的空間被節省了,而代價則是編譯時間延長了。個人覺得得不償失,至少不需要每次編譯都來一次make mrproper。 A: 我沒有make mrproper,每次修改核心配置後很快就能編譯完成,很方便,也沒發現什麼問題
如果make不能確定那些檔案要重新編譯,那還要make做什麼
個人觀點,盡信書則不如無書,實踐出真知,呵呵 A: 不執行make mrproper是否出錯,取決於Makefile的智慧化程度。如果Makefile沒能完成你所要求的全部改動,很可能編譯出來的核心不如你所願,甚至可能導致panic。建議重新編譯的時候注意看看改動是否都落實了。