-- linux爱好者,业余时间热衷于分析linux内核源码 -- 目前主要研究云计算和虚拟化相关的技术,主要包括libvirt/qemu,openstack,opennebula架构和源码分析。 -- 第五届云计算大会演讲嘉宾 微博:@Marshal-Liu
分类: 虚拟化
2011-11-12 17:34:37
all:build-all (1)
build-all:$(TOOLS) recurse-all (2)
recurse-all: $(SUBDIR_RULES) $(ROMSUBDIR_RULES) (3)
p, li { white-space: pre-wrap;SUBDIR_RULES=$(patsubst %,subdir-%, $(TARGET_DIRS)) (4)
ROMSUBDIR_RULES=$(patsubst %,romsubdir-%, $(ROMS)) (5)
subdir-%: $(GENERATED_HEADERS) (6)
$(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C $* V="$(V)" TARGET_DIR="$*/" all,)
romsubdir-%: (7)
$(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C pc-bios/$* V="$(V)" TARGET_DIR="$*/",)
上面即是qemu简化版的Makefile,下面就来详细分析下上面规则的含义。SRC_PATH=/home/src/qemu-0.15.1
TOOLS=qemu-ga qemu-nbd qemu-img qemu-io /*规则(2)中TOOLS的定义*/
TARGET_DIRS=i386-softmmu /*规则(4)中TARGET_DIRS的定义*/
ROMS=optionrom /*规则(5)中ROMSUBDIR_RULES的定义*/
--------------------------------------------------------------------------------------------
上述规则中最重要的规则就是两个函数的调用: p, li { white-space: pre-wrap; }
subdir-%: $(GENERATED_HEADERS)
$(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C $* V="$(V)" TARGET_DIR="$*/" all,)
上面规则等价于:
make --no-print-directory -C i386-softmmu V="" TARGET_DIR="i386-softmmu/" all
回想make -C的常用格式:
make -C path 参数
则上面规则的含义为:执行i386-softmmu下的Makefile中的依赖目标all, 传递的参数是V=""和TARGET_DIR="i386-softmmu/"
romsubdir-%:
$(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C pc-bios/$* V="$(V)" TARGET_DIR="$*/",)
与subdir-i386-softmmu一样,上面规则的含义就是:执行pc-bios/下的所有依赖目标,传递的参数为 V="$(V)" TARGET_DIR="$*/",需要注意的是这里的$*代表的是不包含扩展名的目标文件的名称。
自此,Makefile就进入了i386-softmmu和pc-bios两个目录下,执行相对应的Makfile
---------------------------------------------------------------------------------------------
从i386-softmmu/Makefile中能够清晰的找出哪些代码完成了qemu哪些功能模块的仿真。
1. cpu功能模块的仿真