[驱动开发笔记]第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函数
- filter:
$ (filter <pattern...>, <text>)
,以pattern模式过滤text,返回符合pattern的字符串。 - 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