Linux Makefile.txt 分析

2024-09-01 19:32
文章标签 分析 linux txt makefile

本文主要是介绍Linux Makefile.txt 分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

linux 2.6.x Makefile 


linux-2.6.x makefile
 
linux-2.6.20.6/Documentation/kbuild/makefiles.txt
 
一、             概述
 
linux的makefile有五个部分:
 
Makefile:顶层Makefile
.config:内核配置文件
arch/$(ARCH)/Makefile:体系结构相关的Makefile
scripts/Makefile.*:通用的规则等,用于所有的kbuild Makefiles
kbuild Makefiles:大约有500个这样的makefile
 
顶层Makefile读取在内核配置过程中生成的.config文件。负责构建两个主要的文件:vmlinux和各模块。它还包含了一个名为arch/$(ARCH)/Makefile的体系结构相关Makefile,这个Makefile给顶层Makefile提供了体系结构相关的信息。
 
每个子目录有一个kbuild Makefile,它执行上层传入的命令。kbuild Makefile使用.config文件中的信息构建各种文件列表,供kbuild构建任何built-in或modular目标时使用。
 
scripts/Makefile.*包含所有的定义和规则等,这些被用来和kbuild makeflie一起构建内核
 
二、             kbuild文件
 
kbuild Makefile中的语法。
 
kbuild文件首选的文件名是”Makefile”,也可以用”kbuild”。如果”Makefile”和”kbuild”同时存在,则使用”kbuild”文件。
 
1、   目标定义
 
目标定义是kbuild Makefile的主要部分。这些行定义了要被编译的文件、所有指定的编码选项及所有将要递归进入的子目录。
 
最简单的kbuild Makefile包括一行:
 
obj-y += foo.o
 
如果foo.o要被编译成模块,就用obj-m。因此,经常使用下面的模式:
 
obj-$(CONFIG_FOO) += foo.o
 
$(CONFIG_FOO)的值是y (for built-in)或者m(for module)。如果CONFIG_FOO既不是y也不是m,这个文件不会被编译或链接
 
2、   Built-in 对象目标 - obj-y
 
kbuild Makefile 在$(obj-y)列表中给vmlinux指定目标文件,这个列表依赖于内核配置。
 
kbuild 编译所有的$(obj-y)文件,然后调用”$(LD) –r”把这些文件合并成一个built-in.o文件,之后built-in.o被顶层Makefile链接成vmlinux。
 
$(obj-y)中文件的顺序很重要,在这个列表中,完全相同的文件可以同时存在:第一个被链接到built-in.o,以后的都被忽略了。
 
链接顺序也很重要,因为特定的函数(module_init() / __initcall)会在启动期间按照它们出现的顺序被调用。
 
3、   可加载模块目标 - obj-m
 
$(obj-m)指定被编译为可加载内核模块的文件。一个模块可以是一个或多个源文件编译生成。如果是一个源文件,kbuild makefile只是简单的把这个文件加入$(obj-m)。如果内核模块由多个源文件编译生成,内核要知道你想要编译哪些源文件,所以你必须设置变量$(-objs)来告诉内核。
 
eg.
     #derivers/isdn/i4l/Makefile
     obj-$(CONFIG_ISDN) += isdn.o
     isdn-objs := isdn_net_lib.o isdn_v110.o isdn_common.o
 
在这个例子中,模块名是isdn.o。Kbuild会编译$(isdn-objs)中列出的对像,并运行”$(LD) –r”生成isdn.o。
 
Kbuild通过后缀-objs和-y识别用于编译生成目标的对像。它允许Makefile使用CONFIG_符号的值来决定一个对像是否是某个目标的一部分。
 
eg.
                           #fs/ext2/Makefile
                            obj-$(CONFIG_EXT2_FS)               += ext2.o
                           ext2-y                                             := balloc.o bitmap.o
                            ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o
 
如果CONFIG_EXT2_FS_XATTR的值为’y’,则xattr.o就是ext2.o的一部分。
 
4、   库文件目标 - lib-y
 
所有列在lib-y中的对像都被组合到一个单独的库中。既列在obj-y中又列在lib-y中的对像不会被包含到库中。因为不管怎样,它们都是可访问的。为了保持一致,列在lib-m中的对像会被包含到lib.a。
 
             Example:
                           #arch/i386/lib/Makefile
                           lib-y       := checksum.o delay.o
 
此处基于checksum.o和delay.o创建了库lib.a.
 
5、   向下进入目录
 
一个Makefile仅负责在它自己的目录中编译文件。子目录中的文件由子目录中的Makefile负责编译。如果你告诉了编译系统这些子目录,它会自动在子目录中递归调用make。
 
ext2放在了一个单独的目录中,在fs/目录下的Makefile用正面的赋值告诉kbuild向下进入目录
 
eg:
                           #fs/Makefile
                           obj-$(CONFIG_EXT2_FS) += ext2/
 
如果CONFIG_EXT2_FS的值是’y’(built-in)或’m’(modular),对应的obj-变量就会被设置,kbuild向下进入ext2目录。
 
kbuild只是通过这个信息决定要访问哪个目录,子目录中的Makefile指定什么是modules、什么是built-in。
 
6、编译flags
 
       EXTRA_CFLAGS, EXTRA_AFLAGS, EXTRA_LDFLAGS, EXTRA_ARFLAGS
 
所有EXTRA_变量只用在它的定义所在的那个kbuild makefile,它们被用于kbuild makefile中所有命令的执行
 
$(EXTRA_CFLAGS)指定了用$(CC)编译c文件时的选项。
 
$(EXTRA_AFLAGS)是每个目录在编译汇编源文件时的选项。
 
$(EXTRA_LDFLAGS) 和 $(EXTRA_ARFLAGS)是用于$(LD)和$(AR)的选项。
 
             Example:
                           #arch/m68k/fpsp040/Makefile
                           EXTRA_LDFLAGS := -x
 
       CFLAGS_$@, AFLAGS_$@
 
CFLAGS_$@ 和AFLAGS_$@ 只在当前kbuild makefile的命令中使用。
 
$(CFLAGS_$@)为$(CC)指定了每个文件的选项。$@指定了使用它的文件。
 
             Example:
                           # drivers/scsi/Makefile
                           CFLAGS_aha152x.o =     -DAHA152X_STAT -DAUTOCONF
                           CFLAGS_gdth.o       = # -DDEBUG_GDTH=2 -D__SERIAL__ -D__COM2__ /
                                                                -DGDTH_STATISTICS
                           CFLAGS_seagate.o =     -DARBITRATE -DPARITY -DSEAGATE_USE_ASM
 
这三行为aha152.o、gdth.o和seagate.o指定了编译选项。
 
$(AFLAGS_$@)对于汇编源文件有类似的作用
 
             Example:
                           # arch/arm/kernel/Makefile
                           AFLAGS_head-armv.o := -DTEXTADDR=$(TEXTADDR) -traditional
                           AFLAGS_head-armo.o := -DTEXTADDR=$(TEXTADDR) –traditional
 
8、对依赖的追踪
 
Kbuild追踪取决于下面文件:
 
1)、所有必备的文件(*.c和*.h)
2)、用在所有必备文件中的CONFIG_选项
3)、用于编译目标的命令行
 
因此,如果改变了$(CC)的选项,所有受影响的文件都会被重新编译。
 
9、特殊规则
 
如果kbuild的基本组织没提供必要的支持,特殊规则就会被使用。典型的例子就是在编译过程中产生头文件。另一个例子就是体系结构相关的Makefile,为了准备启动映像,它需要特殊的规则。
 
Kbuild不在Makefile所在的目录中执行,所以所有的特殊规则应提供必备文件和目标文件的相对路径。定义特殊规则时要用到两个变量:
 
$(src)
$(src)是指向Makefile所在目录的相对路径。涉及到源目录树中的文件总会用到$(src)。
 
$(obj)
$(obj)是指向保存目标的目录的相对路径。涉及到生成文件时总会用到$(obj)。
 
             Example:
                           #drivers/scsi/Makefile
                           $(obj)/53c8xx_d.h: $(src)/53c7,8xx.scr $(src)/script_asm.pl
                                         $(CPP) -DCHIP=810 - < $< | ... $(src)/script_asm.pl
 
10、$(CC)支持函数
 
内核可能用好几个不同版本的$(CC)进行编译,每个版本都支持一组唯一的特征和选项。kbuild提供了基本的支持用于检测有效的$(CC)选项。$(CC实际上就是gcc编译器。
 
as-option
as-option用于检测$(CC)是否支持给定式的选项(在编译汇编文件*.S时)。如果不支持第一个选项,将会指定一个可供选择的第二选项。
 
             Example:
                           #arch/sh/Makefile
                           cflags-y += $(call as-option,-Wa$(comma)-isa=$(isa-y),)
 
在上例中,如果$(CC)支持-Wa$(comma)-isa=$(isa-y),cflags-y就等于-Wa$(comma)-isa=$(isa-y)。第二个参数是可选的,如果 不支持第一个参数,而又提供了第二个参数,那么第二个参数就会被使用。
 
ld-option
ld-option用于在链接时检测$(CC)是否支持给定的选项。如果不支持第一个,可能会指定一个可选的第二选项。
 
as-instr
as-instr检测汇编器是否报告一个特殊指令并输出选项1或选项2。
 
cc-option
cc-option用来检测$(CC)是否支持一个给定式的选项,并且不支持一个可选的第二选项。
 
             Example:
                           #arch/i386/Makefile
                           cflags-y += $(call cc-option,-march=pentium-mmx,-march=i586)
 
上例中,如果$(CC)支持,cflags-y会被赋值为选项-march=pentium-mmx,否则赋值为-march=i586。对于cc-option,第二个参数是可选的,如果被优化了,当不支持第一个选项时,cflags-y将不会被赋值。
 
cc-option-yn
cc-option-yn检测gcc是否支持一个给定的选项,如果支持,返回’y’,否则,返回’n’。
 
             Example:
                           #arch/ppc/Makefile
                           biarch := $(call cc-option-yn, -m32)
                           aflags-$(biarch) += -a32
                           cflags-$(biarch) += -m32
 
cc-option-align
gcc 3.0及其以上的版本改变了选项的类型,这些选项用于指定函数、循环等的排列。当被用作排列选项的前缀时,$(cc-option-align)会选择正确的前缀
 
             gcc < 3.00
                           cc-option-align = -malign
             gcc >= 3.00
                           cc-option-align = -falign
 
             Example:
                           CFLAGS += $(cc-option-align)-functions=4
 
上例中,gcc >=3.00时,使用-falign-functions=4。gcc < 3.00时,使用用-malign-functions=4.
 
cc-version
cc-version返回$(CC)编译器版本的数字版本。
 
cc-ifversion
cc-ifversion检测$(CC)的版本,如果版本表达式为真,其返回值就是最后一个参数。
 
三、             主机程序支持
 
Kbuild支持在主机上编译生成可执行文件,用于编译阶段。为了使用一个主机可执行程序,需要如下两步:
 
第一步,告诉kbuild存在一个主机程序。这是利用变量hostprogs-y来做的
 
第二步,给这个可执行程序添加一个直接的依赖。可以用两种方法做到:在规则中添加依赖或者利用变量$(always)添加。
 
这两种可能会在下面描述。
 
1、   简单主机程序
 
有些情况下,需要在主机上编译并运行一个程序。下面这行告诉kbuild程序bin2hex将在主机上被编译。
 
             Example:
                           hostprogs-y := bin2hex
 
上例中,kbuild假定bin2hex是由当前Makefile所在目录中的一个c文件bin2hex.c编译生成的。
 
2、   组合主机程序
 
主机程序可以通过组合目标来构建。$(-objs)列出了所有对像,这些对像被链接成最终的可执行程序。
 
Example:
                           #scripts/lxdialog/Makefile
                           hostprogs-y     := lxdialog
                           lxdialog-objs := checklist.o lxdialog.o
 
3、   定义共享库
 
Kbuild提供对共享库的支持,但用法会受限制。下例中,用libkconfig.so共享库链接生成可执行文件conf.
 
             Example:
                           #scripts/kconfig/Makefile
                           hostprogs-y         := conf
                           conf-objs             := conf.o libkconfig.so
                           libkconfig-objs := expr.o type.o
 
共享库总是需要一个对应的-objs行,上例中libkconfig共享由expr.o和type.o组合而成。expr.o和type.o会被编译成位置无关代码,并被链接成共享库libkconfig.so。c++不支持共享库。
 
4、   把c++用于主机程序
 
kbuild提供了对c++主机程序的支持。
 
             Example:
                           #scripts/kconfig/Makefile
                           hostprogs-y     := qconf
                           qconf-cxxobjs := qconf.o
 
上例中可执行程序由c++文件qconf.cc(由$(qconf-cxxobjs)标识)组合生成.
 
如果qconf由.c和.cc文件混合组成,那就要再添加一行
 
 
             Example:
                           #scripts/kconfig/Makefile
                           hostprogs-y     := qconf
                           qconf-cxxobjs := qconf.o
                           qconf-objs       := check.o
 
5、   为主机程序控制编译选项
 
编译主机程序时,会用$(HOSTCC),并传递由$(HOSTCFLAGS)指定的选项。为了设置可以影响所有在那个Makefile中创建的主机程序的标记,可以使用变量HOST_EXTRACFLAGS。
 
             Example:
                           #scripts/lxdialog/Makefile
                           HOST_EXTRACFLAGS += -I/usr/include/ncurses
 
给单个文件设置特殊的标记:
 
             Example:
                           #arch/ppc64/boot/Makefile
                           HOSTCFLAGS_piggyback.o := -DKERNELBASE=$(KERNELBASE)
 
也可以给链接器指定附加选项
 
             Example:
                           #scripts/kconfig/Makefile
                           HOSTLOADLIBES_qconf := -L$(QTDIR)/lib
 
6、   何时主机程序被编译
 
只有在主机程序被当作依赖引用时,Kbuild才会编译主机程序
 
有两种方法:
 
1)、在一个特殊的规则中直接列出依赖
 
             Example:
                           #drivers/pci/Makefile
                           hostprogs-y := gen-devlist
                           $(obj)/devlist.h: $(src)/pci.ids $(obj)/gen-devlist
                                         ( cd $(obj); ./gen-devlist ) < $<
 
在$(obj)/gen-devlist被更新之前,不会编译生成$(obj)/devlist.h。注意,在特殊规则中引用主机程序必须加前缀$(obj).
 
2)、使用$(always)
 
当没有合适的特殊规则,而在进入makefile时主机程序要被编译,这时就要用$(always)变量。
 
             Example:
                           #scripts/lxdialog/Makefile
                           hostprogs-y     := lxdialog
                           always               := $(hostprogs-y)
 
这里告诉kbuild,即使没有在任何规则中被引用,也编译lxdialog。
 
7、   使用hostprog-$(CONFIG_FOO)
 
Kbuild文件中一个典型的模式如下
 
             Example:
                           #scripts/Makefile
                           hostprogs-$(CONFIG_KALLSYMS) += kallsyms
 
Kbuild知道’y’对应built-in,’m’对应module。所以如果一个配置符号赋值为’m’,kbuild依然会编译生成二进制码。换句话说,kbuild把hostprogs-m和hostprogs-y作同样处理。在没有包括CONFIG符号时,只推荐使用hostprogs-y.
 
四、             Kbuild的清除结构组织
 
“make clean”会删除大部分生成的文件,这些文件在编译内核的目录树中。包括主机程序。Kbuild知道列在$(hostprogs-y), $(hostprogs-m), $(always),$(extra-y) 和 $(targets)中的目标。它们都会在”make clean”时被删除。符合”*.[oas]”、”*.ko”模式的文件,加上一些由kbuild生成的附加文件,都会在执行”make clean”时,从整个内核源码树中被删除。
 
注意:
 
1)、arch/$(ARCH)/Makefile不能使用”subdir-”,因为这个文件被包含在顶层Makefile中,而kbuild结构组织在那里是不运作的。
 
2)、”make lcean”时,所有下个列在core-y, libs-y, drivers-y 和 net-y中的目录都会被访问。
 
五、             体系结构Makefile
 
在开始向下进入各单独的目录前,顶层目录设置了环境变量,并做了准备工作。顶层Makefile包含了通用的部分,而arch/$(ARCH)/Makefile为上述体系结构设置kbuild所要用的内容。因此arch/$(ARCH)/Makefile设置了大量的变量并定义少量的目标。
 
执行kbuild时,会有以下步骤:
 
1)、内核的配置=>生成.config
 
2)、在include/linux/version.h中存储内核版本
 
3)、include/asm到include/asm-$(ARCH)的符号链接
 
4)、更新所有目标的其他依赖:――附加的依赖在arch/$(ARCH)/Makefile中指定。
 
5)、递归向下进入所有列在init-* core* drivers-* net-* libs-*中的目录,并编译所有目标。――上述变量的值在arch/$(ARCH)/Makefile中扩展
 
6)、然后所有目标文件被链接,生成的文件vmlinux放在obj目录树的根目录中。最先被链接的目标列在head-y中,head-y由arch/$(ARCH)/Makefile赋值。
 
7)、最后,体系结构相关的部分做了所有必需的处理,并编译生成了最终的启动映像。包括编译引导记录,准备initrd映像及相关文件。
 
1、   设置变量,把编译转向具体某个体系结构
 
LDFLAGS Generic $(LD) options
 
调用链接器时用到的标记。通常指定emulation就足够了
 
注意:EXTRA_LDFLAGS和LDFLAGS_$@可用来进一步定制用到的标记。后面会提到。
 
LDFLAGS_MODULE 链接模块时$(LD)的选项。默认是”-r”,用于生成可重定位输出文件。
 
LDFLAGS_vmlinux 链接vmlinux时$(LD)用到的选项。LDFLAGS_vmlinux要用到LDFLAGS_$@的支持。
 
OBJCOPYFLAGS objcopy 标记。
 
当用$(call if_changed,objcopy)转换.o文件时,会用到由OBJCOPYFLAGS指定的标记。$(call if_changed,objcopy)通常用来生成一个基于vmlinux的原始的二进制文件。
 
             Example:
                           #arch/s390/Makefile
                           OBJCOPYFLAGS := -O binary
 
                           #arch/s390/boot/Makefile
                           $(obj)/image: vmlinux FORCE
                                         $(call if_changed,objcopy)
 
AFLAGS   用于$(AS)的汇编程序标记
 
默认值在顶层Makefile,各体系结构中根据情况做些添加修改
 
CFLAGS $(CC)编译标记
 
默认值在顶层Makefile,各体系结构中根据情况做些添加修改
 
CFLAGS_KERNEL   为built-in指定的$(CC)选项。$(CFLAGS_KERNEL)包含编译固定内核代码时用的额外的编译标记
 
CFLAGS_MODULE $(CC)编译模块时用到的编译选项,$( CFLAGS_MODULE)包含编译可加载内核模块代码时用的额外的编译标记
 
2、   向archprepare添加依赖
 
archprepare:在开始向下进入各子目录前,用规则列出需要编译的依赖。
 
这个经常用在包含汇编常量的头文件
 
                           Example:
                           #arch/arm/Makefile
                           archprepare: maketools
 
上例中,maketools在向下进入各子目录前会被处理好
 
3、   向下进入时,列出要访问的目录
 
体系结构相关Makefile和顶层Makefile结合定义了一些变量,这些变量指定指出怎样编译vmlinux文件。对于模块,没有对应的体系结构相关部分;模块编译机制是完全体系结构无关的。
 
head-y, init-y, core-y, libs-y, drivers-y, net-y
 
$(head-y)列出最先被链接到vmlinux的目标。
 
$(libs-y)列出了存放lib.a归档文件的目录。
 
其他的列出了存放built-in.o目标文件的目录。
 
$(init-y)目标放在$(head-y)后面,其他的按下面顺序排列:
 
$(core-y), $(libs-y), $(drivers-y), $(net-y).
 
顶层Makefile定义了所有通用目录的值,而arch/$(ARCH)/Makefile只添加了体系结构相关的目录。
 
             Example:
                           #arch/sparc64/Makefile
                           core-y += arch/sparc64/kernel/
                           libs-y += arch/sparc64/prom/ arch/sparc64/lib/
                           drivers-$(CONFIG_OPROFILE)   += arch/sparc64/oprofile/
 
4、   体系结构相关引导映像
 
体系结构相关Makefile指定生成vmlinux文件的目标,然后压缩vmlinux,把它封装成引导代码,并把最终的文件复制到某个位置。
 
通常把所有附加处理放在arch/$(ARCH)/下的boot/目录中。
 
Kbuild并不提供智能的方法来支持编译在boot/目录中指定的目标。因此,arch/$(ARCH)/Makefile要手工调用make在boot/目录中编译目标。
 
             Example:
                           #arch/i386/Makefile
                           boot := arch/i386/boot
                           bzImage: vmlinux
                                         $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@
 
推荐用"$(Q)$(MAKE) $(build)=
"在子目录中调用make。
 
没有命名体系结构相关目标的规则,但是执行”make help”会列出所有相关的目标。要支持这个,必须定义$(archelp)
 
             Example:
                           #arch/i386/Makefile
                           define archhelp
                              echo   '* bzImage           - Image (arch/$(ARCH)/boot/bzImage)'
                           endif
 
如果不带参数执行make,遇到的第一个目标会被编译。顶层Makefile中第一个出现的目标是all: 。
 
每种体系结构总要默认的编译一个可引导映像。执行”make help”时,默认目标用”*”突出显示。给all:添加一个新的依赖来选择不同于vmlinux的默认目标
 
             Example:
                           #arch/i386/Makefile
                           all: bzImage
 
5、   编译非内核目标
 
extra-y
 
extra-y指定了在当前目标下创建的附加目标, obj-*指定的目标除外。
 
有两种情况要列出extra-y中所有的目标:
 
1)、让kbuild能够检测命令行的改变――使用$(call if_changed,xxx)时
 
2)、执行”make clean”时,kbuild知道要删除什么文件。
 
             Example:
                           #arch/i386/kernel/Makefile
                           extra-y := head.o init_task.o
 
上例中,用extra-y列出需要被编译但不用链接到built-in.o中的目标文件
 
6、   对编译引导映像有用的命令
 
Kbuild提供了少量的宏,这些宏在编译引导映像时很有用。
 
if_changed
 
if_changed是以下命令用到的基本组织结构。
 
             Usage:
                           target: source(s) FORCE
                                         $(call if_changed,ld/objcopy/gzip)
 
在求这个规则的值时,会检查是否有文件需要更新,或者因为最后一次调用使得命令行已经改变。接下来,如果可执行程序的选项被改变了,会强制进行重编译。
 
任何使用if_changed的目标必须在$(targets)中列出,否则命令行检测会失败,目标总会被编译。
 
注意,忘记依赖是一个典型的错误。另外一个常见的缺陷是空格有时也很重要,例如,下面会出错(注意逗号后的空格):
 
                           target: source(s) FORCE
             #WRONG!#     $(call if_changed, ld/objcopy/gzip)
 
ld
 
链接目标。通常会用LDFLAGS_$@为ld设置特定选项
 
objcopy
 
拷贝二进制码,通常在arch/$(ARCH)/Makefile中指定OBJCOPYFLAGS。可以用OBJCOPYFLAGS_$@设置附加选项。
 
gzip
 
压缩目标。最大限度压缩目标。
 
             Example:
                           #arch/i386/boot/Makefile
                           LDFLAGS_bootsect := -Ttext 0x0 -s --oformat binary
                           LDFLAGS_setup       := -Ttext 0x0 -s --oformat binary -e begtext
 
                           targets += setup setup.o bootsect bootsect.o
                           $(obj)/setup $(obj)/bootsect: %: %.o FORCE
                                         $(call if_changed,ld)
 
$(targets)被赋予了所有潜在的目标,kbuild会通过它知道目标并进行如下操作:
1)、检查命令行的改变
2)在make clean时删除目标
 
注意:忘记”target :=”赋值操作是常见的错误,这将导致目标文件无条件重新编译。
 
7、   自定义kbuild命令
 
在KBUILD_VERBOSE=0的情况下执行kbuild,只有一个命令的简写正常显示。
 
kbuild需要设置两个变量来打开自定义命令的这种行为:
 
quiet_cmd_ -- 要被回显的
         cmd_ -- 要执行的命令
                                                                                                                                                                                                                                                 
             Example:
                           #
                           quiet_cmd_image = BUILD     $@
                                      cmd_image = $(obj)/tools/build $(BUILDFLAGS) /
                                                                                                    $(obj)/vmlinux.bin > $@
 
                           targets += bzImage
                           $(obj)/bzImage: $(obj)/vmlinux.bin $(obj)/tools/build FORCE
                                         $(call if_changed,image)
                                         @echo 'Kernel: $@ is ready'
 
当更新目标$(obj)/bzImage时,
 
             BUILD       arch/i386/boot/bzImage
 
会在”make KBUILD_VERBOSE=0”时显示。
 
8、   预处理链接脚本
 
当编译vmlinux映像时,使用arch/$(ARCH)/kernel/vmlinux.lds这个链接脚本。这个脚本是同一目标下文件vmlinux.lds.S的预处理变量。kbuild知道.lds文件,并包含了一个*lds.S到*lds的规则
 
             Example:
                           #arch/i386/kernel/Makefile
                           always := vmlinux.lds
 
                           #Makefile
                           export CPPFLAGS_vmlinux.lds += -P -C -U$(ARCH)
 
对$(always)的赋值告诉kbuild编译目标vmlinux.lds。对$( CPPFLAGS_vmlinux.lds)的赋值告诉kbuild在编译目标vmlinux.lds时使用指定的选项。
 
编译*.lds目标时,kbuild使用下面的变量:
             CPPFLAGS       : 在顶层Makefile中设置
             EXTRA_CPPFLAGS         : 可能在 kbuild makefile中设置
             CPPFLAGS_$(@F)   : 目标相关标记. 注意,在这个赋值中使用全名

这篇关于Linux Makefile.txt 分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1127844

相关文章

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念