TA的每日心情 | 开心 2020-6-18 22:00 |
---|
签到天数: 1 天 [LV.1]初来乍到
管理员
  
- 积分
- 1645
|
版本:u-boot-1.1.6
目标板:smdk2410
在编译生成uboot时,执行的第一个命令是:
这个命令的到底做了什么?我们发现smdk2410_config是顶层makefile中的一个目标:
- smdk2410_config : unconfig
- @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
复制代码 目标的依赖是unconfig,我们可以在顶层makefile中找到unconfig是顶层makefile的一个伪目标:
- unconfig:
- @rm -f $(obj)include/config.h $(obj)include/config.mk \
- $(obj)board/*/config.tmp $(obj)board/*/*/config.tmp
复制代码 unconfig的作用就是删除一些文件,是xxx_config命令的逆过程,具体删除了哪些文件,我们还需要继续分析。
- #顶层Makefile第86~87行
- OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
- SRCTREE := $(CURDIR)
- #顶层Makefile103~110行
- ifneq ($(OBJTREE),$(SRCTREE))
- obj := $(OBJTREE)/
- src := $(SRCTREE)/
- else
- obj :=
- src :=
- endif
- export obj src
复制代码 第86行:因为变量BUILD_DIR未定义,所以变量OBJTREE:=$(CURDIR)
第87行:SRCTREE:=$(CURDIR)
第103~110行:判断输出目录和当前源码目录是否不相同,在这里是相同的,条件不成立。执行else分支,将obj,src都赋值为空,并将变量导出。
所以:
obj :=
src :=
命令前面的“@”符号表示执行命令而不显示命令本身,行尾的“\”是换行符,我们将unconfig伪指令展开得到如下结果:
- unconfig:
- rm -f include/config.h include/config.mk board/*/config.tmp board/*/*/config.tmp
复制代码 现在我们可以很清除的看到,在这里unconfig执行了什么什么操作。
删除了include目录下的config.h和config.mk文件,删除了board目录下所有子目录中的config.tmp文件,删除了board目录下所有子目录下子目录中的config.tmp。
到这一步,make smdk2410_config执行的第一步unconfig,我们已经很清楚了,继续分析剩下的部分:
- @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
复制代码 首先开头的“@”作用是取消回显。
MKCONFIG是一个变量,他的定义在顶层Makefiled的92~93行:
- #顶层Makefile的92~93行
- MKCONFIG := $(SRCTREE)/mkconfig
- export MKCONFIG
复制代码 由于前面分析SRCTREE=$(CURDIR),所以第92行可以展开为:
- MKCONFIG := $(CURDIR)/mkconfig
复制代码 CURDIR是make的一个内嵌变量(标准变量),值为make 执行时所在的目录。那现在我们就可以理解为MKCONFIG指的就是当前目录下的mkconfig文件。
接下来看$(@:_config=)是什么意思:
这里的“@”代表当前规则的目标文件名,在这里也就是smdk2410_config,我们可以展开为:
$(smdk2410_config:_config=)
这是Makefile的替换引用规则,这里的含义是将smdk2410_config中的_config替换为空,结果为smdk2410。
通过上面的分析,可以将@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0展开为:
- $(CURDIR)mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0
复制代码 也就是是说,执行当前目录下的mkconfig文件,并传递6个参数,smdk2410、arm、arm920t、smdk2410、NULL、s3c24x0。
这六个参数的含义在mkconfig中有描述,分别是:Target Architecture CPU Board [VENDOR] [SOC]
总结:
make xxx_config主要做以下两项工作:
(1)删除上一次的配置文件config.h、config.mk和配置临时文件。
(2)调用mkconfig文件,传递参数,生成新的配置文件。
mkconfig文件做了什么,请看下一篇。
|
|