分享

u-boot-1.1.6源码浅析(二)

 Vin的藏書閣 2013-03-07

在上一篇文章里说到了,如果直接运行make的话,u-boot是编译不过去的,因为缺少$(OBJTREE)/include/config.mk这个文件。然后出错提示让去看README,那咱们就去看看这个README里面写的是什么东西。
这个README文件里介绍了一下u-boot这个工程,然后说明了一下好些个参数是做什么用的,其中有一句话是包含跟咱们编译有关的信息的

make <board_name>_config

也就是说,编译的时候,make后面是需要跟参数的,那么根据make的语法,这个<board_name>_config肯定是在Makefile里定义了的一个target了。

然后再看一下Makefile文件,果然以_config结尾的target很多。因为我的板子是仿制三星的S3C2440的,所以与我最接近的,让我在移植的时候代码改动量最小的,就是smdk2410_config这个target了。如果是新手,对自己没有什么信心,那就可以直接使用这个target来编译,直接修改与这个target相关的源码就可以了。其实我个人倒是建议另外给自己的板子取一个名字,然后在Makefile里给自己的板子按着相应的规则给加一条target。然后把自己需要的与现在板子的环境最接近的板子的相关的文件都拷到相应的位置,然后慢慢修改它们就可以了。

有人会问,我怎么知道把哪里的文件都拷到哪里去呢,其实不要紧,后面就会分析到,你到时候就会看到相应的文件查找、拷贝规则了。而且如果你的文件拷错地方了,那就会有相应的出错提示,多操作几步,应该就没有问题。别告诉我你看不懂这些英文,如果这样的话,你可能得需要先去学一下英文,这方面的中文资料太少了。

因为现在只是讲u-boot代码的分析,所以就不涉及到移植的过程,那么以后的make就以make smdk2410_config,这个target来做说明了,这个如果讲清楚了,那么移植也比较容易了。

首先看Makefile的内容,找到smdk2410_config这个target,内容如下:

smdk2410_config : unconfig
 @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0

首先我们看到,这个target首先需要执行一个unconfig操作,然后再执行后面的操作。然后我们查到unconfig操作的具体内容如下:

unconfig:
 @rm -f $(obj)include/config.h $(obj)include/config.mk \
  $(obj)board/*/config.tmp $(obj)board/*/*/config.tmp

看得出来,它是删掉了包括$(obj)include/config.mk文件在内的,几个在编译的时候生成的配置文件,这个$(obj)include/config.mk与$(OBJTREE)/include/config.mk是同一个文件。这样做是为了保证重新生成文件的纯粹性。

执行完unconfig后,就执行:

 @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0

这里的$(MKCONFIG)就会被替换成上文中所说的$(SRCTREE)/mkconfig文件路径,相关于是把这个文件的内容,当可执行程序执行了,其实,它就是一个shell脚本。

一定要注意这句$(@:_config=),其实这里是用了一个比较高级的Makefile语法,$(a:patternA=patternB),这样的语法表示把a变量里的形式为patternA的换成为patternB,然后输出。那么在这个例子里,a变量换成了@,它的意思与shell里@的意思是一样的,就是输入进来的所有的参数,但是中间不用环境变量IFS所定义的分隔符分开。patternA就是_config,patternB就是空。然后再看看咱们执行这个Makefile的时候输入的语句:

 make smdk2410_config

那么在这里的话,传到$(SRCTREE)/mkconfig这个脚本里的参数实际上就是 smdk2410 arm arm920t smdk2410 NULL s3c24x0

一共有六个参数,需要记清楚,不记得其实也不要紧,需要的时候回来查一查就OK了。

下一步,就是分析$(SRCTREE)/mkconfig这个脚本的内容了。实际上,这个脚本就生成了前面我们需要的$(OBJTREE)/include/config.mk这个文件

关于$(SRCTREE)/mkconfig的分析,请看我的u-boot-1.1.6源码浅析(三)

现在整理一下编译的步骤,俺用伪码表示吧:

 if( 存在$(OBJTREE)/include/config.mk文件)
 {
  执行u-boot-1.1.6源码浅析(一)中忽略的部分
 }
 else
 {
  输入错误提示,让我们查看README文件,然后退出
 }

当我们执行make smdk2410_config的时候,如果$(SRCTREE)/mkconfig文件没有出错,则$(OBJTREE)/include/config.mk文件就会被创建,那么Makefile的逻辑就会走u-boot-1.1.6源码浅析(一)中忽略的部分。

我会按照程序执行的顺序来说明整个过程,所以下一篇文章会讲$(SRCTREE)/mkconfig的内容,然后再是u-boot-1.1.6源码浅析(一)中忽略的部分。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多