小白视角看uboot makefile

要了解uboot的结构,最好的办法就是看uboot根目录下的Makefile。作为小白,第一次看Makefile时简直如同天书,下面内容是我看了韦东山uboot视频教程,以及makefile规则教程后写下的。

uboot源码中许多可以直接编译的开发板,型号存在./board中,以smdk2410开发板为例。(后续内容均将uboot根目录定为当前目录)

生成uboot.bin文件我们需要执行两条命令:

  1. make smdk2410_config
  2. make

第一条将它称为配置
第二条则是编译

先来看第一条 配置

1. make smdk2410_config

打开在uboot根目录下的Makefile文件,搜索smdk2410_config,找到如下两行

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

预习一下makefile教程后,大概知道这两行所做的事情:

  1. smdk2410_config是一个标签入口,依赖于unconfig目标
  2. 搜索unconfig,找到unconfig做了什么:
unconfig:
    @rm -f $(obj)include/config.h $(obj)include/config.mk \
        $(obj)board/*/config.tmp $(obj)board/*/*/config.tmp \
        $(obj)include/autoconf.mk $(obj)include/autoconf.mk.dep

unconfig 会删除一些文件,这些文件应该是每次make xxx_config都会生成的,清理这些上次生成文件,为当前这次做准备

  1. 回到@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 samsung s3c24x0这一行
    这其实是一句命令,解析之后其实就是:
    mkconfig smdk2410 arm arm920t smdk2410 samsung s3c24x0
    也就是执行mkconfig命令,后面跟着6个参数

  2. mkconfig应该是个可执行文件,在uboot根目录下搜索,果然发现了mkconfig文件,打开查看里面内容
    mkconfig文件中前半部分为一大堆判断语句,大概是用来分析参数是否合法输入。
    重点在后半段:

#
# Create include file for Make
#
echo "ARCH   = $2" >  config.mk    #ARCH = (传入的第二个参数)  新建config.mk并写入
echo "CPU    = $3" >> config.mk    #CPU = (传入的第二个参数)  写入到config.mk
echo "BOARD  = $4" >> config.mk    #BOARD = (传入的第三个参数)  写入到config.mk
...
...

果然涉及到了上面unconfig所删除的文件,确认了make smdk2410_config这句话最终会生成一些文件

那我们执行一遍make smdk2410_config,验证猜测
./include/config.mk

ARCH   = arm
CPU    = arm920t
BOARD  = smdk2410
VENDOR = samsung
SOC    = s3c24x0

./include/config.h

/* Automatically generated - do not edit */
#include 
#include 

结果和mkconfig中所做的一致。


到这里,make smdk2410_config命令就结束了,解析出来做了两句话:unconfig
mkconfig smdk2410 arm arm920t smdk2410 samsung s3c24x0
unconfig会删除一些上次残留的文件,另一句则会根据传入参数自动生成 ./include/config.mk 和 ./include/config.h等文件
其实就是做了配置工作,选中了下一步编译中用到的 CPU架构、种类、名字等等

第一条命令分析完了,再来看第二条

2. make

根据makefile规则,直接执行make命令,就会在执行Makefile文件中第一个标签的内容
在行终于找到第一个标签all:

image.png

待续...

你可能感兴趣的:(小白视角看uboot makefile)