|
在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 $<