用
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 - = 3.00
cc-option-align = -falign
Example:
CFLAGS += $(cc-option-align)-functions=4
上例中,gcc >=3.00时,使用-falign-functions=4。gcc -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