重庆网站建设加q.479185700,搜索引擎营销ppt,抖音代运营一般收费,哪个地方网站建设的公司多Makefile学习笔记15|u-boot顶层Makefile01 希望看到这篇文章的朋友能在评论区留下宝贵的建议来让我们共同成长#xff0c;谢谢。 这里是目录
版本号信息
# SPDX-License-Identifier: GPL-2.0VERSION 2024
PATCHLEVEL 01
SUBLEVEL
EXTRAVERSION -rc4
NAME 这里定义了u-bo…Makefile学习笔记15|u-boot顶层Makefile01 希望看到这篇文章的朋友能在评论区留下宝贵的建议来让我们共同成长谢谢。 这里是目录
版本号信息
# SPDX-License-Identifier: GPL-2.0VERSION 2024
PATCHLEVEL 01
SUBLEVEL
EXTRAVERSION -rc4
NAME 这里定义了u-boot的版本信息。
make行为控制
# *DOCUMENTATION*
# To see a list of typical targets execute make help
# More info can be located in ./README
# Comments in this file are targeted only to the developer, do not
# expect to learn how to build the kernel reading this file.# Do not use makes built-in rules and variables
# (this increases performance and avoids hard-to-debug behaviour)
MAKEFLAGS -rR 前面的注释中说该文件中的注释仅针对开发人员不要指望通过阅读该文件来学习如何构建内核。那我们学一下Makefile不过分吧。 在 Makefile 中设置 MAKEFLAGS -rR 是控制 make 工具行为的一种方式。具体来说-r 和 -R 这两个标志的含义如下
-r或 --no-builtin-rules 这个选项会禁止 make 使用内置的隐含规则。隐含规则是 make 用来构建文件但未在 Makefile 中明确定义的一组默认规则。例如make 有一个隐含规则知道如何将 .c 文件编译成 .o 文件。禁用内置规则可以避免一些意外的构建行为并且可以在某些情况下提高 make 的执行性能。-R或 --no-builtin-variables 这个选项禁止 make 使用内置的变量集合这些变量可能会影响那些依赖隐含规则的命令。例如CFLAGS 是 make 中一个影响 C 编译器行为的内置变量。在 Makefile 中禁用内置变量是为了确保构建环境的清晰和可控性并避免 Makefile 行为的不确定性。 将这两个选项合在一起使用可以确保 Makefile 中的构建规则和变量不受 make 内置规则和变量的任何潜在干扰。这在大型、复杂的构建系统中可能很有用其中你希望对构建过程有完全的控制同时减少构建过程的不必要干预和潜在的性能影响。 确切的说MAKEFLAGS 是一个环境变量它允许你为 make 设置多个启动选项。在Makefile文件中通过 MAKEFLAGS 变量追加 -rR 选项可以使这些选项在调用 make 时自动应用于当前构建。 在你自己的项目中使用时请确保你完全理解了禁止这些内置规则和变量的含义以及它们对你的构建系统可能产生的影响。如果你依赖了默认的规则或变量禁用它们可能会导致构建失败因此在某些项目中可能需要保留这些内置规则和变量。
确定目标架构
# Determine target architecture for the sandbox
include include/host_arch.h
ifeq (, $(CROSS_COMPILE))MK_ARCH${shell uname -m}
elseMK_ARCH${shell echo $(CROSS_COMPILE) | sed -n s/^[[:space:]]*\([^\/]*\/\)*\([^-]*\)-[^[:space:]]*/\2/p}
endif
unexport HOST_ARCH
ifeq (x86_64, $(MK_ARCH))export HOST_ARCH$(HOST_ARCH_X86_64)
else ifneq (,$(findstring $(MK_ARCH), i386 i486 i586 i686))export HOST_ARCH$(HOST_ARCH_X86)
else ifneq (,$(findstring $(MK_ARCH), aarch64 armv8l))export HOST_ARCH$(HOST_ARCH_AARCH64)
else ifneq (,$(findstring $(MK_ARCH), arm armv7 armv7a armv7l))export HOST_ARCH$(HOST_ARCH_ARM)
else ifeq (riscv32, $(MK_ARCH))export HOST_ARCH$(HOST_ARCH_RISCV32)
else ifeq (riscv64, $(MK_ARCH))export HOST_ARCH$(HOST_ARCH_RISCV64)
endif
undefine MK_ARCH在交叉编译环境中CROSS_COMPILE 是一个常用的变量它指定了编译器的前缀使得我们能够为不同于编译宿主机的目标架构构建软件。这在嵌入式系统开发中很常见因为编译的代码需要在如 ARM、MIPS 或 AVR 这样的架构上运行而开发者通常在 x86 或 x86-64 架构的机器上进行开发。 例如如果你的开发系统是基于 x86 架构的而你的目标系统是基于 ARM 架构的那么你需要使用 ARM 架构的交叉编译器来编译你的代码。这样生成的可执行文件才能在 ARM 目标机上运行。 CROSS_COMPILE 变量通常用于 Makefile 中。它是编译器命令的前缀所有必要的工具如编译器 gcc、链接器 ld、汇编器 as 和其他工具都使用这个前缀。 例如如果 ARM 交叉编译器的命令是 arm-none-eabi-gcc那么 CROSS_COMPILE 应该设置为 arm-none-eabi-以此类推。下面是 CROSS_COMPILE 在Makefile中的常见用法
# 设置交叉编译器前缀
CROSS_COMPILEarm-linux-gnueabihf-# 之后使用变量时
CC$(CROSS_COMPILE)gcc
LD$(CROSS_COMPILE)ld
AS$(CROSS_COMPILE)as# 其他编译规则和目标...字符集设置
# Avoid funny character set dependencies
unexport LC_ALL
LC_COLLATEC
LC_NUMERICC
export LC_COLLATE LC_NUMERIC# Avoid interference with shell env settings
unexport GREP_OPTIONS这段脚本通常出现在 Unix-like 系统的 Makefile 中它的目的是确保 Makefile 中的操作对于本地化设置及字符集是独立的。本地化设置可能会影响字符串的比较排序和数字的表示方式。为了避免这些依赖通常在 Makefile 或构建脚本中设置特定的环境变量使得这些操作更可预测具有一致性避免构建过程中由于不同的本地化设置引起的问题。
LC_ALL 是一个强制性的环境变量用于设置 C 库的本地化配置它会覆盖所有其他本地化设置包括 LC_COLLATE, LC_NUMERIC, 以及其他 LC_* 类型的变量。LC_COLLATE 定义了字符串比较和排序的规则。设置为 C 可确保文件名和字符串的比较是基于字节值进行的而不受根据地区的字母顺序影响。LC_NUMERIC 影响数字的格式化方式比如数字分隔符。例如在某些本地化设置中小数点用逗号 ‘,’ 表示。设置为 C 可以确保小数点始终使用点 ‘.’以符合大多数编程语言和脚本的期望。 当我们确保 LC_COLLATE 和 LC_NUMERIC 是 C或 POSIX它们是等效的时您可以让构建过程在所有环境中提供一致的行为避免由于不同的语言或地区设置而造成的问题。这可以提高 Makefile 的可移植性和健壮性。 对于最后一行当在脚本或者 Makefile 中使用 grep不同用户的不同 GREP_OPTIONS 设置可能会结果不一致尤其是当这个脚本依赖于 grep 输出特定格式时。为了确保 grep 的行为是预期并且一致的开发者通常会选择清除 GREP_OPTIONS 环境变量。
美化输出
# Beautify output
# ---------------------------------------------------------------------------
#
# Normally, we echo the whole command before executing it. By making
# that echo $($(quiet)$(cmd)), we now have the possibility to set
# $(quiet) to choose other forms of output instead, e.g.
#
# quiet_cmd_cc_o_c Compiling $(RELDIR)/$
# cmd_cc_o_c $(CC) $(c_flags) -c -o $ $
#
# If $(quiet) is empty, the whole command will be printed.
# If it is set to quiet_, only the short version will be printed.
# If it is set to silent_, nothing will be printed at all, since
# the variable $(silent_cmd_cc_o_c) doesnt exist.
#
# A simple variant is to prefix commands with $(Q) - thats useful
# for commands that shall be hidden in non-verbose mode.
#
# $(Q)ln $ :
#
# If KBUILD_VERBOSE equals 0 then the above command will be hidden.
# If KBUILD_VERBOSE equals 1 then the above command is displayed.
#
# To put more focus on warnings, be less verbose as default
# Use make V1 to see the full commandsifeq ($(origin V), command line)KBUILD_VERBOSE $(V)
endif
ifndef KBUILD_VERBOSEKBUILD_VERBOSE 0
endififeq ($(KBUILD_VERBOSE),1)quiet Q
elsequietquiet_Q
endif# If the user is running make -s (silent mode), suppress echoing of
# commandsifneq ($(filter 4.%,$(MAKE_VERSION)),) # make-4
ifneq ($(filter %s ,$(firstword x$(MAKEFLAGS))),)quietsilent_
endif
else # make-3.8x
ifneq ($(filter s% -s%,$(MAKEFLAGS)),)quietsilent_
endif
endifexport quiet Q KBUILD_VERBOSE它提供了一种灵活的机制用于控制命令执行时输出信息的格式。这种机制让构建系统如内核能够以不同的详细级别显示或隐藏命令的输出。
设置输出参数 命令行变量 V允许你通过在 make 命令后添加 V1 参数来开启详细模式例如make V1。设置 KBUILD_VERBOSE根据 V 变量的值设置 KBUILD_VERBOSE用于决定输出模式是详细 (1) 还是简洁 (0)。定义 quiet 和 Q利用 KBUILD_VERBOSE 变量这段设置定义了两个控制输出的变量 quiet 和 Q。当 KBUILD_VERBOSE 是 1详细模式Q 是空字符串这意味着所有命令都会显示。如果是 0简洁模式Q 被设置为 这表示 Makefile 中以 $(Q) 开头的命令将不显示。 控制命令输出 命令输出前缀使用 $(quiet) 作为前缀可以使得 make 在执行命令时不显示整个命令而是显示一个简短的描述例如“Compiling foo/bar.o”。静默模式检测根据 Make 的版本脚本检查 MAKEFLAGS 是否包含静默模式标志 s。如果用户使用了 make -s则所有命令执行将不输出任何信息因为 quiet 变量将被设置为 silent_。 这个复杂的控制机制最终目的是为开发者提供一个在需要时能够详细打印每一个命令执行的构建过程有助于调试而在常规构建时则显示简化或没有输出。这使得构建输出更易于阅读并能在需要解决问题时提供足够的信息。 都看到这里了可以给个点赞或者评论吗达瓦里希(^)ゞ