• uboot顶层Makefile前期所做工作说明一


    一.  uboot顶层 Makefile文件

    uboot顶层 Makefile,就是 uboot源码工程的根目录下的  Makefile文件。

    分析 gcc 版本代码时,一定是先从顶层 Makefile 开始的,然后再是子 Makefile ,这样通过层层分析 Makefile 即可了解整个工 程的组织结构。
    本文主要了解 uboot顶层 Makefile前期的部分内容,包括如下:
    版本号,MAKEFLAGS 变量,命令输出,静默输出,设置编译结果输出目录。

    注意:是对编译后的 uboot 源码进行分析。

    二.   Makefile 前期所做的内容

    使用 vscode软件打开 uboot源码工程。打开 uboot 源码的顶层 Makefile文件。接下来大体了解一下 顶层 Makefile的内容。

    1.  版本号

    顶层 Makefile 一开始是版本号,内容如下:
    1. 5 VERSION = 2016
    2. 6 PATCHLEVEL = 03
    3. 7 SUBLEVEL =
    4. 8 EXTRAVERSION =
    5. 9 NAME =
    VERSION 是主版本号, PATCHLEVEL 是补丁版本号, SUBLEVEL 是次版本号,这三个一
    起构成了 uboot 的版本号。例如,当前的 uboot 版本号就是 2016.03 EXTRAVERSION 是附加
    版本信息, NAME 是和名字有关的,一般不使用这两个。

    2.   MAKEFLAGS 变量

    涉及 MAKEFLAGS变量的内容如下:

    20 MAKEFLAGS += -rR --include-dir=$(CURDIR)
    上述代码使用 += 来给变量 MAKEFLAGS 追加了一些值,“-rR 表示禁止使用内置的隐含规则和变量定义,“ --include-dir 指明搜索路径, “$(CURDIR)” 表示当前目录。
    make 是支持递归调用的。 假如,在当前目录下存在一个“ subdir ”子目录,这个 子目录中又有其对应的 Makefile 文件,那么这个工程在编译的时候其主目录中的 Makefile 就可 以调用子目录中的 Makefile ,以此来完成所有子目录的编译。

    3.   命令输出与静默输出

    命令输出

    uboot 默认编译是不会在终端中显示完整的命令,都是短命令。
    注意:使用 "make"命令可以编译 uboot的前提是,已经对 uboot进行了配置工作(即执行了 make xxx_defconfig)。
    使用 "make" 命令编译 uboot时如下所示:
    1. wangtian@wangtian-virtual-machine:~/zhengdian_Linux/linux/uboot/alientek_uboot/uboot-imx-rel_imx_4.1.15_2.1.0_ga_alientek$ make
    2. CLEAN examples/standalone
    3. CLEAN tools
    4. CLEAN tools/lib tools/common
    5. CLEAN include/bmp_logo.h include/bmp_logo_data.h u-boot-nodtb.bin u-boot.lds u-boot.map u-boot.bin u-boot.cfg u-boot.srec u-boot u-boot.imx u-boot.sym System.map
    在使用  "make" 命令编译 uboot源码时,通过设置变量 " V=1 ",可以实现完整的命令输出,这个在调试 uboot 的时候很有用。操作如下:

    wangtian@wangtian-virtual-machine:~/zhengdian_Linux/linux/uboot/alientek_uboot/uboot-imx-rel_imx_4.1.15_2.1.0_ga_alientek$ make V=1
    make -f ./Makefile silentoldconfig
    make -f ./scripts/Makefile.build obj=scripts/basic
    rm -f .tmp_quiet_recordmcount

    顶层 Makefile 中控制命令输出的代码如下:
    1. 73 ifeq ("$(origin V)", "command line")
    2. 74 KBUILD_VERBOSE = $(V)
    3. 75 endif
    4. 76 ifndef KBUILD_VERBOSE
    5. 77 KBUILD_VERBOSE = 0
    6. 78 endif
    7. 79
    8. 80 ifeq ($(KBUILD_VERBOSE),1)
    9. 81 quiet =
    10. 82 Q =
    11. 83 else
    12. 84 quiet=quiet_
    13. 85 Q = @
    14. 86 endif

    静默输出

    如果在编译 uboot时 不需要输出命令, 就可以使用 uboot 的静默输出功能。编译时使用 make -s 命令即可实现静默输出。 顶层 Makefile 中相应的代码如下:
    1. 88 # If the user is running make -s (silent mode), suppress echoing of
    2. 89 # commands
    3. 90
    4. 91 ifneq ($(filter 4.%,$(MAKE_VERSION)),) # make-4
    5. 92 ifneq ($(filter %s ,$(firstword x$(MAKEFLAGS))),)
    6. 93 quiet=silent_
    7. 94 endif
    8. 95 else # make-3.8x
    9. 96 ifneq ($(filter s% -s%,$(MAKEFLAGS)),)
    10. 97 quiet=silent_
    11. 98 endif
    12. 99 endif
    13. 100
    14. 101 export quiet Q KBUILD_VERBOSE

    4.  设置编译结果输出目录

    uboot 可以将编译出来的目标文件输出到单独的目录中,在 make 的时候使用“ O ”来指定
    输出目录,比如“ make O=out ”就是设置目标文件输出到 out 目录中。
    这么做是为了将源文件 和编译产生的文件分开,当然也可以不指定 O 参数,不指定的话源文件和编译产生的文件都在同一个目录内。 一般我们不指定 O 参数。
    顶层 Makefile 中相关的代码如下:
    1. 120 ifeq ($(KBUILD_SRC),)
    2. 121
    3. 122 # OK, Make called in directory where kernel src resides
    4. 123 # Do we want to locate output files in a separate directory?
    5. 124 ifeq ("$(origin O)", "command line")
    6. 125 KBUILD_OUTPUT := $(O)
    7. 126 endif
    8. 127
    9. 128 # That's our default target when none is given on the command line
    10. 129 PHONY := _all
    11. 130 _all:
    12. 131
    13. 132 # Cancel implicit rules on top Makefile
    14. 133 $(CURDIR)/Makefile Makefile: ;
    15. 134
    16. 135 ifneq ($(KBUILD_OUTPUT),)
    17. 136 # Invoke a second make in the output directory, passing relevant
    18. variables
    19. 137 # check that the output directory actually exists
    20. 138 saved-output := $(KBUILD_OUTPUT)
    21. 139 KBUILD_OUTPUT := $(shell mkdir -p $(KBUILD_OUTPUT) && cd
    22. $(KBUILD_OUTPUT) \
    23. 140 && /bin/pwd)
    24. ......
    25. 155 endif # ifneq ($(KBUILD_OUTPUT),)
    26. 156 endif # ifeq ($(KBUILD_SRC),)

    124 行判断“ O ”是否来自于命令行,如果来自命令行的话条件成立, KBUILD_OUTPUT
    就为 $(O) ,因此变量 KBUILD_OUTPUT 就是输出目录。
    135 行判断 KBUILD_OUTPUT 是否为空。
    139 行调用 mkdir 命令,创建 KBUILD_OUTPUT 目录,并且将创建成功以后的绝对路
    径赋值给 KBUILD_OUTPUT 。至此,通过 O 指定的输出目录就存在了。

    下一篇文章继续了解uboot源码的顶层 Makefile前期所做的内容。


  • 相关阅读:
    matlab学习笔记(五)
    智源联合多所高校推出首个多任务长视频评测基准MLVU
    Python文件处理V——Excel文件处理
    记录el-input使用原生JS事件修改值data后v-model值不同步问题
    Pinia实操配置,Vuex的替代品
    86、移除推理路径上的所有内存操作
    万界星空科技/生产制造管理MES系统/开源MES/免费MES
    架构细节大揭秘,Stable Diffusion 3 论文技术解析!
    TinyPNG和Optimize.js区别?
    基于H5的旅游攻略平台设计与实现
  • 原文地址:https://blog.csdn.net/wojiaxiaohuang2014/article/details/132725434