[驱动开发笔记]第28章 U-Boot顶层Makefile详解

发布时间 2023-12-01 00:19:18作者: 终末之诗EndPoem_ZH

[驱动开发笔记]第28章 U-Boot顶层Makefile详解

28.1 U-Boot工程目录分析

文件夹post的含义是上电自检(Power On Self Test)。

1. arch文件夹

存放与架构有关的文件。我们需要关注arch/arm/imx-common文件夹和arch/cpu/armv7文件夹。

arch/cpu/u-boot.lds是链接脚本文件,也需要关注。

2. board文件夹

与具体板子相关的文件夹。需要关注board/freescale/mx6ullevk文件夹。

3. configs文件夹

需要关注mx6ull_14x14_ddr512_emmc_defconfig文件。

在编译uboot之前即需要使用defconfig来配置uboot。之前27章编译脚本中就有make ... mx6ull_14x14_ddr512_emmc_defconfig(参数省略)。

辨析make defconfig、make menuconfig、make savedefconfig:

make defconfig:由xxx_defconfig文件生成.config文件。
make menuconfig:基于图形化界面,由.config进行配置。
make savedefconfig:由.config文件生成xxx_defconfig文件。
make olddefconfig:备份旧的.config为.config.old,生成新的.config。

4. .u-boot.xxx_cmd

编译生成的命令文件。举例:

文件 作用
.u-boot.bin.cmd 由u-boot-nodtb.bin生成u-boot.bin
.u-boot-nodtb.bin.cmd 将ELF格式的u-boot文件转为u-boot-nodtb.bin

5. Makefile

6. u-boot.xxx

7. .config

编译生成的uboot配置文件,由xxx_defconfig文件生成。

注:P456 “相当于通过“CONFIG_CMD_BOOTD=y”来使能”有错误,应为“CONFIG_CMD_BOOTM=y”。

README

uboot的详细信息。

注:错别字:“建议大家详细的阅读此文件”,“的”应为“地”。

28.2 VSCode工程创建

屏蔽文件夹的显示和搜索:只需在VSCode中打开文件夹,通过“将当前工作区另存为...”为根目录添加一个.code-workspace文件,然后新建.vscode文件夹,添加settings.json文件,在其中写入需要屏蔽的文件夹即可。settings.json全部内容参考链接

屏蔽之后文件夹显示非常清爽,值得推广。

28.3 U-Boot 顶层Makefile分析

28.3.2 MAKEFLAGS

export <variable>:导出变量给子make。
unexport <variable>:不导出变量给子make。

28.3.3 命令完整输出

make V=1即可在编译时显示完整命令。默认输出短命令(V=0)。

user@zh-ubuntu:~$ make  # 默认短命令
  CHK     include/config/uboot.release
  CC      lib/asm-offsets.s
  ...

user@zh-ubuntu:~$ make V=1  # 显示完整命令
set -e; : '  CHK     include/config/uboot.release'; mkdir -p include/config/;
echo "2016.03$(/bin/bash ./scripts/setlocalversion .)" < include/config/auto.conf > include/config/uboot.release.tmp;...

Makefile函数 origin:$ (origin <variable>),返回变量来源。

28.3.4 命令静默输出

make -s即可在编译时不输出信息。
在Makefile中,命令前加@即不输出。

Makefile函数

  1. filter:$ (filter <pattern...>, <text>),以pattern模式过滤text,返回符合pattern的字符串。
  2. firstword:$ (firstword <text>),获取字符串的首个单词。

28.3.5 设置编译结果输出目录

make O=output即可将编译结果输出到output目录,默认输出到当前目录。

28.3.6 代码检查

make C=1检查需要重新编译的文件。
make C=2检查所有源码文件。

28.3.7 单独编译某个模块

make M=dir单独编译某个模块。

28.3.8 获取主机架构和系统

指令uname -m,输出x86_64
指令uname -s,输出Linux
指令uname -a,可显示全部操作系统信息。

28.3.9 设置目标架构、交叉编译器和配置文件

编译时需要设置目标板架构和交叉编译器:

make ARCH=arm CORSS_COMPILE=arm-linux-gnueabihf-

可将ARCH和CROSS_COMPILE变量写入顶层Makefile,从而不用每次编译时输入上述参数。

条件赋值?=:只有当未定义或为空时才赋值,已有值则不再赋值。

28.3.10 调用scripts/Kbuild.include

28.3.12 导出其他设置

顶层Makefile会使用export导出大量变量,许多变量在Makefile中有,但下面7个变量是在config.mk中定义的:ARCH CPU BOARD VENDOR SOC CPUDIR BOARDDIR

28.3.13 make xxx_defconfig过程

28.3.14 Makefile.build脚本分析

总结make xxx_defconfig流程 P482

28.3.15 make过程

总结make流程 P489