⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 196570.html

📁 Makefile解读,简单介绍框架 知识
💻 HTML
📖 第 1 页 / 共 4 页
字号:
<br>==========================================
<br>Linux各级内核源代码的子目录下都有Makefile,大多数Makefile要嵌入主目录下的Rule.make,Rule.make将识
别各个Makefile中所定义的一些变量。变量obj-y表示需要编绎到内核中的目标文件名集合,定义O_TARGET表示将obj-y连接为一个
O_TARGET名称的目标文件,定义L_TARGET表示将obj-y合并为一个L_TARGET名称的库文件。同样obj-m表示需要编绎成模块的目
标文件名集合。如果还需进行子目录make,则需要定义subdir-y和subdir-m。在Makefile中,用"obj-$
(CONFIG_BINFMT_ELF)&nbsp;+=&nbsp;binfmt_elf.o"和"subdir-$(CONFIG_EXT2_FS)
&nbsp;+=&nbsp;ext2"这种形式自动为obj-y、obj-m、subdir-y、subdir-m添加文件名。有时,情况没有这么单
纯,还需要使用条件语句个别对待。Makefile中还有其它一些变量,如mod-subdirs定义了subdir-m以外的所有模块子目录。
<br>
<br>Rules.make是如何使make进入子目录的呢?&nbsp;先来看subdir-y是如何处理的,在Rules.make中,先对
subdir-y中的每一个文件名加上前缀"_subdir_"再进行排序生成subdir-list集合,再以它作为目标集,对其中每一个目标产生一个
子make,同时将目标名的前缀去掉得到子目录名,作为子make的起始目录参数。subdir-m与subdir-y类似,但情况稍微复杂一些。由于
subdir-y中可能有模块定义,因此利用mod-subdirs变量将subdir-y中模块目录提取出来,再与subdir-m合成一个大的
MOD_SUB_DIRS集合。subdir-m的目标所用的前缀是"_modsubdir_"。
<br>
<br>一点说明,子目录中的Makefile与Rules.make都没有嵌入.config文件,它是通过主Makefile向下传递
MAKEFILES变量完成的。MAKEFILES是make自已识别的一个变量,在执行新的Makefile之前,make会首先加载
MAKEFILES所指的文件。在主Makefile中它即指向.config。
<br>
<br>
<br>==========================================
<br>Makefile解读之三:&nbsp;模块的版本化处理
<br>==========================================
<br>模块的版本化是内核与模块接口之间进行严格类型匹配的一种方法。当内核配置了CONFIG_MODVERSIONS之后,make&nbsp;
dep操作会在include/linux/modules/目录下为各级Makefile中export-objs变量所对应的源文件生成扩展名为.
ver的文件。
<br>
<br>例如对于kernel/ksyms.c,make用以下命令生成对应的ksyms.ver:
<br>
<br>gcc&nbsp;-E&nbsp;-D__KERNEL__&nbsp;-D__GENKSYMS__&nbsp;ksyms.c&nbsp;|&nbsp;/sbin/genksyms&nbsp;-k&nbsp;2.4.1&nbsp;&gt;&nbsp;ksyms.ver
<br>
<br>-D__GENKSYMS__的作用是使ksyms.c中的EXPORT_SYMBOL宏不进行扩展。genksyms命令识别EXPORT_SYMBOL()中的函数名和对应的原型,再根据其原型计算出该函数的版本号。
<br>
<br>例如ksyms.c中有一行:
<br>EXPORT_SYMBOL(kmalloc);
<br>kmalloc原型是:
<br>void&nbsp;*kmalloc(size_t,&nbsp;int);
<br>genksyms程序对应的输出为:
<br>#define&nbsp;__ver_kmalloc&nbsp;93d4cfe6
<br>#define&nbsp;kmalloc&nbsp;_set_ver(kmalloc)
<br>在内核符号表和模块中,kmalloc将变成kmalloc_R93d4cfe6。
<br>
<br>在生成完所有的.ver文件后,make将重建include/linux/modversions.h文件,它包含一系列#include指令
行嵌入各个.ver文件。在编绎内核本身export-objs中的文件时,make会增加一个"-DEXPORT_SYMTAB"编绎标志,它使源文件
嵌入modversions.h文件,将EXPORT_SYMBOL宏展开中的函数名字符串进行版本名扩展;同时,它也定义_set_ver()宏为一空
操作,使代码中的函数名不受其影响。
<br>在编绎模块时,make会增加"-include=linux/modversion.h&nbsp;-DMODVERSIONS"编绎标志,使模块中代码的函数名得到相应版本扩展。
<br>
<br>由于生成.ver文件比较费时,make还为每个.ver创建了一个后缀为.stamp时戳文件。在make&nbsp;dep时,如果其.
stamp文件比源文件旧才重新生成.ver文件,否则只是更新.stamp文件时戳。另外,在生成.ver和modversions.h文件时,
make都会比较新文件和旧文件的内容,保持它们修改时间为最旧。
<br>
<br>
<br>
<br>==========================================
<br>Makefile解读之四:&nbsp;Rules.make的注释
<br>==========================================
<br>[code:1:974578564b]
<br>#
<br>#&nbsp;This&nbsp;file&nbsp;contains&nbsp;rules&nbsp;which&nbsp;are&nbsp;shared&nbsp;between&nbsp;multiple&nbsp;Makefiles.
<br>#
<br>
<br>#
<br>#&nbsp;False&nbsp;targets.
<br>#
<br>#&nbsp;
<br>.PHONY:&nbsp;dummy&nbsp;
<br>
<br>#
<br>#&nbsp;Special&nbsp;variables&nbsp;which&nbsp;should&nbsp;not&nbsp;be&nbsp;exported
<br>#
<br>#&nbsp;取消这些变量通过环境向make子进程传递。
<br>unexport&nbsp;EXTRA_AFLAGS	#&nbsp;as&nbsp;的开关
<br>unexport&nbsp;EXTRA_CFLAGS	#&nbsp;cc&nbsp;的开关
<br>unexport&nbsp;EXTRA_LDFLAGS&nbsp;	#&nbsp;ld&nbsp;的开关
<br>unexport&nbsp;EXTRA_ARFLAGS	#&nbsp;ar&nbsp;的开关
<br>unexport&nbsp;SUBDIRS	#&nbsp;
<br>unexport&nbsp;SUB_DIRS	#&nbsp;编绎内核需进入的子目录,等于subdir-y
<br>unexport&nbsp;ALL_SUB_DIRS	#&nbsp;所有的子目录
<br>unexport&nbsp;MOD_SUB_DIRS	#&nbsp;编绎模块需进入的子目录
<br>unexport&nbsp;O_TARGET	#&nbsp;ld合并的输出对象
<br>unexport&nbsp;ALL_MOBJS	#&nbsp;所有的模块名
<br>
<br>unexport&nbsp;obj-y		#&nbsp;编绎成内核的文件集
<br>unexport&nbsp;obj-m		#&nbsp;编绎成模块的文件集
<br>unexport&nbsp;obj-n		#&nbsp;
<br>unexport&nbsp;obj-		#&nbsp;
<br>unexport&nbsp;export-objs	#&nbsp;需进行版本处理的文件集
<br>unexport&nbsp;subdir-y	#&nbsp;编绎内核所需进入的子目录
<br>unexport&nbsp;subdir-m	#&nbsp;编绎模块所需进入的子目录
<br>unexport&nbsp;subdir-n
<br>unexport&nbsp;subdir-
<br>
<br>#
<br>#&nbsp;Get&nbsp;things&nbsp;started.
<br>#
<br>first_rule:&nbsp;sub_dirs
<br>	$(MAKE)&nbsp;all_targets
<br>
<br>#&nbsp;在内核编绎子目录中过滤出可以作为模块的子目录。
<br>both-m&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:=&nbsp;$(filter&nbsp;$(mod-subdirs),&nbsp;$(subdir-y))&nbsp;
<br>SUB_DIRS	:=&nbsp;$(subdir-y)
<br>#&nbsp;求出总模块子目录
<br>MOD_SUB_DIRS	:=&nbsp;$(sort&nbsp;$(subdir-m)&nbsp;$(both-m))
<br>#&nbsp;求出总子目录
<br>ALL_SUB_DIRS	:=&nbsp;$(sort&nbsp;$(subdir-y)&nbsp;$(subdir-m)&nbsp;$(subdir-n)&nbsp;$(subdir-))
<br>
<br>
<br>#
<br>#&nbsp;Common&nbsp;rules
<br>#
<br>#&nbsp;将c文件编绎成汇编文件的规则,$@为目标对象。
<br>%.s:&nbsp;%.c
<br>	$(CC)&nbsp;$(CFLAGS)&nbsp;$(EXTRA_CFLAGS)&nbsp;$(CFLAGS_$@)&nbsp;-S&nbsp;$&lt;&nbsp;-o&nbsp;$@
<br>#&nbsp;将c文件生成预处理文件的规则。
<br>%.i:&nbsp;%.c
<br>	$(CPP)&nbsp;$(CFLAGS)&nbsp;$(EXTRA_CFLAGS)&nbsp;$(CFLAGS_$@)&nbsp;$&lt;&nbsp;&gt;&nbsp;$@
<br>#&nbsp;将c文件编绎成目标文件的规则,$&lt;为第一个所依赖的对象;
<br>#
<br>在目标文件的目录下生成flags文件,strip删除多余的空格,subst将逗号替换成冒号
<br>。
<br>%.o:&nbsp;%.c
<br>	$(CC)&nbsp;$(CFLAGS)&nbsp;$(EXTRA_CFLAGS)&nbsp;$(CFLAGS_$@)&nbsp;-c&nbsp;-o&nbsp;$@&nbsp;$&lt;
<br>	@&nbsp;(&nbsp;\
<br>	&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;'ifeq&nbsp;($(strip&nbsp;$(subst&nbsp;$(comma),:,$(CFLAGS)&nbsp;$(EXTRA_CFLAGS)
<br>$(CFLAGS_$@))),$$(strip&nbsp;$$(subst&nbsp;$$(comma),:,$$(CFLAGS)&nbsp;$$(EXTRA_CFLAGS)
<br>$$(CFLAGS_$@))))'&nbsp;;&nbsp;\
<br>	&nbsp;&nbsp;&nbsp;&nbsp;echo&amp;nbs'''FILES_FLAGS_UP_TO_DATE&nbsp;+=&nbsp;'''&nbsp;;&nbsp;\
<br>	&nbsp;&nbsp;&nbsp;&nbsp;echo&amp;nb;'''enf'''&nbsp;\
<br>	)&nbsp;&gt;&nbsp;$(dir&nbsp;$@)/.$(notdir&nbsp;$@).flags
<br>#&nbsp;汇编文件生成目标文件的规则。
<br>%.o:&nbsp;%.s
<br>	$(AS)&nbsp;$(AFLAGS)&nbsp;$(EXTRA_CFLAGS)&nbsp;-o&nbsp;$@&nbsp;$&lt;
<br>
<br>#&nbsp;Old&nbsp;makefiles&nbsp;define&nbsp;their&nbsp;own&nbsp;rules&nbsp;for&nbsp;compiling&nbsp;.S&nbsp;files,
<br>#&nbsp;but&nbsp;these&nbsp;standard&nbsp;rules&nbsp;are&nbsp;available&nbsp;for&nbsp;any&nbsp;Makefile&nbsp;that
<br>#&nbsp;wants&nbsp;to&nbsp;use&nbsp;them.&nbsp;&nbsp;Our&nbsp;plan&nbsp;is&nbsp;to&nbsp;incrementally&nbsp;convert&nbsp;all
<br>#&nbsp;the&nbsp;Makefiles&nbsp;to&nbsp;these&nbsp;standard&nbsp;rules.&nbsp;&nbsp;--&nbsp;rmk,&nbsp;mec
<br>
<br>ifdef&nbsp;USE_STANDARD_AS_RULE
<br>#&nbsp;汇编文件生成预处理文件的标准规则。
<br>%.s:&nbsp;%.S
<br>	$(CPP)&nbsp;$(AFLAGS)&nbsp;$(EXTRA_AFLAGS)&nbsp;$(AFLAGS_$@)&nbsp;$&lt;&nbsp;&gt;&nbsp;$@
<br>#&nbsp;汇编文件生成目标文件的标准规则。
<br>%.o:&nbsp;%.S
<br>	$(CC)&nbsp;$(AFLAGS)&nbsp;$(EXTRA_AFLAGS)&nbsp;$(AFLAGS_$@)&nbsp;-c&nbsp;-o&nbsp;$@&nbsp;$&lt;
<br>
<br>endif
<br>#&nbsp;c文件生成调试列表文件的规则,$*扩展为目标的主文件名。
<br>%.lst:&nbsp;%.c
<br>	$(CC)&nbsp;$(CFLAGS)&nbsp;$(EXTRA_CFLAGS)&nbsp;$(CFLAGS_$@)&nbsp;-g&nbsp;-c&nbsp;-o&nbsp;$*.o&nbsp;$&lt;
<br>	$(TOPDIR)/scripts/makelst&nbsp;$*&nbsp;$(TOPDIR)&nbsp;$(OBJDUMP)
<br>#
<br>#
<br>#&nbsp;
<br>all_targets:&nbsp;$(O_TARGET)&nbsp;$(L_TARGET)
<br>
<br>#
<br>#&nbsp;Rule&nbsp;to&nbsp;compile&nbsp;a&nbsp;set&nbsp;of&nbsp;.o&nbsp;files&nbsp;into&nbsp;one&nbsp;.o&nbsp;file
<br>#
<br>ifdef&nbsp;O_TARGET
<br>$(O_TARGET):&nbsp;$(obj-y)
<br>	rm&nbsp;-f&nbsp;$@
<br>#&nbsp;$^扩展为全部依赖对象,如果obj-y为空就生成一个同名空的库文件。
<br>&nbsp;&nbsp;&nbsp;&nbsp;ifneq&nbsp;"$(strip&nbsp;$(obj-y))"&nbsp;""

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -