Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1611899
  • 博文数量: 245
  • 博客积分: 10378
  • 博客等级: 上将
  • 技术积分: 2571
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-27 08:19
文章分类

全部博文(245)

文章存档

2013年(4)

2012年(8)

2011年(13)

2010年(68)

2009年(152)

分类: LINUX

2009-05-18 17:58:16

刚开始我们说过,在生成配置文件有很多方法,可以使用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 $<

 

 

 

阅读(1156) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~