文章版权归本人所有,未经同意,请勿转载!
-
前提说明
- virsh所属libvirt版本号:4.0.0
- 运行环境为ubuntu 18.04
- 只介绍源码执行框架,不会详细介绍每行代码
-
Makefile编译virsh过程分析
在源码根目录下执行configure命令会生成各级Makefile,包括源码根目录下的主Makefile。
-
主Makefile生成virsh过程
-
主目标如下 :
all: config.h
$(MAKE) $(AM_MAKEFLAGS) all-recursive - 生成主目标的命令会再次执行主Makefile生成目标all-recursive
生成目标all-recursive的规则如下
- 目标all-recursive被包含在变量RECURSIVE_TARGETS中
RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
ctags-recursive dvi-recursive html-recursive info-recursive \
install-data-recursive install-dvi-recursive \
install-exec-recursive install-html-recursive \
install-info-recursive install-pdf-recursive \
install-ps-recursive install-recursive installcheck-recursive \
installdirs-recursive pdf-recursive ps-recursive \
tags-recursive uninstall-recursive - 变量RECURSIVE_TARGETS被包含在变量am__recursive_targets中
am__recursive_targets = \
$(RECURSIVE_TARGETS) \
$(RECURSIVE_CLEAN_TARGETS) \
$(am__extra_recursive_targets) - 变量am__recursive_targets的生成过程如下:
$(am__recursive_targets):
@fail=; \
if $(am__make_keepgoing); then \
failcom='fail=yes'; \
else \
failcom='exit 1'; \
fi; \
dot_seen=no; \
target=`echo $@ | sed s/-recursive//`; \
case "$@" in \
distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
*) list='$(SUBDIRS)' ;; \
esac; \
for subdir in $$list; do \
echo "Making $$target in $$subdir"; \
if test "$$subdir" = "."; then \
dot_seen=yes; \
local_target="$$target-am"; \
else \
local_target="$$target"; \
fi; \
($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|| eval $$failcom; \
done; \
if test "$$dot_seen" = "no"; then \
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
fi; test -z "$$fail"在变量am__recursive_targets的生成过程中,当遇到all-recursive时,会依次调用变量SUBDIRS中各个目录下的Makefile。当调用到tools目录下的Makefile时,会生成virsh
- 目标all-recursive被包含在变量RECURSIVE_TARGETS中
-
-
次级Makefile生成virsh过程
- tools目录下的Makefile,属于二级Makefile,包含了virsh的生成规则:
-
virsh$(EXEEXT): $(virsh_OBJECTS) $(virsh_DEPENDENCIES) $(EXTRA_virsh_DEPENDENCIES)
@rm -f virsh$(EXEEXT)
$(AM_V_CCLD)$(virsh_LINK) $(virsh_OBJECTS) $(virsh_LDADD) $(LIBS)
当在linux系统中编译时,EXEEXT的值为空。
变量EXTRA_virsh_DEPENDENCIES未定义,其值为空。 -
- virsh生成规则中的各依赖的值如下:
-
virsh_OBJECTS = $(am_virsh_OBJECTS)
am_virsh_OBJECTS = virsh-virsh.$(OBJEXT) \
virsh-virsh-completer.$(OBJEXT) virsh-virsh-console.$(OBJEXT) \
virsh-virsh-domain.$(OBJEXT) \
virsh-virsh-domain-monitor.$(OBJEXT) \
virsh-virsh-host.$(OBJEXT) virsh-virsh-interface.$(OBJEXT) \
virsh-virsh-network.$(OBJEXT) virsh-virsh-nodedev.$(OBJEXT) \
virsh-virsh-nwfilter.$(OBJEXT) virsh-virsh-pool.$(OBJEXT) \
virsh-virsh-secret.$(OBJEXT) virsh-virsh-snapshot.$(OBJEXT) \
virsh-virsh-util.$(OBJEXT) virsh-virsh-volume.$(OBJEXT)virsh_DEPENDENCIES = $(am__DEPENDENCIES_1) ../src/libvirt-lxc.la \
../src/libvirt-qemu.la libvirt_shell.la $(am__append_13)
am_virsh_OBJECTS中各个成员,在Makefile中可以明确找到生成规则。
变量virsh_DEPENDENCIES中的文件,除了am__DEPENDENCIES_1和am__append_13,其它的是在src/下的主Makefile中生成的;
而am__DEPENDENCIES_1值为空,am__append_13未定义,其值也为空。 -
- tools目录下的Makefile,属于二级Makefile,包含了virsh的生成规则:
到此,可知道virsh的编译生成过程及由哪些代码文件编译生成。
-
-
virsh源码框架分析
virsh的角色:是一个客户端,通过网络将命令发送给libvirtd;libvirtd完成命令后将结果通过网络返回给virsh,virsh再将结果展示给用户。
virsh运行框架流程如图: