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 变量功能
变量导出功能
基本认识了编译变量