內核編譯時, 到底用make clean, make mrproper還是make distclean

內核編譯時, 到底用make clean, make mrproper還是make distclean

PS:在編譯內核時,  被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

ps:除去生成的文件,保留配置足夠的建設支持建立外部模塊

  mrproper        - Remove all generated files + config + various backup files

ps:刪除所有生成的文件,和各種配置的備份文件
  distclean       - mrproper + remove editor backup and patch files

ps:刪除編輯備份和補丁文件
看幫助可以發現刪除的文件範圍從小到大依次爲: 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。建議重新編譯的時候注意看看改動是否都落實了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章