vivi的Makefile文件解析(3)

 
刚开始我们说过,在生成配置文件有很多方法,可以使用make menuconfig也可以使用make config,那么这些实现是在makefile的什么地方:

oldconfig:
    $(CONFIG_SHELL) scripts/Configure -d arch/config.in

config:
    $(CONFIG_SHELL) scripts/Configure arch/config.in

menuconfig: include/version.h
    $(MAKE) -C scripts/lxdialog all
    $(CONFIG_SHELL) scripts/Menuconfig arch/config.in

 在scripts/目录下,有两个脚本文件:Configure与Menuconfig,他们都会载入菜单配置文件config.in,可以看到make config 与make menuconfig的不同在于,make menuconfig会进入scripts/lxdialog进行编译文件后在执行脚本,这也就是为什么在make menucofig是图形化配置而makie config 是文本化的区别了,如果对图形化的实现感兴趣,可以进入到lxdialog去看源码。

#这个依赖文件决定进入子目录
#  ”$(patsubst %, , )“
# 函数名称:模式替换函数—patsubst。
#这里的意思是把与patsubst后的第一个参数与第三个参数比较,把想匹配的参数转换成第二个参数的形式。
linuxsubdirs: $(patsubst %, _dir_%, $(SUBDIRS))

$(patsubst %, _dir_%, $(SUBDIRS)) : include/version.h
 $(MAKE) CFLAGS="$(CFLAGS) $(CFLAGS_KERNEL)" -C $(patsubst _dir_%, %, $@)   #这里完成了目录的跳转。
 # 跳转到子目录 去执行子目录下的makefile

$(TOPDIR)/include/version.h: include/version.h
$(TOPDIR)/include/compile.h: include/compile.h


include/compile.h: $(CONFIGURATION) include/version.h
 @echo -n /#define UTS_VERSION /"/#$(VIVIRELEASE) > .ver
 @if [ -f .name ]; then  echo -n /-`cat .name` >> .ver; fi
 @echo ' '`date`'"' >> .ver
 @echo /#define VIVI_COMPILE_TIME /"`date +%T`/" >> .ver
 @echo /#define VIVI_COMPILE_BY /"`whoami`/" >> .ver
 @echo /#define VIVI_COMPILE_HOST /"`hostname`/" >> .ver
 @if [ -x /bin/dnsdomainname ]; then /
    echo /#define VIVI_COMPILE_DOMAIN /"`dnsdomainname`/"; /
  elif [ -x /bin/domainname ]; then /
    echo /#define VIVI_COMPILE_DOMAIN /"`domainname`/"; /
  else /
    echo /#define VIVI_COMPILE_DOMAIN ; /
  fi >> .ver
 @echo /#define VIVI_COMPILER /"`$(CC) $(CFLAGS) -v 2>&1 | tail -1`/" >> .ver
 @mv -f .ver $@


# ”/#“这里的”/“是指明"#"是特殊字符,不是注释符
#  最后一句: mv -f .ver  $@ 这里的”$@“称之为自动化变量
#$@ 表示规则的目标文件名。如果目标是一个文档文件
#(Linux中,一般称.a文件为文档文件,也称为静态库文件),
#那么它代表这个文档的文件名。在多目标模式规则中,
#它代表的是哪个触发规则被执行的目标文件名。

include/version.h:
 @echo /#define VIVI_RELEASE /"$(VIVIRELEASE)/" > .ver
 @echo /#define VIVI_VERSION_CODE `expr $(VERSION) //* 65536 + $(PATCHLEVEL) //* 256 + $(SUBLEVEL)` >> .ver
 @echo '#define VIVI_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))' >>.ver
 @mv -f .ver $@

init/version.o: init/version.c include/compile.h
 $(CC) $(CFLAGS) -DUTS_MACHINE='"$(ARCH)"' -c -o init/version.o init/version.c


# "$*"这里的自动变量表示文件去掉后缀的部分,在这里”$*“表示"init/main."
#  "$<"这里的自动化变量表示文件的隐含依赖规则中的第一个依赖文件,这里的”$<“表示"init/main.c"
init/main.o: init/main.c
 $(CC) $(CFLAGS) $(CFLAGS_KERNEL) $(PROFILING) -c -o $*.o $<

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值