Makefile学习笔记19|u-boot顶层Makefile05

Makefile学习笔记19|u-boot顶层Makefile05

  希望看到这篇文章的朋友能在评论区留下宝贵的建议来让我们共同成长,谢谢。

  这里是目录

定义常见构建工具变量

# Make variables (CC, etc...)

AS		= $(CROSS_COMPILE)as
# Always use GNU ld
ifneq ($(shell $(CROSS_COMPILE)ld.bfd -v 2> /dev/null),)
LD		= $(CROSS_COMPILE)ld.bfd
else
LD		= $(CROSS_COMPILE)ld
endif
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
LEX		= flex
YACC		= bison
AWK		= awk
PERL		= perl
PYTHON		?= python
PYTHON2		= python2
PYTHON3		?= python3

  这段代码很平凡,就是定义常见构建工具变量。首先尝试使用 GNU 的 ld.bfd,如果找不到,回落到标准的 ld。BFD (Binary File Descriptor) 是 ld 的一个后端,通常提供更多的功能和选项。

工具和编译器/链接器标志

# The devicetree compiler and pylibfdt are automatically built unless DTC is
# provided. If DTC is provided, it is assumed the pylibfdt is available too.
DTC_INTREE	:= $(objtree)/scripts/dtc/dtc
DTC		?= $(DTC_INTREE)
DTC_MIN_VERSION	:= 010406

CHECK		= sparse

CHECKFLAGS     := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \
		  -Wbitwise -Wno-return-void -Wno-unknown-attribute \
		  -D__CHECK_ENDIAN__ $(CF)

KBUILD_CPPFLAGS := -D__KERNEL__ -D__UBOOT__

KBUILD_CFLAGS   := -Wall -Wstrict-prototypes \
		   -Wno-format-security \
		   -fno-builtin -ffreestanding $(CSTD_FLAG)
KBUILD_CFLAGS	+= -fshort-wchar -fno-strict-aliasing
KBUILD_AFLAGS   := -D__ASSEMBLY__
KBUILD_LDFLAGS  :=
  1. DTC (Device Tree Compiler):

DTC_INTREE 变量指向内部构建树中 Device Tree Compiler 的路径。U-Boot 使用 DTC 来编译设备树源文件(.dts)为设备树二进制文件(.dtb)。
DTC 变量如果未赋值,则默认使用内部构建树中的 DTC。可以通过设定环境变量 DTC 来覆盖此设置,使用外部预先安装的 DTC。
DTC_MIN_VERSION 定义了 U-Boot 构建过程需要的最低 DTC 版本。

  1. CHECK (Sparse):

CHECK 变量指向 sparse,这是一个用于进行源代码静态分析检查的工具。它可以检查内核代码,找出潜在的问题。

  1. CHECKFLAGS:

CHECKFLAGS 定义了传递给 sparse 的标志。这包括定义某些预处理器宏以及启用特定的警告。

  1. KBUILD_CPPFLAGS:

KBUILD_CPPFLAGS 定义了传递给预处理器的公共标志。这包括 KERNEL 宏,它用于区分内核代码和用户空间代码,以及 U-Boot 特有的 UBOOT 宏。

  1. KBUILD_CFLAGS:

KBUILD_CFLAGS 定义了 C 编译器的公共标志。这包括启用所有警告标志 (-Wall),要求严格函数原型 (-Wstrict-prototypes),以及安全性相关的标志。
也包括 -fno-builtin(不把任何函数当做内建函数优化处理)和 -ffreestanding(指示编译器不假定程序的执行环境遵循标准库规范)。
增加了 -fshort-wchar(使得 wchar_t 数据类型为 16 位宽度)和 -fno-strict-aliasing(禁用严格的别名规则,允许某些优化)。

  1. KBUILD_AFLAGS:

KBUILD_AFLAGS 为汇编器定义了特定的标志,包括 ASSEMBLY 宏定义。

  整体而言,这些变量为 U-Boot 的构建环境提供了必要的配置信息,确保了编译过程的正确性和优化。它们被精心挑选和设定,以满足针对嵌入式环境的编译要求,例如对二进制大小和性能的考虑。在构建 U-Boot 时,这些变量将被 Makefile 使用,以确保生成的二进制能在目标硬件平台上正确运行。

定义变量

# Don't generate position independent code
KBUILD_CFLAGS	+= $(call cc-option,-fno-PIE)
KBUILD_AFLAGS	+= $(call cc-option,-fno-PIE)

# Read UBOOTRELEASE from include/config/uboot.release (if it exists)
UBOOTRELEASE = $(shell cat include/config/uboot.release 2> /dev/null)
UBOOTVERSION = $(VERSION)$(if $(PATCHLEVEL),.$(PATCHLEVEL)$(if $(SUBLEVEL),.$(SUBLEVEL)))$(EXTRAVERSION)

export VERSION PATCHLEVEL SUBLEVEL UBOOTRELEASE UBOOTVERSION
export ARCH CPU BOARD VENDOR SOC CPUDIR BOARDDIR
export CONFIG_SHELL HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE AS LD CC
export CPP AR NM LDR STRIP OBJCOPY OBJDUMP KBUILD_HOSTLDFLAGS KBUILD_HOSTLDLIBS
export MAKE LEX YACC AWK PERL PYTHON PYTHON2 PYTHON3
export HOSTCXX KBUILD_HOSTCXXFLAGS CHECK CHECKFLAGS DTC DTC_FLAGS

export KBUILD_CPPFLAGS NOSTDINC_FLAGS UBOOTINCLUDE OBJCOPYFLAGS KBUILD_LDFLAGS
export KBUILD_CFLAGS KBUILD_AFLAGS

export CC_VERSION_TEXT := $(shell $(CC) --version | head -n 1)
  1. KBUILD_CFLAGS 和 KBUILD_AFLAGS:

这些变量定义了编译器和汇编器的标志,用于 C 和汇编语言文件。这里特别禁用了生成位置无关代码(PIE,Position Independent Executable),增加 $(call cc-option,-fno-PIE) 旨在添加 -fno-PIE 选项,但仅当编译器支持这个选项时才会添加。

  1. UBOOTRELEASE 和 UBOOTVERSION:

UBOOTRELEASE 从 include/config/uboot.release 文件中读取 U-Boot 的发布版本号,如果该文件不存在则为空。
UBOOTVERSION 构建了一个版本字符串,它基于几个变量来确定 U-Boot 的完整版本。

  1. ARCH, CPU, BOARD 等变量:

这些变量定义了用于构建过程的多个系统和板级特定的信息。例如,ARCH 指定处理器架构,BOARD 指定了特定的开发板。

  1. CONFIG_SHELL, HOSTCC 等工具变量:

这些变量指向构建过程中使用的工具。CONFIG_SHELL 指定 shell,HOSTCC 指定宿主机上的 C 编译器,CROSS_COMPILE 指定交叉编译前缀,AS、LD 等变量指向汇编和链接工具。

  1. LEX, YACC, AWK 等解析工具:

用于在构建过程中处理文本文件和代码生成的工具和脚本语言的路径。

  1. CC_VERSION_TEXT:

此变量获取并存储正在使用的 C 编译器的版本字符串,它通过调用编译器的 --version 选项,并取结果的第一行实现。

  在 U-Boot 的构建系统中,这样的配置是用来确保构建可以在不同的环境和配置下正确执行。特别是当涉及到交叉编译或特定的硬件平台时,正确配置这些变量就显得格外重要。通过将它们导出为环境变量,U-Boot 的构建系统能够在整个项目目录范围内使用这些配置,保持构建的一致性并简化了子 Makefile 的编写。

定义find和tar的行为

# Files to ignore in find ... statements
export RCS_FIND_IGNORE := \( -name SCCS -o -name BitKeeper -o -name .svn -o    \
			  -name CVS -o -name .pc -o -name .hg -o -name .git \) \
			  -prune -o
export RCS_TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn \
			 --exclude CVS --exclude .pc --exclude .hg --exclude .git

export PYTHON_ENABLE
  1. RCS_FIND_IGNORE:

这个变量被设置为 find 命令中用于排除特定目录的参数。此处的目的是为了忽略一些版本控制系统(VCS)的目录,例如 SCCS, BitKeeper, .svn (Subversion), CVS, .pc, .hg (Mercurial), .git (Git)。

在 find 命令中,这些参数会让 find 忽略匹配的目录,并且不在它们之下搜索文件。这个 -prune 选项告知 find 忽略当前匹配的目录,-o 表示 “OR”,即如果目录被忽略,那么执行 -prune 的动作,否则继续其他操作。

  1. RCS_TAR_IGNORE:

类似于 RCS_FIND_IGNORE,这个变量包含 tar 命令的参数,用于在创建 tarball(如 .tar.gz 或 .tar.bz2 文件)时排除相同的版本控制目录。
这些 --exclude 选项告诉 tar 忽略具有这些名字的目录,避免将其打包进 tarball。

  1. PYTHON_ENABLE:

这个环境变量似乎没有在这段代码中被赋值,不过它的存在暗示着在其他地方可能会对其赋值。
一般来说,这样的变量可能用于在构建过程中激活或禁用与 Python 相关的一些功能。例如,它可能会用来决定是否包含 Python 脚本,或者是否需要特定版本的 Python 环境。

  这段代码定义了一组环境变量,这些变量用来忽略在 find 命令和打包(tar)步骤中不需要处理的目录。在 U-Boot 或其他需要过滤掉版本控制目录的项目中,这些设置非常有用。它们确保了在源代码树内搜索文件或打包时不会包括不必要的版本控制元数据,这是在发布源代码或构建二进制发布时通常想要避免的。根据需要设置 PYTHON_ENABLE 变量,则可能是因为构建系统有一部分是用 Python 编写的,或者构建步骤需要调用 Python 脚本,因此需要根据实际环境来启用或禁用相关功能。

  都看到这里了,可以给个点赞或者评论吗?达瓦里希( ̄^ ̄)ゞ

  • 22
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值