Linux Kernel Makefile Test
生活随笔
收集整理的這篇文章主要介紹了
Linux Kernel Makefile Test
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、本文說明
本文為linux內核Makefile整體分析的續篇,是依據Linux內核Makefile體系的主要內容編寫一個簡要的測試工程。Linux內核Makefile體系就好像一只“大鳥”,而這篇測試算是“麻雀”,主要是為了通過動手實戰進一步理解Linux內核Makefile體系的原理和特點。
二、源碼結構
1、測試源碼包括1個頂層目錄以及5個子目錄。
2、Makefile體系的構成是頂層1個Makefile文件、scripts目錄中的4個腳本文件以及add、sub、main三個目錄中的Makefile文件。
3、C程序源碼是add/add.c、sub/sub.c、main/main.c
三、Makefile重要源碼展示
1、頂層Makefile
PHONY := MAKE := makesrctree := $(if $(KBUILD_SRC),$(KBUILD_SRC),$(CURDIR)) export srctree AS = $(CROSS_COMPILE)as LD = $(CROSS_COMPILE)ld CC = $(CROSS_COMPILE)gcc CPP = $(CC) -E AR = $(CROSS_COMPILE)ar NM = $(CROSS_COMPILE)nmexport AS LD CC CPP AR NM include $(srctree)/scripts/Kbuild.include //該文件中定義有build變量 all: targetsrcdir := add sub main PHONY += $(srcdir)objdir := $(srcdir) PHONY += $(objdir)target: $(srcdir) //總目標的依賴是srcdirgcc -o target add/built-in.o sub/built-in.o main/built-in.o //定義總目標的生成規則 $(srcdir): //通過srcdir依次生成各個子目錄中的*/built-in.o$(MAKE) $(build)=$@ clean-dirs := $(addprefix _clean_,$(objdir)) //clean-dirs其實與objdir中的目錄是一樣的,只是為了執行不同的命令(clean-dirs要刪除目標文件),所以要clean-dirs的前邊要加上前綴以與srcdir=objdir的目標區別 PHONY += $(clean-dirs) clean$(clean-dirs):$(MAKE) $(clean)=$(patsubst _clean_%,%,$@)clean: $(clean-dirs)rm -f targetclean := -f scripts/Makefile.clean obj.PHONY: $(PHONY)2、srcdirs/Makefile.build
# ========================================================================== # Building # ==========================================================================src := $(obj)PHONY := __build __build: //Makefile.build中的總目標 include scripts/Kbuild.include# The filename Kbuild has precedence over Makefile kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src)) kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile) include $(kbuild-file) //包含子目錄中的Makefile include scripts/Makefile.libifneq ($(strip $(obj-y)),) builtin-target := $(obj)/built-in.o endif__build: $(builtin-target)# If the list of objects to link is empty, just create an empty built-in.o cmd_link_o_target = $(if $(strip $(obj-y)),\$(LD) $(ld_flags) -r -o $@ $(filter $(obj-y), $^))$(builtin-target): $(obj-y)$(call if_changed,link_o_target) //調用生成庫built-in.o的函數 cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<define rule_cc_o_c$(cmd_cc_o_c) endef# Built-in and composite module parts $(obj)/%.o: $(src)/%.c $(call if_changed_rule,cc_o_c) //調用生成目標文件.o的函數 PHONY += FORCE FORCE:.PHONY: $(PHONY)3、srcdirs/Kbuild.include
build := -f scripts/Makefile.build objif_changed = $(cmd_$(1))//定義函數if_changed # Usage: $(call if_changed_rule,foo) # Will check if $(cmd_foo) or any of the prerequisites changed, # and if so will execute $(rule_foo). if_changed_rule = $(rule_$(1)) //定義函數if_changed_rule4、srcdirs/Makefile.lib
c_flags = //定義gcc編譯器選項ld_flags = $(LDFLAGS) $(ldflags-y) //定義ld連接器選項 obj-y := $(patsubst %/, %/built-in.o, $(obj-y)) //對obj-y中的目錄添加built-in.oobj-y := $(addprefix $(obj)/,$(obj-y))//再添加obj前綴
5、srcdirs/Makefile.clean
# ========================================================================== # Cleaning up # ==========================================================================src := $(obj)PHONY := __clean //此為Makefile.clean中的總目標 __clean:rm -f $(obj)/*.o //刪除目標文件.o
6、add/Makefile
obj-y += add.o?四、當前源碼缺陷
1、沒有完成依賴的自動生成
2、沒有完成生成目標的目錄與源碼不在同一目錄的功能
?
附:LinuxKernelMakefileTest.zip
轉載于:https://www.cnblogs.com/amanlikethis/p/3676857.html
總結
以上是生活随笔為你收集整理的Linux Kernel Makefile Test的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 搜集到的数学分析例题(不断更新)
- 下一篇: linux 其他常用命令