分析u-boot的Makefile
2025-02-17 来源:cnblogs
这里分析三星s5pv210芯片官方u-boot
先看u-boot 版本号
VERSION = 1 #主版本号
PATCHLEVEL = 3 #次版本号
SUBLEVEL = 4 # 修改正版本号
EXTRAVERSION = # 拓展版本号
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
VERSION_FILE = $(obj)include/version_autogenerated.h
1 HOSTARCH := $(shell uname -m | # 将uname -m 结果通过管道传输到 sed 如果传输过来的是i686的话
2 sed -e s/i.86/i386/ # sed -e s/i.86/i386/ 意思是用 sed 将i.86这些内容替换成i386
. 的意思是匹配任意字符 i.86就是说匹配i为前缀 86为后缀中间任意字符
3 -e s/sun4u/sparc64/
4 -e s/arm.*/arm/
5 -e s/sa110/arm/
6 -e s/powerpc/ppc/
7 -e s/ppc64/ppc/
8 -e s/macppc/ppc/)
i686 是Ubantu 的CPU架构
然后讲下针对特定平台设置。
smdkv210single_config : unconfig
$1(将_config字符去掉) $2 $3 $4 $5 $6
@$(MKCONFIG) $(@:_config=) arm s5pc11x smdkc110 samsung s5pc110
#将参数n $0 smdk210single ($2:arm) $3 s5pc11x $4 smdkc110 $5 samsung $6 s5pc110 传入至顶层目录下的mkconfig.mk文件
@echo 'TEXT_BASE = 0xc3e00000' > $(obj)board/samsung/smdkc110/config.mk
判断该目录下有无config.mk文件,有就包含改头文件,并输出 config.mk下的 ARCH(编译平台) CPU BOARD VENDOR SOC这些变量信息
1 feq ($(obj)include/config.mk,$(wildcard $(obj)include/config.mk)) wildcard函数是将展开所有符合起指定参数的文件名(指定参数为include/config.mk)
2
3 # load ARCH, BOARD, and CPU configuration
4 include $(obj)include/config.mk
5 export ARCH CPU BOARD VENDOR SOC // arm s5pc11x smdkc110 samsung s5pc110 由.mk配置文件可知
所要查找的config.mk 文件如下所示:(目录为:顶层目录下include/config.mk)

下面开始分析ARCH CPU BOARD 这些变量,对接下来编译的作用。
ifndef CROSS_COMPILE
ifeq ($(HOSTARCH),$(ARCH))
CROSS_COMPILE =
else
ifeq ($(ARCH),ppc)
CROSS_COMPILE = ppc_8xx-
endif
ifeq ($(ARCH),arm) 判断ARCH 和arm 是否一样,有上面可知,在配置上面的步骤后是一样的。
#CROSS_COMPILE = arm-linux-
#CROSS_COMPILE = /usr/local/arm/4.4.1-eabi-cortex-a8/usr/bin/arm-linux-
#CROSS_COMPILE = /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-
CROSS_COMPILE = /home/gec/arm-2009q3/bin/arm-none-linux-gnueabi- #指定编译工具路径
endif
# load other configuration
include $(TOPDIR)/config.mk #包含顶层config.mk文件,这个文件定义了交叉编译器即选项和编译规则
#告诉了我们的Makefile OBJS依赖的目标文件是顶层目录下的cpu/s5pc11x/start.0
OBJS = cpu/$(CPU)/start.o // cpu/s5pc11x/start.o
#如果存在 board/samsung/common/Makefile 这个文件 就输出当前所依赖库文件的名字
LIBS = lib_generic/libgeneric.a #指定相应库文件
LIBS += $(shell if [ -f board/$(VENDOR)/common/Makefile ]; then echo
'board/$(VENDOR)/common/lib$(VENDOR).a'; fi)
LIBS += cpu/$(CPU)/lib$(CPU).a #指定相应库文件
1 ALL += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND) $(U_BOOT_ONENAND) $(obj)u-boot.dis
2 ifeq ($(ARCH),blackfin)
3 ALL += $(obj)u-boot.ldr
4 endif
5
6 all: $(ALL) # all 依赖于$(ALL)
7
8 $(obj)u-boot.hex: $(obj)u-boot
9 $(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@
10
11 $(obj)u-boot.srec: $(obj)u-boot
12 $(OBJCOPY) ${OBJCFLAGS} -O srec $< $@
13
14 $(obj)u-boot.bin: $(obj)u-boot #转换成.bin格式
15 $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
16
17 $(obj)u-boot.ldr: $(obj)u-boot
18 $(LDR) -T $(CONFIG_BFIN_CPU) -f -c $@ $< $(LDR_FLAGS)
19
20 $(obj)u-boot.ldr.hex: $(obj)u-boot.ldr
21 $(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@ -I binary
22
23 $(obj)u-boot.ldr.srec: $(obj)u-boot.ldr
24 $(OBJCOPY) ${OBJCFLAGS} -O srec $< $@ -I binary
25
26 $(obj)u-boot.img: $(obj)u-boot.bin #生成u-boot.img
27 ./tools/mkimage -A $(ARCH) -T firmware -C none
28 -a $(TEXT_BASE) -e 0
29 -n $(shell sed -n -e 's/.*U_BOOT_VERSION//p' $(VERSION_FILE) |
30 sed -e 's/'[ ]*$$/ for $(BOARD) board'/')
31 -d $< $@
32
33 $(obj)u-boot.sha1: $(obj)u-boot.bin
34 $(obj)tools/ubsha1 $(obj)u-boot.bin
35
36 $(obj)u-boot.dis: $(obj)u-boot #生成反汇编代码 .dis 文件
37 $(OBJDUMP) -d $< > $@
38
39 $(obj)u-boot: depend $(SUBDIRS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT)
40 UNDEF_SYM=`$(OBJDUMP) -x $(LIBBOARD) $(LIBS) |
41 sed -n -e 's/.*($(SYM_PREFIX)__u_boot_cmd_.*)/-u1/p'|sort|uniq`;
42 cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS)
43 --start-group $(__LIBS) --end-group $(PLATFORM_LIBS)
44 -Map u-boot.map -o u-boot
这里说一下顶层目录下mkconfig.mk文件的作用:
1. 创建include/config.mk文件
#
# Create include file for Make
#
echo 'ARCH = $2' > config.mk
echo 'CPU = $3' >> config.mk
echo 'BOARD = $4' >> config.mk
并将相关信息输出到config.mk文件
2. 创建开发板相关头文件
echo '/* Automatically generated - do not edit */' >>config.h
echo '#include
上一篇:创建一个字符设备1.2
下一篇:4、移植三星官方内核
- 【IMX6ULL学习笔记】三、U-BOOT Makefile详解
- 【IMX6ULL学习笔记】五、U-BOOT移植与解析
- 【IMX6ULL学习笔记】六、U-BOOT环境变量与Linux启动
- [国嵌笔记][028][Bootloader设计蓝图]
- IMX6ULL学习笔记(5)——获取和编译U-Boot
- IMX6ULL学习笔记(6)——通过USB OTG烧录U-Boot(MfgTool工具)
- IMX6ULL学习笔记(7)——通过SD卡启动U-Boot
- [国嵌笔记][030][U-Boot工作流程分析]
- Tiny210 U-BOOT(二)----配置时钟频率基本原理
- 嵌入式C开发环境构建指南:工具链配置、Makefile编写与调试实战
- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 有源晶振与无源晶振的六大区别详解
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 蓝牙信道探测技术原理与开发套件实践
- Microchip 推出生产就绪型全栈边缘 AI 解决方案,赋能MCU和MPU实现 智能实时决策
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析




