makefile_分析_变量

变量分析

本章节带你分析变量

为什么要分析变量

编译 uboot 前
必须设置 ARCH CROSS_COMPILE 变量
你可以不知道变量具体的调用
但是你必须知道变量设置意味着什么
否则会出现编译错误

ARCH 分析

ARCH 字面意思是架构
分析 Makefile 才能知道真实含义

# When performing cross compilation for other architectures ARCH shall be set
# to the target architecture. (See arch/* for the possibilities).
# ARCH can be set during invocation of make:
# make ARCH=ia64
# Another way is to have ARCH set in the environment.
# The default ARCH is the host where make is executed.
ARCH ?= $(SUBARCH)
# 文档描述说得很清楚  
# ARCH 用于在交叉编译时设置目标架构
# arch/ 子目录名称就是可选的变量值(例: arm x86 riscv sandbox)
# ARCH 值可以作为参数传入
# 例: make ARCH=arm
# 也可以在 shell 设置环境变量
# 例: export ARCH=arm
# 如果不设置 ARCH 值
# 默认是当前设备架构

CROSS_COMPILE 分析

CROSS_COMPILE 字面意思是交叉编译
分析 Makefile 才能知道真实含义

AS		= $(CROSS_COMPILE)as
LD		= $(CROSS_COMPILE)ld
CC		= $(CROSS_COMPILE)gcc
CPP		= $(CC) -E
AR		= $(CROSS_COMPILE)ar
NM		= $(CROSS_COMPILE)nm
LDR		= $(CROSS_COMPILE)ldr
STRIP		= $(CROSS_COMPILE)strip
OBJCOPY		= $(CROSS_COMPILE)objcopy
OBJDUMP		= $(CROSS_COMPILE)objdump
READELF		= $(CROSS_COMPILE)readelf
# 不难看出
# CROSS_COMPILE 是交叉编译工具前缀
# CROSS_COMPILE 可以设置多种架构的 gcc 前缀
# 如果你要编译 arm64
# CROSS_COMPILE 可以设置为 arm-linux-gnueabi-
# 如果你要编译 arm32
# CROSS_COMPILE 可以设置为 arm-linux-gnueabihf-
# CROSS_COMPILE 设置方式和 ARCH 一致

变量导出

uboot 大量使用递归调用
实现顶层 makefile 控制子级 makefile
但是 gnu_make 默认禁止递归调用共享变量
子级 makefile 又必须共享 ARCH CROSS_COMPILE 这些变量
怎解解决?
使用变量导出
变量导出可以实现递归调用共享变量

export ARCH SRCARCH CONFIG_SHELL BASH HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE AS LD CC
export CPP AR NM STRIP OBJCOPY OBJDUMP KBUILD_HOSTLDFLAGS KBUILD_HOSTLDLIBS
# export 是变量导出关键字
# ARCH CROSS_COMPILE AS 这些变量被导出了
# 递归调用子级 makefile 可以共享变量

总结

本章节分析了
ARCH CROSS_COMPILE 变量功能
变量导出功能
基本认识了编译变量

菜单

posted @ 2026-09-28 15:28  宋嘉琪  阅读(1)  评论(0)    收藏  举报