嵌入式之家

 找回密码
 现在注册

QQ登录

只需一步,快速开始

搜索
热搜: ARM cortex
查看: 3409|回复: 0

U-BOOT分析第一步:命令make xxx_config做了什么

[复制链接]
  • TA的每日心情
    开心
    2020-6-18 22:00
  • 签到天数: 1 天

    [LV.1]初来乍到

    101

    主题

    192

    帖子

    1645

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    1645
    发表于 2016-6-13 14:24:36 | 显示全部楼层 |阅读模式
    版本:u-boot-1.1.6
    目标板:smdk2410


    在编译生成uboot时,执行的第一个命令是:
    1. make  smdk2410_config
    复制代码
    这个命令的到底做了什么?我们发现smdk2410_config是顶层makefile中的一个目标:
    1. smdk2410_config    :    unconfig
    2.     @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
    复制代码
    目标的依赖是unconfig,我们可以在顶层makefile中找到unconfig是顶层makefile的一个伪目标:
    1. unconfig:
    2.     @rm -f $(obj)include/config.h $(obj)include/config.mk \
    3.         $(obj)board/*/config.tmp $(obj)board/*/*/config.tmp
    复制代码
    unconfig的作用就是删除一些文件,是xxx_config命令的逆过程,具体删除了哪些文件,我们还需要继续分析。

    1. #顶层Makefile第86~87行
    2. OBJTREE        := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
    3. SRCTREE        := $(CURDIR)

    4. #顶层Makefile103~110行
    5. ifneq ($(OBJTREE),$(SRCTREE))
    6. obj := $(OBJTREE)/
    7. src := $(SRCTREE)/
    8. else
    9. obj :=
    10. src :=
    11. endif
    12. export obj src
    复制代码
    第86行:因为变量BUILD_DIR未定义,所以变量OBJTREE:=$(CURDIR)
    第87行:SRCTREE:=$(CURDIR)

    第103~110行:判断输出目录和当前源码目录是否不相同,在这里是相同的,条件不成立。执行else分支,将obj,src都赋值为空,并将变量导出。
    所以:
    obj :=
    src :=

    命令前面的“@”符号表示执行命令而不显示命令本身,行尾的“\”是换行符,我们将unconfig伪指令展开得到如下结果:
    1. unconfig:
    2.     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,我们已经很清楚了,继续分析剩下的部分:
    1. @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
    复制代码
    首先开头的“@”作用是取消回显。
    MKCONFIG是一个变量,他的定义在顶层Makefiled的92~93行:
    1. #顶层Makefile的92~93行
    2. MKCONFIG    := $(SRCTREE)/mkconfig
    3. export MKCONFIG
    复制代码
    由于前面分析SRCTREE=$(CURDIR),所以第92行可以展开为:
    1. 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展开为:
    1. $(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文件做了什么,请看下一篇。


    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 现在注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|嵌入式之家 ( 京ICP备14038168号-1 )

    GMT+8, 2024-5-13 13:27 , Processed in 0.026702 second(s), 26 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表