采用资料比较多的,uboot 1.1.6 。
开始下载了个一个最新的版本,里面没有看到makefile 目标: smdk2400_config。原因:
===================================================================================================
可以看到
smdk2400_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2400 NULL s3c24x0
这行命令,首先需要执行目标 unconfig 删除以前的配置文件,然后执行 MKCONFIG这个变量表示的一个脚本。后面的 arm ar920t等等是这个脚本的启动参数。
@ 目的是不要echo 这行命令到标准输出
$(MKCONFIG) 表示一个脚本的名字,顶层目录下的 mkconfig,这个脚本的目的是创建一些配置文件,包括头文件,符号链接,make配置文件等
$(@:_config=) arm arm920t smdk2400 NULL s3c24x0
这几个都是参数,其中第一个,解释一下
-------------------------------------------------------------------------------------------------------------------------
$(@:_config=)的意思是,将目标文件名字中含有的_config用等号后面的的字符替换掉,这里=后面为空,所以其效果就是把_config去掉,这样,make smdk2410_config实际上就是先执行unconfig的命令,再执行mkconfig smdk2410
arm arm920t smdk2400 NULL s3c24x0
这个地方看看原理: 这个地方由两个知识点凑起来的。
1)变量的高级用法,变量替换引用
$(VAR:PATTERN=REPLACEMENT)也就是说,把变量VAR中(以空格分开的各个字符串中)的 PATTERN 变为REPLACEMENT
举个普遍的应用:
我们有一个变量objects = foo.o bar.o baz.o,那么我们想获得所有.o文件对用的.c源文件,我们这么做
$(object:.o=.c)
这个地方其实是一个简化版的patsubst函数。 至于makefile中的函数,我们这里没法展开,遇到什么看什么把。
2)$@这里是一个自动化变量。
自动化变量是makefile中模式规则的一部分内容。这个地方记住下面几个就可以:
$@ 目标文件名,他表示当前规则的目标文件。
$<当前规则的所有依赖文件列表,使用空格分开。如果依赖列表中文件有重复,它只记录一次。
$^规则的依赖文件列表中的第一个文件名。
3)总结看来,就是 $@--> $(@)-->$(@:__config=)
=================================================================================================
下面看看mkconfig这个脚本干了什么事:
http://blog.csdn.net/heaiding/article/details/6103806
这个脚本文件只有八十几行。从注释来看只是
阅读(1018) | 评论(0) | 转发(0) |