日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux Kernel Makefile Test

發布時間:2024/4/14 linux 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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_rule

4、srcdirs/Makefile.lib

c_flags = //定義gcc編譯器選項ld_flags = $(LDFLAGS) $(ldflags-y) //定義ld連接器選項 obj-y := $(patsubst %/, %/built-in.o, $(obj-y)) //對obj-y中的目錄添加built-in.o
obj
-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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。