openwrt的編譯系統是如何製作根檔案系統的
阿新 • • 發佈:2019-01-03
答:分析以下makefile即可獲取整個過程
以nxp layerscape系統的編譯過程為例
1.分析target/linux/layerscape/image/Makefile的最後一句,這是一個好的開端
$(eval $(call BuildImage))
2.巨集BuildImage定義在哪裡呢?定義在include/image.mk中,簡化後如下
define BuildImage ... $(foreach device,$(TARGET_DEVICES),$(call Device,$(device)) install-images: kernel_prepare $(foreachfs,$(filter-out $(if $(UBIFS_OPTS),,ubifs),$(TARGET_FILESYSTEMS) $(fs-subtypes-y)),$(KDIR)/root.$(fs)) $(foreach fs,$(TARGET_FILESYSTEMS), $(call Image/Build,$(fs)) ) ... endef
3.在巨集定義BuildImage中會由上到下根據依賴依次執行,我們首先關注
$(foreach device,$(TARGET_DEVICES),$(call Device,$(device))
4.巨集Device又定義在哪裡呢?同樣定義在include/image.mk檔案中,定義簡化後如下
define Device ... $(call Device/$(if $(DUMP),Dump,Build),$(1)) endef
5.此時會執行巨集Device/Dump或巨集Device/Build,那麼以執行巨集Device/Build為例,巨集Device/Build簡化後如下
define Device/Build ... $$(eval $$(foreach compile,$$(COMPILE), \ $$(call Device/Build/compile,$$(compile),$(1)))) $$(eval $$(foreach image,$$(IMAGES), \ $$(foreach fs,$$(filter $(TARGET_FILESYSTEMS),$$(FILESYSTEMS)), \ $$(call Device/Build/image,$$(fs),$$(image),$(1))))) endef
6.接著執行巨集Device/Build/compile和Device/Build/image,這兩個巨集都定義在include/image.mk中,在Device/Build/image會做根檔案系統製作方面的工作