来源linux-2.6.20.21/Documentation/kbuild/makefiles.txt
* obj-y += foo.o 表示编build-in,obj-m += foo.o表示编成module.
* kbuild 会编译所有的$(obj-y)文件,然后调用$(LD) -r把这些文件合并到一个built-in.o文件中。这个built-in.o稍后会被父级Makefile link到vmlinux
* 用lib-y := checksum.o delay.o 会把checksum.o和delay.o合编成一个lib.a
* obj-$(CONFIG_EXT2_FS) += ext2 /表示,当CONFIG_EXT2_FS=y的时候,要跑到ext2/目录下并make
* EXTRA_CFLAGS, EXTRA_AFLAGS, EXTRA_LDFLAGS, EXTRA_ARFLAGS
EXTRA_CFLAGS 是在用CC编译C代码的时候加flag的,
EXTRA_AFLAGS是在编译汇编语言的时候加flag用的,
EXTRA_LDFLAGS是在LD的时候加flag用的,
EXTRA_ARFLAGS是在AR的时候加flag用的
* CFLAGS_aha152x.o = -DAHA152X_STAT -DAUTOCONF表示只在编译aha152x.o的时候加 -DAHA152X_STAT -DAUTOCONF
* AFLAGS_head-armv.o := -DTEXTADDR=$(TEXTADDR) -traditional和上面差不多,表示在编译特定汇编文件时加flag
* $(src) 是Makefile所在目录的相对路径
* $(obj )是目标文件保存在的目录的相对路径
* cflags-y += $(call cc-option ,-march=pentium-mmx,-march=i586)表示,如果$(CC)支持的话,-march=pentium- mmx会加给cflags-y,不支持的话就加-march=i586。还有一些as-option,ld-option,等等,基本原理都一样
* 要编在本地机上直接可以跑的程序用hostprogs,例如hostprogs-y := bin2hex表示把当前目录下的bin2hex.c编译成一个可执行文件(Host Program)
* 在一个可执行文件中link其他目标文件的办法:
#scripts/lxdialog/Makefile
hostprogs-y := lxdialog
lxdialog-objs := checklist.o lxdialog.o
表示checklist.c和lxdialog.c都会被编译且会在后面合并成lxdialog这个可执行文件
* 还有其他讲host program的,略过
* make clean 会自己设别一些文件并清除。手工指定清除的办法 :
clean-files := devlist.h classlist.h表示指定删除这两个文件
clean-dirs := $(objtree)/debian/表示删除这个目录及子目录
subdir- := compressed/表示告诉机器compressed/是子目录,要跑到里面试图清空
* kbuild的执行顺序
1) Configuration of the kernel => produce .config
2) Store kernel version in include/linux/version.h
3) Symlink include/asm to include/asm-$(ARCH)
4) Updating all other prerequisites to the target prepare:
- Additional prerequisites are specified in arch/$(ARCH)/Makefile
5) Recursively descend down in all directories listed in
init-* core* drivers-* net-* libs-* and build all targets.
- The values of the above variables are expanded in arch/$(ARCH)/Makefile.
6) All object files are then linked and the resulting file vmlinux is
located at the root of the obj tree.
The very first objects linked are listed in head-y, assigned by
arch/$(ARCH)/Makefile.
7) Finally, the architecture specific part does any required post processing
and builds the final bootimage.
- This includes building boot records
- Preparing initrd images and thelike
* archprepare : maketools中的archprepare是一个关键字,表示在开始递归子目录编译之前要作的准备工作
* all : bzImage中的all是一个关键字,表示在make没有参数的时候该执行什么
* 有用的命令工具if_changed ,用来判断文件需不需要更新。例子:
target: source(s) FORCE
$(call if_changed,ld/objcopy/gzip)
* := 表示立即赋值,= 表示把等号右边的东西先存起来,不运算,要用到左边变量时再运算