- 文章引自:http://blog.csdn.net/bsplover/article/details/4632035
刚开始我们说过,在生成配置文件有很多方法,可以使用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去看源码。
- // 清除目录文件,配置文件
- clean:
- find . \( -name '*.o' -o -name core -o -name ".*.flags" \) -type f -print \
- | grep -v lxdialog/ | xargs rm -f
- rm -f $(CLEAN_FILES)
- distclean: clean
- rm -f $(DISTCLEAN_FILES)
$(patsubst %, , )
函数名称:模式替换函数—patsubst。
这里的意思是把与patsubst后的第一个参数与第三个参数比较,把想匹配的参数转换成第二个参数的形式。
linuxsubdirs: $(patsubst %, _dir_%, $(SUBDIRS))
- linuxsubdirs: $(patsubst %, _dir_%, $(SUBDIRS))
- $(patsubst %, _dir_%, $(SUBDIRS)) : include/version.h
- // 这里完成了目录的跳转, 跳转到子目录,执行子目录的makefile。
- $(MAKE) CFLAGS="$(CFLAGS) $(CFLAGS_KERNEL)" -C $(patsubst _dir_%, %, $@)
- $(TOPDIR)/include/version.h: include/version.h
- $(TOPDIR)/include/compile.h: include/compile.h
- include/compile.h: $(CONFIGURATION) include/version.h
- // 生成临时文件.ver,并写入信息
- @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
- // 修改临时文件.ver为目标文件include/compile.h
- @mv -f .ver $@
- include/version.h:
- // 生成临时文件.ver,并写入信息
- @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
- // 修改临时文件.ver为目标文件include/version.h
- @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.o: init/main.c
- // "$*"这里的自动变量表示文件去掉后缀的部分,在这里”$*“表示"init/main."
- // "$<"这里的自动化变量表示文件的隐含依赖规则中的第一个依赖文件,这里的”$<“表示"init/main.c"
- $(CC) $(CFLAGS) $(CFLAGS_KERNEL) $(PROFILING) -c -o $*.o $<
- TAGS: dummy
- etags `find include -name '*.h'`
- find $(SUBDIRS) init -name '*.[ch]' | xargs etags -a
- # Exuberant ctags works better with -I
- tags: dummy
- CTAGSF=`ctags --version | grep -i exuberant >/dev/null && echo "-I __initdata,__exitdata,EXP
- ORT_SYMBOL,EXPORT_SYMBOL_NOVERS"`; \
- ctags $$CTAGSF `find include -name '*.h'` && \
- find $(SUBDIRS) init -name '*.[ch]' | xargs ctags $$CTAGSF -a
- %: ./arch/def-configs/%
- $(MAKE) distclean
- cp arch/def-configs/$* ./.config -f
- $(MAKE) oldconfig
- $(MAKE)
- ifdef CONFIGURATION
- ..$(CONFIGURATION):
- @echo
- @echo "You have a bad or nonexistent" .$(CONFIGURATION) ": running 'make" $(CONFIGURATION)"'
- "
- @echo
- $(MAKE) $(CONFIGURATION)
- @echo
- @echo "Successful. Try re-making (ignore the error that follows)"
- @echo
- exit 1
- dummy:
- else
- dummy:
- endif
- include Rules.make
阅读(1546) | 评论(0) | 转发(1) |